【问题标题】:PHP Notice: Trying to get property of non-objectPHP 注意:试图获取非对象的属性
【发布时间】:2013-03-05 14:04:32
【问题描述】:

我这几天一直在尝试修复这部分 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 的无知有关。有没有人有任何想法或建议?提前感谢您的帮助。

【问题讨论】:

  • 使用您添加“或 trigger_error($db->e​​rror)”的建议,我收到错误消息:注意:命令不同步;您现在无法运行此命令。我现在正在研究这意味着什么。看起来您不能同时进行两个查询?

标签: php mysql mysqli prepare


【解决方案1】:

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

【讨论】:

  • 这里的目标是描述@Homer 发生的事情。不要写一本关于编码最佳实践的书。事实上,我在链接中提到的 PHP 文档只是将准备语句包装在条件中并返回 false。如果您对开始学习的每个简化解释都投反对票,那么您将成为一个非常忙碌的人。
  • 感谢埃文和常识的帮助。您的任何一种错误方法都显示相同的关键语句:“注意:命令不同步;您现在无法运行此命令。”知道了这一点,我发现在我的“bind_result”行之后我只需要添加“$query->store_result();”现在我的代码可以工作了。但是,我不明白这条线的作用或含义,以及它与之前的“非对象”错误有何关系。任何解释或链接将不胜感激。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多