使用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 相关文章推荐
我的论坛源代码(八)
Oct 09 PHP
用DBSQL类加快开发MySQL数据库程序的速度
Oct 09 PHP
JS实现php的伪分页
May 25 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
Jun 27 PHP
ThinkPHP路由详解
Jul 27 PHP
PHP实现链式操作的原理详解
Sep 16 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 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 Studio 无法启动的问题解决方法
2008/12/04 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
mouse_on_title.js
2006/08/25 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
python Zmail模块简介与使用示例
2020/12/19 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
法学专业毕业实习自我鉴定2014
2014/09/27 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle