使用Codeiginter 框架插入数据时有唯一索引键值存在解决办法
对数据进行存储的时候,会有一些唯一索引的字段已经有值了,插入数据的时候会失败我们通常解决办法是先查询这个值是否存在,存在就跟新update,不存在就insert。以下是重写了Codeigniter 模型中的insert方法,极大的简化了步骤!
table;
$columns = $this->columns;
}
// 过滤掉不属于该表中的字段
if ( ! empty($columns)) {
foreach ($params as $column => $val) {
if (in_array($column,$columns)) {
$row[$column] = $val;
}
}
}
// 不过滤
else {
$row = $params;
}
// 没有插入字段,直接返回
if ( ! isset($row)) {
return FALSE;
}
// 保证创建时间、更新时间必须设置
if ( ! isset($row['create_at']) && in_array('create_at',$columns)) {
$this->load->helper('common_function');
$datetime = get_datetime();
$row['create_at'] = $datetime;
$row['update_at'] = $datetime;
}
// 封装sql文,过滤不安全因素
$sql = $this->db->insert_string($table,$row);
// 若唯一键冲突时需要更新的列数组,则再次封装sql文
if ( ! empty($updateColumns)) {
$updateValues = '';
foreach ($updateColumns as $updateColumn) {
if (isset($updateValues[0])) {
$updateValues .= ',';
}
$updateValues .= $updateColumn . '=VALUES(' . $updateColumn . ')';
}
$sql = $sql . ' ON DUPLICATE KEY UPDATE ' . $updateValues;
}
// sql执行
$query = $this->db->query($sql);
// sql执行失败,抛出异常
if (FALSE === $query) {
$code = $this->db->_error_number();
$msg = $this->db->_error_message();
C_log::Error($code . ':' . $msg,$this->user_id,$sql,self::STATUS_DB_LOG);
throw new C_DB_Exception('',C_DB_Exception::DB_ERR_CODE);
}
// sql文写入DB日志
if (LOG_UPDATE_sql) {
C_log::Info('',self::STATUS_DB_LOG);
}
// 取得插入ID返回
$id = $this->db->insert_id();
return $id;
}
如果直接写sql还有一种语句
语法:
INSERT INTO table VALUES () ON DUPLICATE KEY UPDATE row='$row'
举个例子:
PHP;">
INSERT INTO it_teacher (uid,name,qq,create_at)
VALUES ('$userid','$name','$qq',NOW()) ON DUPLICATE KEY UPDATE name='$name',qq='$qq',phone='$phone'";
以上这篇使用Codeigniter重写insert的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。
原文链接:https://www.f2er.com/php/17729.html