[英]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.