2015-11-12 300 views
4

我在PHP中遇到了一个有关预准备语句的奇怪行为。谷歌搜索这个问题没有得到任何成果,所以它就是这样。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行的虚拟数据:

The table tests

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

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测试过它。

回答

5

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

$stmt->close(); 

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

+1

'致命的错误:调用未定义的方法mysqli_stmt :: free()在C:\ xampp \ htdocs \ Test.php 14行上' –

+1

抱歉,我的错误。尝试close()而不是free()。我编辑了我的答案。 –

+0

不错,那是一个。 –