【问题标题】:PHP prepared statement fails preparing second statementPHP 准备好的语句未能准备第二条语句
【发布时间】:2015-11-12 11:43:44
【问题描述】:

我在 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() 需要返回 false 而不仅仅是最后一行,以便准备好第二条语句。

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

【问题讨论】:

    标签: php mysql prepared-statement


    【解决方案1】:

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

    $stmt->close();
    

    这应该会清除缓冲区,以便运行进一步的查询。

    【讨论】:

    • Fatal error: Call to undefined method mysqli_stmt::free() in C:\xampp\htdocs\Test.php on line 14
    • 对不起,我的错误。尝试使用 close() 而不是 free()。我已经编辑了我的答案。
    • 很好,那个人做到了。
    • @DougMcLean 投票支持快速捕捉和明确答案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多