PDO::lastInsertId调用返回0的问题:为何与MySQL 0行为存在差异?
PDO::lastInsertId调用返回0的问题:为何与MySQL 0行为存在差异?
嘿,我来帮你捋清楚这个问题~你遇到的情况其实是PDO和MySQL自增ID机制配合时的一个常见细节问题,咱们一步步说:
问题的核心原因
你可能以为PDO::lastInsertId()会一直记住最后一次INSERT的自增ID,但实际上,你必须在INSERT语句执行完成后立刻调用它,不能在中间插入其他SQL操作(比如你的UPDATE)。
虽然理论上MySQL的0函数会在连接层面保留最后一次产生自增主键的语句结果,哪怕后续执行了非自增语句(比如UPDATE)也不会重置,但在PHP 7.2搭配MariaDB 10.3的环境下,PDO的驱动实现存在一些细节差异——当你执行了其他语句后再调用lastInsertId(),它可能无法正确获取到之前的自增ID,甚至返回0。
解决方案:立刻获取并保存ID
修改你的代码,在INSERT执行完成后马上调用lastInsertId(),把结果存到变量里,之后再执行其他操作就没问题了:
public function pdoTest() { $title = "test"; $id = 1; $db = new PDO('mysql:host=<your-host>;port=<your-port>;dbname=<your-dbname>;charset=utf8', '<your-username>', '<your-password>'); $db->beginTransaction(); $query = "INSERT INTO test (title) VALUES (:title)"; $stmt = $db->prepare($query); $stmt->bindParam(':title', $title); $stmt->execute(); // 关键步骤:在这里立刻获取自增ID并保存 $insertedId = $db->lastInsertId(); $updateQuery = "UPDATE test2 SET title = :title WHERE id = :id"; $stmt = $db->prepare($updateQuery); $stmt->bindParam(':id', $id); $stmt->bindParam(':title', $title); $stmt->execute(); echo $insertedId; $db->commit(); }
对你疑问的解答
你问“是不是必须在执行lastInsertId函数之前只执行插入查询?”——准确来说,是必须在INSERT语句执行完成后立即调用lastInsertId(),不要在中间执行任何其他SQL语句(不管是UPDATE、SELECT还是其他)。这样就能避免PDO驱动的细节问题,确保拿到正确的自增ID。
备注:内容来源于stack exchange,提问作者seonbeen
相关产品推荐
相关产品推荐

