簡體   English   中英

PHP在准備好的聲明中准備了聲明

[英]PHP prepared statement within a prepared statement

我正在閱讀有關使用數據庫執行菜單的視頻教程。 我沒有像在視頻中那樣使用程序化PHP,而是嘗試使用預備語句OOP樣式。 它不起作用,我無法弄清楚為什么。

它運行良好,直到第17行,它出現此錯誤:

Fatal error: Call to a member function bind_param() on a non-object in C:\\wamp\\www\\widget_corp\\content.php on line 17

這是代碼:

    <?php
        $query = $connection->prepare('SELECT menu_name, id FROM subjects ORDER BY position ASC;');
        $query->execute();
        $query->bind_result($menu_name, $sid);

        while ($query->fetch()){
            echo "<li>{$menu_name} {$sid}</li>";

            $query2 = $connection->prepare('SELECT menu_name FROM pages WHERE subject_id = ? ORDER BY position ASC;');
            $query2->bind_param("i", $sid); //This is line 17
            $query2->execute();
            $query2->bind_result($menu_name);
            echo "<ul class='pages'>";              
            while ($query2->fetch()){
                echo "<li>{$menu_name}</li>";
            }
            echo "</ul>";

        }
        $query->close();
    ?>

是不可能在stmt-> fetch()中做一個准備好的聲明;?

弄清楚了:

在執行並綁定結果之后,必須將其存儲(如果要將另一個預准備語句放入獲取中)。 因此,必須從緩沖結果中讀取此情況下的提取。

換句話說,在同一連接上的提取正在進行之前,無法執行另一個查詢。

工作代碼:

$query = $connection->prepare("SELECT menu_name, id FROM subjects ORDER BY position ASC;");
$query->execute();
$query->bind_result($menu_name, $sid);
$query->store_result();
$stmt = mysqli_prepare($con,"SELECT menu_name, id FROM subjects ORDER BY position ASC");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $menu_name, $id);
while (mysqli_stmt_fetch($stmt))
{
 $stmt2 = mysqli_prepare($con2,"SELECT menu_name FROM pages WHERE subject_id = ? ORDER BY position ASC;");
 mysqli_stmt_bind_param($stmt2,$id);
 mysqli_stmt_execute($stmt2);
 mysqli_stmt_bind_result($stmt2, $name);
 while (mysqli_stmt_fetch($stmt2))
  echo $name;
}

看看$ con和$ con2,你不能使用相同的連接在另一個ps內執行一個prepare語句!

是的,你可以有幾個准備好的陳述:預備陳述的一個想法是“ 准備一次,多次執行 ”。

  • 所以,你應該在循環之外准備語句 - 所以它只准備了一次
  • 並且多次執行它,使循環無效。


你得到的致命錯誤意味着第17行的$query2不是一個對象 - 這意味着prepare失敗。

prepare通常在出現錯誤時失敗; 你確定你的查詢有效嗎? 表和列名稱可以嗎?

prepare失敗時,您應該能夠使用mysqli->error() - 或PDO::errorInfo()獲取錯誤消息

你沒有說你正在使用什么數據庫擴展,但你似乎沒有測試你正在使用的任何函數的返回值。 您不能假設數據庫調用總是運行良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM