使用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 相关文章推荐
PHP+MySQL5.0中文乱码解决方法
Nov 20 PHP
PHP 全角转半角实现代码
May 16 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
async和DOM Script文件加载比较
Jul 20 PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 PHP
大家须知简单的php性能优化注意点
Jan 04 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
PHP实现根据数组的值进行分组的方法
Apr 20 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 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模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
Python语言进阶知识点总结
2019/05/28 Python
Pandas中resample方法详解
2019/07/02 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
Pytorch之保存读取模型实例
2019/12/30 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
工作自我评价分享
2013/12/01 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
社区交通安全实施方案
2014/03/22 职场文书
安全目标责任书
2014/07/22 职场文书
四风问题对照检查材料
2014/09/22 职场文书
罚站检讨书
2015/01/29 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
浅谈如何保证Mysql主从一致
2022/03/13 MySQL
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS