PHP 准备好的语句准备第二条语句失败

PHP prepared statement fails preparing second statement

我在 PHP 中遇到了关于预准备语句的奇怪行为。谷歌搜索这个问题没有任何结果所以在这里。

假设你有这个代码:

 <?php

    $db  = new mysqli('localhost','root','','test');

    $q = 'SELECT text FROM tests';

    if($stmt = $db->prepare($q))
    {
        $stmt->bind_result($clmn);
        $stmt->execute();
        $stmt->fetch();

        echo '</br>'.$clmn;
    }
    else echo "</br>didn't prepare first";

    $q = 'SELECT id FROM tests';

    if($stmt = $db->prepare($q))
    {
        $stmt->bind_result($clmn);
        $stmt->execute();
        $stmt->fetch();

        echo '</br>'.$clmn;
    }
    else echo "</br>didn't prepare second";

    ?>

数据库只有 2 列和 2 行的虚拟数据:

现在当我 运行 代码时,我期望的输出是这样的:

foo
1

我得到的是:

foo
didn't prepare second

现在我做了一些测试,发现当我交换这个时:

$stmt->fetch();
echo '</br>'.$clmn;

为此:

while($stmt->fetch())
    echo '</br>'.$clmn;

我得到这个结果:

foo
bar
1
2

我的想法是,在获取前一个语句的所有行之前,不能更改准备好的语句。请注意 fetch() 需要 return false 而不仅仅是最后一行才能准备第二条语句。

有人对此有更多了解吗?我只用 XAMPP.

测试过它

这很可能是因为仍有结果等待从您的第一个查询中提取。在执行第二个查询之前,尝试:

$stmt->close();

这应该清除缓冲区以允许进一步的查询 运行。