使用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中实现图片的锐化
Oct 09 PHP
php foreach 使用&(与运算符)引用赋值要注意的问题
Feb 16 PHP
php快速url重写更新版[需php 5.30以上]
Apr 25 PHP
openPNE常用方法分享
Nov 29 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
Yii中render和renderPartial的区别
Sep 03 PHP
php创建session的方法实例详解
Jan 27 PHP
php轻松实现文件上传功能
Mar 03 PHP
php 数据结构之链表队列
Oct 17 PHP
php面试实现反射注入的详细方法
Sep 30 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
PHP number_format函数原理及实例解析
Jul 14 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
python九九乘法表的实例
2017/09/26 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
Python随机函数random()使用方法小结
2018/04/29 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
Python容器类型公共方法总结
2020/08/19 Python
基于Python实现粒子滤波效果
2020/12/01 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
质量工程师岗位职责
2013/11/16 职场文书
酒店实习个人鉴定
2013/12/07 职场文书
进步之星获奖感言
2014/02/22 职场文书
道路交通安全实施方案
2014/03/12 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
财务工作个人总结
2015/02/27 职场文书
面试通知邮件
2015/04/20 职场文书
质检员工作总结2015
2015/04/25 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
商业计划书范文
2019/04/24 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python