1

我需要复制/复制表中的一行,然后返回新行的“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',但不知道为什么。有任何想法吗?

4

1 回答 1

0

您的查询中有语法错误,您在CREATE TEMPORARY TABLE语句末尾缺少分号:

CREATE TEMPORARY TABLE tmp_users
    SELECT * FROM users 
    WHERE user_id = $user_id
UPDATE tmp_users 
    SET id = NULL;

即使您相信语句“执行得很好”,您也可以清楚地看到上面的摘录末尾只有一个分号;即它是一个带有语法错误的语句,而不是两个单独的CREATEUPDATE语句。

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 错误报告,显然仍未解决。

于 2012-10-28T16:27:36.323 回答