Уведомление PHP: попытка получить свойство не-объекта

Я уже несколько дней пытаюсь исправить эту часть моего PHP-кода, но, похоже, ничего не работает.

Я в основном супер-новичок. Практически на прошлой неделе я решил попробовать создать блог с нуля, используя PHP. Для этого мне необходимо изучить PHP. Итак, следуя руководствам и читая сайты, такие как w3schools, я медленно изучал применимый PHP.

В любом случае, вот часть моего кода, над которой я работаю:

$query = $db->prepare("SELECT post_id, title, body, date_posted, category
                       FROM posts INNER JOIN categories ON
                       categories.category_id=posts.category_id ORDER BY
                       post_id desc limit $start, $per_page");
$query->execute();
$query->bind_result($post_id, $title, $body, $date_posted, $category);

$author = $db->prepare("SELECT username FROM posts INNER JOIN user ON
                            user.user_id=posts.user_id");
print_r( $author->error );
$author->execute();
$author->bind_result($username);

Позволь мне объяснить. У меня есть 3 таблицы базы данных: сообщения, категории и пользователь. Большая часть информации о сообщениях содержится в «сообщениях», включая category_id и user_id, но не настоящие имена категории и пользователя. Я получаю их из двух других таблиц. $ db использует mysqli.

Часть приведенного выше кода $ query работает отлично. Строка подготовки $ author - это то место, где у меня возникла проблема. Я написал эту строку на основе работающей строки подготовки $ query.

Но когда я запускаю код, я получаю «Примечание: попытка получить свойство не-объекта». Затем это приводит к тому, что $ author-> execute () не работает и выдает ошибку: «Неустранимая ошибка: вызов функции-члена execute () для не-объекта».

Итак, еще раз, поскольку я мега-новичок, я предполагаю, что исправление - это что-то действительно простое, что, вероятно, связано с моим незнанием PHP. Есть ли у кого-нибудь идеи или предложения? Заранее спасибо за помощь.


person Homer    schedule 17.03.2013    source источник
comment
дубликат stackoverflow.com/a/15447204/285587   -  person Your Common Sense    schedule 17.03.2013
comment
Используя ваше предложение о добавлении или trigger_error (ошибка $ db- ›), я получаю сообщение об ошибке: Примечание: команды не синхронизированы; вы не можете запустить эту команду сейчас. Я исследую, что это значит прямо сейчас. Похоже, у вас просто не может быть двух запросов подряд?   -  person Homer    schedule 17.03.2013


Ответы (1)


Ошибка говорит, что $ author не является объектом.

Если бы $author = $db->prepare() был выполнен правильно, он бы возвратил mysqli_stmt объект. Вместо этого он, вероятно, вернул false

Вы можете это подтвердить:

echo($author); // Should be false
echo($db->error); // A string representation of your error.

Редактировать для потомков:

Лучше всего, отказоустойчивой реализации оператора prepare () может быть что-то вроде ниже, как описано здесь:

$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error);

Ознакомьтесь с документацией здесь: http://www.php.net/manual/en/mysqli.prepare.php

Кроме того, если вы новичок в PHP, я бы порекомендовал библиотеки PDO вместо mysqli, с ними немного легче работать, как только вы начнете получать результаты.

person Evan Cordeiro    schedule 17.03.2013
comment
Целью здесь было описать, что происходит с @Homer. Не писать книгу о лучших практиках кодирования. Фактически, документация PHP, на которую я ссылался в ссылке, просто оборачивает оператор подготовки в условное выражение и возвращает значение false. Если вы опускаете каждое упрощенное объяснение для начинающих учиться, вы станете чрезвычайно занятым человеком. - person Evan Cordeiro; 17.03.2013
comment
Спасибо, Эван и здравый смысл за помощь. Любой из ваших методов ошибки показывает одно и то же ключевое утверждение: Примечание: команды не синхронизированы; вы не можете запустить эту команду сейчас. Зная это, я обнаружил, что после строки bind_result мне просто нужно добавить $ query- ›store_result (); Теперь мой код работает. Однако я не понимаю, что делает или означает эта строка и как она соотносится с предыдущими ошибками, не связанными с объектами. Приветствуются любые объяснения или ссылки. Спасибо еще раз. - person Homer; 17.03.2013