在编写数据库相关代码时,我不断收到此错误。在过去的一个月左右的时间里,我一直在尝试各种不同的方法来解决我遇到的错误。我发现的唯一一个是关于消息传递的 foreach。
背景故事:我有一个个人网站,目前我正在尝试将消息传递和好友等社交功能融入其中。将来我计划添加个人资料图片等内容。
错误:
[TIME] [:error] [pid PID] [client IP:PORT] PHP Fatal error: Call to a member function bind_param() on a non-object in /www/hub/models/funcs.php on line 1656, referer: http://my.website.com/hub/users.php
错误指向这一行:
$stmt->bind_param("i", $user);
通过此函数访问:
function getUnreadMessages($user)
此资源访问的内容:
left-nav.php
网站上的每个页面都会访问它,并尝试运行这行代码:
$unread = getUnreadMessages($loggedInUser->user_id);
这样它就可以运行这些代码行:
if($unread > 0){
echo "<li><a href='user_messages.php'>Messages</a>(".$unread.")</li>";
}else{
echo "<li><a href='user_messages.php'>Messages</a></li>";
}
这是完整的功能:
function getUnreadMessages($user){
global $mysqli,$db_table_prefix;
$stmt = $mysqli->prepare("SELECT
id,
from_user,
to_user,
time_sent,
subject,
message,
deleted
FROM ".$db_table_prefix."messages
WHERE
to_user = ?
AND
read = 0
");
$stmt->bind_param("i", $user);
$stmt->execute();
$unread = $stmt->num_rows;
$stmt->close();
return($unread);
}
抱歉,这太乱了。我希望你能理解我的沮丧。还有更多错误,但这是目前最大的问题。如果你们中的任何人愿意在这篇文章之外提供更多支持,我将非常感激。
最佳答案
PHP Fatal error: Call to a member function bind_param() on a non-object
表示 var $stmt
是一个非对象,可能是 NULL
,根据 PHP 错误,它不是一个对象,可以调用任何方法。
查看您的 getUnreadMessages()
函数,我发现 $mysqli
是一个全局函数。是否有可能其他逻辑正在修改系统中其他地方的 $mysqli
?
您是否也看到类似的 PHP fatal error “调用非对象上的成员函数prepare()”?如果您这样做,这将表明 $mysqli
在上述逻辑之外以某种方式被修改。
此时,在我看来,$stmt
是一个非对象(var_dump($stmt);
出于兴趣显示了什么?),因为 $mysqli->prepare(...)
可能不会返回任何内容(或者返回某些东西,但不是一个对象)。
如果 SQL 字符串有效,我会通过 Google 搜索 MySQLi prepare()
应该输出什么,如果 SQL 字符串有效,会发生什么情况。
关于PHP 和 MySQL 我看不到这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37337226/