使用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程序的php代码
Apr 07 PHP
PHP定时自动生成静态HTML的实现代码
Jun 20 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
php跨站攻击实例分析
Oct 28 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
php简单获取复选框值的方法
May 11 PHP
PHP微信开发之有道翻译
Jun 23 PHP
简单实现php上传文件功能
Sep 21 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
laravel 框架配置404等异常页面
Jan 07 PHP
Laravel 自动生成验证的实例讲解:login / logout
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
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
python psutil模块使用方法解析
2019/08/01 Python
Python自带的IDE在哪里
2020/07/01 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
普通党员个人剖析材料
2014/10/08 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
党员作风建设整改方案
2014/10/27 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
好员工观后感
2015/06/17 职场文书
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android