使用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简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
PHP 导出Excel示例分享
Aug 18 PHP
php通过修改header强制图片下载的方法
Mar 24 PHP
php实现的mongodb操作类实例
Apr 03 PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 PHP
教大家制作简单的php日历
Nov 17 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
PHP 对接美团大众点评团购券(门票)的开发步骤
Apr 03 PHP
一文搞懂PHP中的抽象类和接口
May 25 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/07/05 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
Python中的两个内置模块介绍
2015/04/05 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
python 用struct模块解决黏包问题
2020/11/07 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
Java基础面试题
2014/07/19 面试题
大学军训感言400字
2014/03/11 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
失职检讨书大全
2015/01/26 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
python代码实现备忘录案例讲解
2021/07/26 Python
MySQL分区表管理命令汇总
2022/03/21 MySQL
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers