执行mysqli插入查询,然后立即选择新行的ID

3

我花了几个小时尝试编写mysqli查询,以在数据库中插入新行(带有主键ID),然后选择新行的ID。 我目前的代码如下:

<?php
    include('connectionData.php');

    $conn = mysqli_connect($server, $user, $pass, $dbname, $port)
    or die('Connection error');

    if(isset($_POST['submit'])) {
        $pnum = $_POST['pnum'];

        $phone_insert_text = "INSERT INTO `voterdatabase`.`phone` (`pnum`) VALUES (?)";
        $phone_insert_query = $conn->prepare($phone_insert_text);
        $phone_insert_query->bind_param('s', $pnum);
        $phone_insert_query->execute();

        $phone_select_text = "SELECT phone_id FROM voterdatabase.phone WHERE pnum=?";
        $phone_select_query = $conn->prepare($phone_select_text);
        $phone_select_query->bind_param('s', $pnum);
        $phone_select_query->execute();
        $phone_select_query->bind_result($phone_id);

        echo $phone_id;
?>

$phone_insert_query可以正常执行。但是$phone_select_query似乎根本没有运行,因为echo $phone_id;没有任何效果。这里可能出了什么问题?我能够在MySQLWorkbench中直接运行查询。

请注意,我之前尝试过使用SELECT LAST_INSERT_ID();在一个查询中完成此操作,但mysqli无法执行包含该查询的任何查询。


首先,检查您要插入的值是否实际出现在数据库中,并且是否正确分配了ID。 - Timekiller
注意:记得最后的闭括号 - 它丢失了。意外效果很有趣,但耗时。 - Peter_James
3个回答

2
请尝试这个。
 $lastInsertID= mysqli_insert_id($conn);

好的,解决了,真是个简单的修复!谢谢你!(如果我在接下来的10分钟内没有接受你的回答,请提醒我) - ck2
我感觉到“竞态条件”即将出现...你如何确保最后的insert_id是正确的?如果有人在最终执行之前插队会怎么样? - Peter_James
我一定会的,只是 StackExchange 不允许你在前 10 分钟内接受答案。 - ck2
1
@Peter_James 这个问题可能与MySQL的竞态条件有关。 - Benjy1996
@Benjy1996 我会像PHP一样以相同的线性方式吃掉我的“竞态条件”。一个线程接一个线程... - Peter_James
显示剩余2条评论

0

使用 insert_id 属性:

<?php
    include('connectionData.php');

    $conn = mysqli_connect($server, $user, $pass, $dbname, $port)
    or die('Connection error');

    if(isset($_POST['submit'])) {
        $pnum = $_POST['pnum'];

        $phone_insert_text = "INSERT INTO `voterdatabase`.`phone` (`pnum`) VALUES (?)";
        $phone_insert_query = $conn->prepare($phone_insert_text);
        $phone_insert_query->bind_param('s', $pnum);
        $phone_insert_query->execute();
        $phone_id = $conn->insert_id;

        echo $phone_id;
?>

你肯定把它分成了两半。 - Peter_James

0

如果您希望能够使用可用的函数来获取最后插入的ID,例如mysqli_insert_id(),则您的表必须具有AUTO_INCREMENT列。否则,您将无法获得ID。

此外,即使您拥有所需的列,这也需要两个调用。为了解决这个问题,您可以创建一个存储过程来执行插入操作,并从该过程返回插入的ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接