Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php lastInsertId()返回0_Php_Mysql_Lastinsertid - Fatal编程技术网

Php lastInsertId()返回0

Php lastInsertId()返回0,php,mysql,lastinsertid,Php,Mysql,Lastinsertid,我在这里查看了类似的问题,但未能解决我的问题…非常感谢所有帮助 基本上,我的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_TIM

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

基本上,我的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()会成功返回上次插入到“orders”中的行的id。相反,我得到了一个零——但我不知道这是因为它使用了表“tmp”的最后一个插入ID,还是因为我犯了其他错误。(我不明白为什么它会从tmp中获取id,因为这不是最后一个插入的id…

看起来您只是试图在修改了一些数据的情况下将现有行复制到表中。为什么不简化一下,这样做:

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就可以正常工作。

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

。。。您确定它没有返回您插入到
订单中的0吗?为什么要使用临时表和多个查询?这可以写成一个查询。@IgnacioVazquez Abrams嗯……插入行的实际id(在“orders”中)不是0。这不应该是返回的吗?@MikeBrant-我不知道如何复制一行,发现它是这样在线完成的(如果我没记错的话,就这样)。我不知道还有更好的办法,但我洗耳恭听@IgnacioVazquez-Abrams-我只是用“null”而不是0尝试了一下,结果还是0…所以…我之所以要复制它(而不是选择并重新插入),是因为我希望这个查询能够在将来可能发生的任何数据库更改中生存下来。所以我不想将代码绑定到当前存在的特定列。@Jo.P这是一种错误的选择。如果数据库更改发生在要替换值的字段上,该怎么办?您仍然需要更改查询。我想这是真的。但我认为这不太可能,比如说,增加一个专栏。你觉得这样做不值得吗?(我对这方面还不熟悉,可能很清楚……:P)同意你的建议——tnx迈克@请回答你的最后一个问题。我想我已经发现,
SELECT*
的用法在一个人的代码中会随着时间的推移而变得更加麻烦。例如,如果一个人添加了一个列,而这改变了代码中的行为,引入了一个bug呢?如果有人专门指定了列,他就不必担心不需要这个新列的代码区域会被无意中破坏。