查看: 3818|回复: 0

[PHP学习] 使用Codeigniter重写insert的方法(推荐)

发表于 2018-2-11 10:31:40

使用Codeiginter 框架插入数据时有唯一索引键值存在解决办法

对数据进行存储的时候,会有一些唯一索引的字段已经有值了,插入数据的时候会失败我们通常解决办法是先查询这个值是否存在,存在就跟新update,不存在就insert。以下是重写了Codeigniter 模型中的insert方法,极大的简化了步骤!

  1. /**
  2. * 插入单条记录(Insert)
  3. *
  4. * @param array $params 插入字段及值数组
  5. * @param string $table 插入表名,未指定的场景插入主表
  6. * @param array $columns 插入表中所属字段名数组,若指定则按此进行过滤
  7. * @param array $updateColumns 若唯一键冲突时需要更新的列数组
  8. * @return mixed FALSE:没有插入的字段 int:插入记录id
  9. *
  10. * @throws \C_DB_Exception
  11. */
  12. public function insert($params, $table = NULL, $columns = array(), $updateColumns = array())
  13. {
  14. // 如果未指定表名,则认为对本Model层的主表进行操作
  15. if (empty($table)) {
  16. $table = $this->table;
  17. $columns = $this->columns;
  18. }
  19. // 过滤掉不属于该表中的字段
  20. if ( ! empty($columns)) {
  21. foreach ($params as $column => $val) {
  22. if (in_array($column, $columns)) {
  23. $row[$column] = $val;
  24. }
  25. }
  26. }
  27. // 不过滤
  28. else {
  29. $row = $params;
  30. }
  31. // 没有插入字段,直接返回
  32. if ( ! isset($row)) {
  33. return FALSE;
  34. }
  35. // 保证创建时间、更新时间必须设置
  36. if ( ! isset($row['create_at']) && in_array('create_at', $columns)) {
  37. $this->load->helper('common_function');
  38. $datetime = get_datetime();
  39. $row['create_at'] = $datetime;
  40. $row['update_at'] = $datetime;
  41. }
  42. // 封装SQL文,过滤不安全因素
  43. $sql = $this->db->insert_string($table, $row);
  44. // 若唯一键冲突时需要更新的列数组,则再次封装SQL文
  45. if ( ! empty($updateColumns)) {
  46. $updateValues = '';
  47. foreach ($updateColumns as $updateColumn) {
  48. if (isset($updateValues[0])) {
  49. $updateValues .= ',';
  50. }
  51. $updateValues .= $updateColumn . '=VALUES(' . $updateColumn . ')';
  52. }
  53. $sql = $sql . ' ON DUPLICATE KEY UPDATE ' . $updateValues;
  54. }
  55. // SQL执行
  56. $query = $this->db->query($sql);
  57. // SQL执行失败,抛出异常
  58. if (FALSE === $query) {
  59. $code = $this->db->_error_number();
  60. $msg = $this->db->_error_message();
  61. C_log::Error($code . ':' . $msg, $this->user_id, $sql, self::STATUS_DB_LOG);
  62. throw new C_DB_Exception('', C_DB_Exception::DB_ERR_CODE);
  63. }
  64. // SQL文写入DB日志
  65. if (LOG_UPDATE_SQL) {
  66. C_log::Info('', $this->user_id, $sql, self::STATUS_DB_LOG);
  67. }
  68. // 取得插入ID返回
  69. $id = $this->db->insert_id();
  70. return $id;
  71. }
复制代码

如果直接写SQL还有一种语句

语法: INSERT INTO table VALUES () ON DUPLICATE KEY UPDATE row='$row'

举个例子:

  1. INSERT INTO it_teacher (uid,name,qq,create_at)
  2. VALUES ('$userid','$name','$qq',NOW()) ON DUPLICATE KEY UPDATE name='$name',qq='$qq',phone='$phone'";
复制代码

以上这篇使用Codeigniter重写insert的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持程序员之家。

您可能感兴趣的文章:

  • php之CodeIgniter学习笔记
  • codeigniter使用技巧批量插入数据实例方法分享
  • codeigniter框架批量插入数据


回复

使用道具 举报