PHP准备语句未能准备第二个语句

Den*_*alj 4 php mysql prepared-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";

    ?>
Run Code Online (Sandbox Code Playgroud)

数据库只有2列,2行有虚拟数据:

表测试

现在,当我运行代码时,我期望输出如下:

foo
1
Run Code Online (Sandbox Code Playgroud)

我得到的是:

foo
didn't prepare second
Run Code Online (Sandbox Code Playgroud)

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

$stmt->fetch();
echo '</br>'.$clmn;
Run Code Online (Sandbox Code Playgroud)

为了这:

while($stmt->fetch())
    echo '</br>'.$clmn;
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

foo
bar
1
2
Run Code Online (Sandbox Code Playgroud)

我的想法是,在获取前一个行的所有行之前,不能更改预准备语句.注意,fetch()需要返回false而不仅仅是最后一行,以便第二个语句准备好.

有人对此有更深入的了解吗?我只用XAMPP测试过它.

Dou*_*ean 5

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

$stmt->close();
Run Code Online (Sandbox Code Playgroud)

这应该清除缓冲区,允许进一步运行查询.