2013-03-17 1 views
1

Я пытался в течение нескольких дней исправить эту часть своего 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); 

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

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

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

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

+0

дубликат http://stackoverflow.com/a/15447204/285587 –

+0

Использование вашего предложения о добавлении «или trigger_error ($ db-> error)», появляется сообщение об ошибке: Примечание: команды не синхронизированы; вы не можете запустить эту команду сейчас. Я изучаю, что это значит прямо сейчас. Похоже, у вас просто не может быть двух запросов назад? – Homer

ответ

5

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

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

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

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

Edit для потомков:

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

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

Вы должны проверить документы здесь: http://www.php.net/manual/en/mysqli.prepare.php

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

+0

Целью здесь было описать, что происходит с @Homer. Не писать книгу о лучшей практике кодирования. Фактически, документация PHP, о которой я упоминал в ссылке, просто переносит инструкцию подготовки в условное выражение и возвращает значение false. Если вы уменьшите каждое упрощенное объяснение для начала, чтобы узнать, что вы будете чрезвычайно занятым человеком. –

+0

Спасибо Эван и здравый смысл за помощь. Любой из ваших методов ошибок показывает один и тот же оператор: «Обратите внимание: команды не синхронизированы, вы не можете запустить эту команду сейчас.« Зная, что мне удалось найти, что после моей строки« bind_result »мне просто нужно добавить« $ query-> store_result(): «Теперь мой код работает. Однако я не понимаю, что делает эта строка или означает, и как это относится к предыдущим ошибкам «без объекта». Любое объяснение или ссылки были бы очень благодарны. Еще раз спасибо. – Homer

+0

Рад помочь. Удачи! –