1

几天来,我一直在尝试修复我的 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 prepare 行是我遇到问题的地方。我根据有效的 $query prepare 行编写了该行。

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

再说一次,由于我是一个超级新手,我认为修复非常简单,可能与我对 PHP 的无知有关。有没有人有任何想法或建议?在此先感谢您的帮助。

4

1 回答 1

5

错误是说 $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,一旦您开始获取结果,它们会更容易使用。

于 2013-03-17T00:58:30.577 回答