PHP注意:尝试获取非对象的属性

Hom*_*mer 1 php mysql mysqli prepare

我已经尝试了几天来修复我的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);
Run Code Online (Sandbox Code Playgroud)

让我解释.我有3个数据库表:帖子,类别和用户.大多数帖子信息都在"帖子"中,包括category_id和user_id,但不包括类别和用户的实际名称.我从其他两个表中得到了那些.$ db使用mysqli.

上面代码的$ query部分工作得很好.$ author准备行是我遇到问题的地方.我根据$ query prepare行写了那行.

但是当我运行代码时,我得到"注意:试图获取非对象的属性." 这导致$ author-> execute()无效并产生错误:"致命错误:在非对象上调用成员函数execute()."

所以,再次,因为我是一个巨型新手,我认为修复是非常简单的,可能与我对PHP的无知有关.有没有人有任何想法或建议?在此先感谢您的帮助.

Eva*_*iro 5

错误是说$ author是非对象.

如果$author = $db->prepare()已正确执行,它将返回一个mysqli_stmt对象.相反,它可能会返回false

您可以通过以下方式确认:

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

为后代编辑:

一个更好的做法,容错的实施准备()语句可能类似于下面的,如描述在这里:

$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error);
Run Code Online (Sandbox Code Playgroud)

你应该看看这里的文档:http: //www.php.net/manual/en/mysqli.prepare.php

此外,如果您是PHP新手,我建议使用PDO库而不是mysqli,一旦开始获取结果,它们就更容易使用了.