使用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数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
php生成随机颜色的方法
Nov 13 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
Apr 03 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
PHP simplexml_load_string()函数实例讲解
Feb 03 PHP
thinkphp框架类库扩展操作示例
Nov 26 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随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python学习笔记之常用函数及说明
2014/05/23 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
python 将md5转为16字节的方法
2018/05/29 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
Python requests库用法实例详解
2018/08/14 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
员工评语大全
2014/01/19 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
2014年护士长工作总结
2014/11/11 职场文书
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL