我已经尝试了几天来修复我的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 prepare行写了那行。
但是当我运行代码时,我得到“注意:试图获取非对象的属性。”这导致$ author-> execute()无效并产生错误:“致命错误:在非对象上调用成员函数execute()。”
再说一次,因为我是一个超级新手,我认为修复是非常简单的,可能与我对PHP的无知有关。有没有人有任何想法或建议?在此先感谢您的帮助。
答案 0 :(得分:5)
错误在于$ author是非对象。
如果$author = $db->prepare()
已正确执行,则会返回mysqli_stmt
个对象。相反,它可能会返回false
您可以通过以下方式确认:
echo($author); // Should be false
echo($db->error); // A string representation of your error.
为后代编辑:
更好的做法是,prepare()语句的容错实现可能如下所示,如here所述:
$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error);
您应该在这里查看文档: http://www.php.net/manual/en/mysqli.prepare.php
此外,如果您是PHP新手,我建议使用PDO库而不是mysqli,一旦开始获取结果,它们就更容易使用了。