【问题标题】:Get last inserted ID in prepared statement在准备好的语句中获取最后插入的 ID
【发布时间】:2018-05-04 04:45:00
【问题描述】:

我需要为每个插入操作获取最后插入的 ID 并将其放入数组中,我正在尝试查看正确的操作方法。

关注这个帖子Which is correct way to get last inserted id in mysqli prepared statements procedural style? 我试图将它应用到我的代码中,但我仍然没有得到正确的响应。

   if($data->edit_flag == 'ADDED')
        {

            $rowdata[0] =   $data->location_name;  
            $rowdata[1] =   0;  
            $rowdata[2] =   $data->store_id;

            $query = "INSERT IGNORE INTO store_locations (location_name,total_items, store_id) VALUES (?,?,?)";

            $statement = $conn->prepare($query);
            $statement->execute($rowdata);
            $id = mysqli_stmt_insert_id($statement);
            echo "inserted id: " . $id;
        }       

然后我意识到我正在使用 PDO 连接,所以很明显 mysqli 函数不起作用。我继续尝试以下方法

$id = $conn->lastInsertId();
echo "insert id: " . $id;

但响应仍然是空的?我做错了什么?对于 lastInsertId(),我应该从这里使用 $conn 还是 $statement:

$statement = $conn->prepare($query);
$statement->execute($rowdata);

【问题讨论】:

  • 使用 $conn 你查看过你的数据库,如果它插入了
  • 是的,它插入到数据库中,但是lastInsertId()返回的值为0
  • 注意:尝试将您的查询字符串作为直接参数提供给prepare() 函数,而不是作为只使用一次的一次性变量。这有助于在您不小心运行错误查询时出错。

标签: php mysql pdo


【解决方案1】:

您正在根据 PDO:lastInsertId() 文档正确使用 lastInsertId()

        $statement = $conn->prepare($query);
        $statement->execute($rowdata);
        $id = $conn->lastInsertId();

它不起作用的一些潜在原因:

  1. 此代码是否在 TRANSACTION 中?如果是这样,您需要在执行之后和 lastInsertId() 之前提交事务
  2. 由于您插入 IGNORE,因此 INSERT 语句可能会生成错误并且未插入行,因此 lastInsertId() 可能为空。

希望这会有所帮助!

【讨论】:

  • 我不知道我实际上做了什么,但我稍微改变了代码的顺序,现在它返回最后一个插入 ID,没有任何问题。它不在事务中,我尝试将 lastInsertId() 放在执行之前,然后在执行之后移动它并且它工作......
  • 问题是在 PDO 查询上使用 mysqli 函数。这两个库不能以这种方式互操作。
  • @tadman 如果您阅读了我提到的问题,我首先尝试了 mysqli,但后来想起我正在使用 PDO 查询并将其更改为 PDO 函数。
【解决方案2】:

如果你使用的是 pdo,

$stmt = $db->prepare("...");
$stmt->execute();
$lastInsId = $db->lastInsertId();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2015-03-02
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多