使用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 相关文章推荐
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
PHP代码审核的详细介绍
Jun 13 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
汇总PHPmailer群发Gmail的常见问题
Feb 24 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
php文件包含目录配置open_basedir的使用与性能详解
Apr 03 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
php实现的数组转xml案例分析
Sep 28 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
python进程类subprocess的一些操作方法例子
2014/11/22 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python如何读写csv数据
2018/03/21 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
Python提取频域特征知识点浅析
2019/03/04 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
python代码编写计算器小程序
2020/03/30 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
认购协议书范本
2014/04/22 职场文书
学校党员干部承诺书
2015/05/04 职场文书
小平您好观后感
2015/06/09 职场文书
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL
源码安装apache脚本部署过程详解
2022/09/23 Servers
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python