使用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实现的随机广告显示代码
Jun 14 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
php操作JSON格式数据的实现代码
Dec 24 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
php微信开发之谷歌测距
Jun 14 PHP
PHP抽象类基本用法示例
Dec 28 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 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结合表单实现一些简单功能的例子
2011/06/04 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
JS 表单验证大全
2011/11/23 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python解析中国天气网的天气数据
2014/03/21 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
python脚本实现验证码识别
2018/06/07 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
python做接口测试的必要性
2019/11/20 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
什么是Remote Module
2016/06/10 面试题
个人求职简历的自我评价
2013/10/19 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
2015年复活节活动总结
2015/02/27 职场文书
个人年终总结怎么写
2015/03/09 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
基于Redission的分布式锁实战
2022/08/14 Redis