使用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 向访客和爬虫显示不同的内容
Nov 09 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
Yii框架登录流程分析
Dec 03 PHP
PHP扩展开发入门教程
Feb 26 PHP
php简单日历函数
Oct 28 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 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
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
Javascript 刷新全集常用代码
2009/11/22 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
vuex的使用步骤
2021/01/06 Vue.js
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
python交易记录整合交易类详解
2019/07/03 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
餐饮收银员岗位职责
2014/02/07 职场文书
小班秋游活动方案
2014/02/22 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
社会发展项目建议书
2014/08/25 职场文书
课内比教学心得体会
2014/09/09 职场文书
2014年科协工作总结
2014/12/09 职场文书
金陵十三钗观后感
2015/06/04 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS