PHP在准备好的声明中准备了声明

时间:2011-04-07 10:22:35

标签: php mysql 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-&gt; fetch();?

中是否无法做好预备声明

4 个答案:

答案 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)

您没有说出您正在使用的数据库扩展名,但您似乎没有测试您正在使用的任何函数的返回值。你不能假设数据库调用总能完美运行。