2015-11-12 252 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

不錯,那是一個。 –