使用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 print EOF实现方法
May 21 PHP
PHP排序算法的复习和总结
Feb 15 PHP
PHP+MySQL投票系统的设计和实现分享
Sep 23 PHP
解析php中const与define的应用区别
Jun 18 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
PHP 文件上传后端处理实用技巧方法
Jan 06 PHP
laravel 修改记住我功能的cookie保存时间的方法
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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
javascript实现完美拖拽效果
2015/05/06 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
如何快速上手Vuex
2017/02/14 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
使用Python实现简单的服务器功能
2017/08/25 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
python 制作网站小说下载器
2021/02/20 Python
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
恶搞卫生巾广告词
2014/03/18 职场文书
培训通知
2015/04/17 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
Java的Object类的九种方法
2022/04/13 Java/Android