使用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 相关文章推荐
967 个函式
Oct 09 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
PHP命名空间和自动加载类
Apr 03 PHP
利用PHP获取网站访客的所在地位置
Jan 18 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
Dec 06 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
Jun 12 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 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
Zend Framework入门知识点小结
2016/03/19 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
splice slice区别
2006/10/09 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
python类和函数中使用静态变量的方法
2015/05/09 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
两年的个人工作自我评价
2014/01/10 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
小学清明节活动方案
2014/03/08 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
SQL Server内存机制浅探
2022/04/06 SQL Server