使用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在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
Smarty局部缓存的几种方法简介
Jun 17 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
PHP向浏览器输出内容的4个函数总结
Nov 17 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
深入浅出php socket编程
May 13 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
Apr 12 PHP
php实现留言板功能(会话控制)
May 23 PHP
PHP简单实现循环链表功能示例
Nov 10 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 PHP
PHP中用Trait封装单例模式的实现
Dec 18 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下使用SMTP发邮件的代码
2008/01/10 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
PHP基本语法总结
2014/09/06 PHP
php绘制一个扇形的方法
2015/01/24 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
python如何修改装饰器中参数
2018/03/20 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
python 自动重连wifi windows的方法
2018/12/18 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Python实现自动签到脚本功能
2020/08/20 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
车祸赔偿收入证明
2014/01/09 职场文书
行政助理的岗位职责
2014/02/18 职场文书
读书演讲主持词
2014/03/18 职场文书
大学生自我推荐信范文
2015/03/24 职场文书