(共556篇)
全部分类

CI4中自动获取插入数值的自增ID值报错问题
[ PHP ] 

手头有个使用 CI4 的项目,为了方便查询,在 CI 的基础上,手动封装了insert语句。本着希望返回每次插入新值的自增 ID,是这么写的:

1
2
3
4
5
6
7
8
function insert($table, $data)
{
    global $db;
    // 这没有直接执行,而是使用getCompiledInsert组装成一个sql语句,是为了把sql语句写到日志中
    $sql = $db->table($table)->set($data)->getCompiledInsert();
    query($sql); // query是另一个封装过的用于执行sql语句的函数
    return $db->insertID();
}

实际执行的时候,竟然报了一个错误

他说没有找到insert_id这个属性。查看了下 CI 的源码system/Database/MySQLi/Connection.php,发现了这玩意儿

1
2
3
4
5
6
7
8
9
/**
    * Insert ID
    *
    * @return integer
    */
public function insertID(): int
{
    return $this->connID->insert_id;
}

也就是说,insertID()方法只是把已经保存在当前实例的insert_id返回出来了而已,那么这个值肯定是在某个特定时间设置的,按照之前我的写法,insert语句是被query函数执行的,很明显query函数在执行insert语句时,并没有在执行后自动设置insert_id的值,所以在取值的时候,就报错了。

CI4 还提供了一个直接执行insert语句的方法,做如下改动:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function insert($table, $data)
{
    global $db;
    // 这里只是为了打印sql语句
    $sql = $db->table($table)->set($data)->getCompiledInsert();
    logs($sql);
    // 这里的insert方法会直接组装并执行sql语句
    $db->table($table)->set($data)->insert();
    return $db->insertID();
}

再试一下,果然完美的返回了自增 ID 值。看来 CI 中只有直接执行insert的时候,才会自动更新实例中的inset_id属性值