使用Codeigniter重写insert的方法(推荐)


Posted in PHP onMarch 23, 2017

使用Codeiginter 框架插入数据时有唯一索引键值存在解决办法

对数据进行存储的时候,会有一些唯一索引的字段已经有值了,插入数据的时候会失败我们通常解决办法是先查询这个值是否存在,存在就跟新update,不存在就insert。以下是重写了Codeigniter 模型中的insert方法,极大的简化了步骤!

/**
 * 插入单条记录(Insert)
 *
 * @param array $params 插入字段及值数组
 * @param string $table 插入表名,未指定的场景插入主表
 * @param array $columns 插入表中所属字段名数组,若指定则按此进行过滤
 * @param array $updateColumns 若唯一键冲突时需要更新的列数组
 * @return mixed FALSE:没有插入的字段 int:插入记录id
 *
 * @throws \C_DB_Exception
 */
public function insert($params, $table = NULL, $columns = array(), $updateColumns = array())
{
  // 如果未指定表名,则认为对本Model层的主表进行操作
  if (empty($table)) {
    $table = $this->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('', $this->user_id, $sql, self::STATUS_DB_LOG);
  }
  // 取得插入ID返回
  $id = $this->db->insert_id();
  return $id;
}

如果直接写SQL还有一种语句

语法: INSERT INTO table VALUES () ON DUPLICATE KEY UPDATE row='$row'

举个例子:

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的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
怎么使 Mysql 数据同步
Oct 09 PHP
PHP中str_replace函数使用小结
Oct 11 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
PHP 时间日期操作实战
Aug 26 PHP
linux系统上支持php的 iconv()函数的方法
Oct 01 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
php 查找数组元素提高效率的方法详解
May 05 PHP
PHP如何读取由JavaScript设置的Cookie
Mar 22 #PHP
PHP实现随机生成水印图片功能
Mar 22 #PHP
php session的应用详细介绍
Mar 22 #PHP
php 开发中加密的几种方法总结
Mar 22 #PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 #PHP
详解Yii2.0 rules验证规则集合
Mar 21 #PHP
php连接mysql数据库
Mar 21 #PHP
You might like
学习使用curl采集curl使用方法
2012/01/11 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python中的异常处理学习笔记
2015/01/28 Python
python访问系统环境变量的方法
2015/04/29 Python
python字符串对其居中显示的方法
2015/07/11 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
python 实现识别图片上的数字
2019/07/30 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
任命书模板
2014/06/04 职场文书
社团活动总结报告
2014/06/27 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
音乐研修感悟
2015/11/18 职场文书
检讨书之工作不认真
2019/08/14 职场文书