使用Codeigniter重写insert的方法(推荐)

2025-05-27 0 97

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71
/**

* 插入单条记录(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'

举个例子:

?

1

2
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的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 使用Codeigniter重写insert的方法(推荐) https://www.kuaiidc.com/72410.html

相关文章

发表评论
暂无评论