PHP подготовил заявление в готовом утверждении - PullRequest
3 голосов
/ 07 апреля 2011

Я прохожу видеоурок о создании меню с использованием БД. Вместо того, чтобы делать это с процедурным PHP, как в видео, я попытался сделать это с помощью готовых операторов в стиле ООП. Это не работает, и я не могу понять, почему.

Он работает нормально до строки 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 ();?

Ответы [ 4 ]

11 голосов
/ 07 апреля 2011

Разобрался:

После выполнения и привязки результата его нужно сохранить (если в выборку должен быть добавлен другой подготовленный оператор).Таким образом, выборка в этом случае должна считываться из буферизованного результата.

Другими словами, невозможно выполнить другой запрос, пока не будет выполнена выборка по тому же соединению.

Рабочийкод:

$query = $connection->prepare("SELECT menu_name, id FROM subjects ORDER BY position ASC;");
$query->execute();
$query->bind_result($menu_name, $sid);
$query->store_result();
3 голосов
/ 07 апреля 2011
$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, вы не можете выполнить оператор подготовки в другом пс, используя то же соединение !!!

0 голосов
/ 07 апреля 2011

Вы не говорите, какое расширение БД вы используете, но, похоже, вы не проверяете возвращаемое значение любой используемой вами функции.Вы не можете предполагать, что вызовы БД всегда будут выполняться без ошибок.

0 голосов
/ 07 апреля 2011

Да, у вас может быть несколько подготовленных утверждений: одна из идей подготовленных утверждений - « подготовить один раз, выполнить несколько раз ».

  • Итак, вам следует подготовитьоператор за пределами цикла - поэтому он готовится только один раз
  • и выполняет его несколько раз, внутри цикла.


Полученная вами фатальная ошибка означает, что $query2 в строке 17 не является объектом - это означает, что prepare не удалось.

A prepare обычно завершается ошибкой, когда в нем есть ошибка;Вы уверены, что ваш запрос действителен?Имена таблиц и столбцов в порядке?

При сбое prepare вы сможете получить сообщение об ошибке, используя mysqli->error() - или PDO::errorInfo()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...