【问题标题】:lastInsertId() returns 0lastInsertId() 返回 0
【发布时间】:2014-11-13 22:57:45
【问题描述】:

我在这里查看了类似的问题,但未能解决我的问题……非常感谢所有帮助!

基本上,我的 PHP 中有以下 SQL 代码:

$query = 'CREATE TEMPORARY TABLE tmp SELECT * from orders WHERE id='.$old_order_id.';
    ALTER TABLE tmp drop id; # drop autoincrement field
    UPDATE tmp SET groupID=null, timeOrdered=CURRENT_TIMESTAMP, totalOrderStatus=0; 
    INSERT INTO orders SELECT 0,tmp.* FROM tmp;
    DROP TABLE tmp;';
$db->exec($query);
$new_order_id = $db->lastInsertId();

现在,我原以为 lastInsertId() 会成功返回最后插入“订单”的行的 ID。相反,我得到一个零——但我不知道这是因为它使用了表“tmp”的最后插入的 ID,还是因为我犯了其他一些错误。 (我不明白为什么它会从 tmp 获取 id,因为那不是最后插入的 id 真的......)

【问题讨论】:

  • ...你确定它没有返回你插入orders的0吗?
  • 你为什么要使用临时表和多个查询呢?这可以写成一个查询。
  • @IgnacioVazquez-Abrams 好吧......插入行的实际 id(在“订单”中)不是 0。这不应该是返回的内容吗?
  • @MikeBrant-我不知道如何复制一行,发现它是在网上完成的(如果我没记错的话,这里是这样)。我没有意识到有更好的方法,但我全神贯注!
  • @IgnacioVazquez-Abrams-我只是用 'null' 而不是 0 尝试了它,然后那里什么都没有,结果仍然是 0...

标签: php mysql lastinsertid


【解决方案1】:

您似乎只是想将现有行复制到表中并修改了一些数据。你为什么不简化这个并这样做:

INSERT INTO orders (
    /* fields you are changing */
    groupID,
    timeOrdered,
    totalOrderStatus,
    /* other fields from select below that are not changing */
    field1,
    field2,
    ...
)
SELECT
    /* values for fields you are changing */
    null,
    CURRENT_TIMESTAMP,
    0,
    /* other fields from order table that are to remain unchanged */
    field1,
    field2,
    ...
FROM orders
WHERE id = ?

只是不要为你的主键字段插入一个值(假设它是自动增量的),那么你的插入 id 就可以正常工作。

【讨论】:

  • 所以……我想要复制它的原因(而不是选择和重新插入)是因为我希望这个查询能够在未来可能发生的数据库更改中幸存下来。所以我不想将代码绑定到当前存在的特定列。
  • @Jo.P 这是一个错误的选择。如果您的数据库更改发生在您要替换值的字段上怎么办?您仍然需要更改查询。
  • 那是真的,我猜。但我认为这比添加一列的可能性要小。你不认为这样做值得付出努力吗? (我是这方面的新手,可能很清楚……:P)
  • 接受你的建议--tnx Mike!
  • @Jo.P 回答您的最后一个问题。我想我发现SELECT * 的使用随着时间的推移在一个人的代码中往往会出现更多问题。例如,如果添加一列并且这改变了代码中的行为,引入了错误怎么办?如果有人特别指定了列,他不必担心不需要这个新列的代码区域可能会被无意中破坏。
【解决方案2】:

检查该行是否实际被插入。如果它没有被插入,那么就不会有新的 Id。这就是我发现正在发生的事情,结果我没有在相关表上为我的用户授予插入权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    相关资源
    最近更新 更多