【问题标题】:Copy Row Get Last Insert ID复制行获取最后插入 ID
【发布时间】:2018-03-03 18:25:14
【问题描述】:

我正在我的数据库中的一个表中复制一行并尝试获取最后插入的 ID。复制该行可以正常工作,并且 AI 字段会正确更新,但它没有返回最后一个插入 ID(尽管它确实返回 true - 或者如果我在其位置回显其他内容也可以正常工作)。

其他一些查询也使用最后插入 ID,并且效果很好。

我怀疑这与临时表有关,但在 SO 上找不到任何关于上次插入 ID 和临时表的类似问题的信息。有谁知道导致问题的原因或是否有解决方法?

public function duplicateItinRow($itineraryID){
    $this->db->query("CREATE TEMPORARY TABLE temporary_itin_table AS SELECT * FROM itinerary_ref WHERE Itinerary_ID = $itineraryID;

    UPDATE temporary_itin_table SET Itinerary_ID=NULL;

    INSERT INTO itinerary_ref SELECT * FROM temporary_itin_table;

    DROP TEMPORARY TABLE temporary_itin_table");

    //Execute
    if($this->db->execute()){           
        return $this->db->lastInsertId();

    } else {
        return false;
    }


}

更新:

我确定这不是理想的解决方案,但使用此处详述的复制方法使其工作:How to copy a row and insert in same table with a autoincrement field in MySQL?

【问题讨论】:

  • 你能否确认id 列在表itinerary_ref 中有auto_increment,如果没有,那么lastInsertId 将无法在非自动增量PRIMARY_KEY 列上工作
  • 谢谢 - 是的,两者都可以确认,并且插入的行正在正确更新 AI 列,只是没有返回值。
  • 是的 - 它返回:string(1) "0"
  • 你能显示return $this->db->query('SELECT LAST_INSERT_ID()')->fetchColumn(0);的输出而不是PDO->lastInsertId();
  • 谢谢 - 很抱歉最初使用它 - 无法让 PDO->lastInsertId() 工作

标签: php mysql temp-tables last-insert-id


【解决方案1】:

我认为 lastInsertedId 将由您最后的“DROP TEMPORARY TABLE”语句更新。

尝试将查询拆分为两个单独的查询:

<?php

public function duplicateItinRow($itineraryID) {
    $this->db->query("CREATE TEMPORARY TABLE temporary_itin_table AS SELECT * FROM itinerary_ref WHERE Itinerary_ID = $itineraryID;

    UPDATE temporary_itin_table SET Itinerary_ID=NULL;

    INSERT INTO itinerary_ref SELECT * FROM temporary_itin_table;");


    if(!$this->db->execute()) {
        return false;
    }

    $lastId = $this->db->lastInsertId();
    $this->db->query("DROP TEMPORARY TABLE temporary_itin_table");

    if(!$this->db->execute()) {
        return false;
    }

    return $lastId;
}

另请注意,当您将$itineraryID 直接添加到 SQL 查询而不使用预准备语句时,您会遇到 SQL 注入漏洞。如果$itineraryID 是根据用户输入填充的,那么人们就可以入侵您的网站。

【讨论】:

  • 谢谢 - 是的,你需要准备是对的,只是想先让一个简单的版本开始工作。不幸的是,这仍然返回 0 - 不过感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2019-11-21
  • 2014-07-07
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多