我正在阅读有关使用数据库执行菜单的视频教程。我没有像在视频中那样使用程序化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-&gt; fetch();?
中是否无法做好预备声明答案 0 :(得分:11)
想出来:
执行并绑定结果后,必须将其存储(如果要将另一个预准备语句放入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();
答案 1 :(得分:3)
$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语句!!!
答案 2 :(得分:0)
是的,你可以有几个准备好的陈述:预备陈述的一个想法是“准备一次,多次执行”。
您获得的致命错误意味着第17行的$query2
不是对象 - 这意味着prepare
失败。
prepare
通常在出现错误时失败;你确定你的查询有效吗?表和列名称可以吗?
当prepare
失败时,您应该能够使用mysqli->error()
- 或PDO::errorInfo()
答案 3 :(得分:0)
您没有说出您正在使用的数据库扩展名,但您似乎没有测试您正在使用的任何函数的返回值。你不能假设数据库调用总能完美运行。