我需要在表格中复制/复制一行,然后返回新行的'id'值。我的'id'列是一个自动增量字段。
$sth = $dbh->prepare("DROP TEMPORARY TABLE IF EXISTS tmp_users;
CREATE TEMPORARY TABLE tmp_users
SELECT * FROM users
WHERE user_id = $user_id
UPDATE tmp_users
SET id = NULL;
INSERT INTO users
SELECT * FROM tmp_users;
DROP TEMPORARY TABLE IF EXISTS tmp_users;");
$sth->execute();
如果我$id_new = $dbh->lastInsertId();
这会返回'0',但不确定原因。有什么想法吗?
答案 0 :(得分:0)
您的查询中存在语法错误,您在CREATE TEMPORARY TABLE
语句末尾缺少分号:
CREATE TEMPORARY TABLE tmp_users
SELECT * FROM users
WHERE user_id = $user_id
UPDATE tmp_users
SET id = NULL;
即使你认为声明“执行得很好”,你也可以清楚地看到上面的摘录最后只有一个分号;即单个语句,其中包含语法错误,不两个单独的CREATE
和UPDATE
语句。
PDO似乎很难处理多语句查询,无法报告错误。我进行了以下测试:
$sth = $dbh->prepare("INSERT INTO test VALUES ('test1');
INVALID STATEMENT;
INSERT INTO test VALUES ('test2');");
$sth->execute();
如您所见,我在两个有效的INSERT
语句中包含了无效语句。运行上面的代码后,我的测试表只插入了'test1'
值,但没有执行'test2'
插入,PDO也没有报告错误。
CREATE TEMPORARY TABLE
中的语法错误会阻止实际创建表,这也会阻止其余语句正常运行,因此您不会在users
表中插入新行而不会最后插入的ID。
更新:以下是此PDO行为的实际PHP bug report,显然仍未解决。