使用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 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
PHP中如何判断AJAX提交的数据
Feb 05 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
linux下安装php的memcached客户端
Aug 03 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
PHP解析RSS的方法
Mar 05 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
PHP共享内存用法实例分析
Feb 12 PHP
Yii实现复选框批量操作实例代码
Mar 15 PHP
详解php反序列化
Jun 10 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
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
domReady的实现案例
2016/11/23 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
举例讲解Python中的算数运算符的用法
2015/05/13 Python
TensorFlow变量管理详解
2018/03/10 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
党支部四风整改方案
2014/10/25 职场文书
政协委员个人总结
2015/03/03 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
python实现剪贴板的操作
2021/07/01 Python