我试图在这个预准备语句中绑定一个变量,但我一直收到错误:
Call to a member function bind_param() on a non-object
调用该函数,并将变量传递给它。当我将函数更改为仅回显变量时,变量在页面上打印正常,但如果我尝试在此处绑定它,则会收到错误。有人可以帮忙吗?
//CALL FROM PAGE ONE
check($username);
//FUNCTION ON PAGE 2
function check($username){
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
}
我知道这里没有完全写出这个功能,但这不应该是个问题。我不明白为什么我收到这个错误。
答案 0 :(得分:68)
嗯,prepare()
失败的一个原因是发送给它的sql语句在当前数据库中是无效的。
prepare()
将返回false。
例如 - 如果表名不正确或查询中的一个或多个字段不存在。
答案 1 :(得分:24)
正如错误消息所示,$qSelect
似乎不是一个对象。尝试在准备调用后立即使用var_dump($qSelect);
进行调试。还要检查getDBH()
是否返回您需要的内容。
听起来就像准备调用失败(不知道原因)所以它返回false
- false
不是对象,所以你不能在那上面调用bind_param()
编辑:您没有提供信息,但看起来您正在使用PHP的PDO。在这种情况下,请查看the documentation。
如果数据库服务器成功 准备声明,PDO :: prepare() 返回PDOStatement对象。如果 数据库服务器无法成功 准备声明,PDO :: prepare() 返回FALSE或发出PDOException (取决于错误处理)。
您应该将服务器配置为返回那些PDO-Exceptions,这将告诉您为什么准备调用失败。
答案 2 :(得分:17)
我正在使用mysqli方法,并且在关闭第一个实例之前创建另一个mysqli实例时遇到了同样的错误。因此,在开始使用同一段代码之前使用close()
非常重要。例如:
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
$qSelect->close(); // <--- use close before calling the same function( wich contains $DBH code) again;
答案 3 :(得分:2)
看来准备工作非常愚蠢。它并不完全依赖于MySQL方面的查询,我的意思是,如果在您的查询中,您有一个恰好具有相同关键字名称的表,请说&#34; user&#34;, &#34; order&#34;,...,它只是没有将它识别为一个表,而是作为关键字命令实际执行的内容,因此查询结果是一团糟而且准备失败
要解决此问题很简单,您必须在&#34;中更正&#34;添加&#34;`&#34;在表名的两边。例如:
`user`, `order`, `...`
这是正确的,然而,我发现从准备这种行为中发现它很愚蠢。
答案 4 :(得分:1)
检查数据库中用户的权限。用户没有&#34;插入&#34;权限导致&#34;在非对象上调用成员函数bind_param()&#34;尝试插入时也会出现错误消息。
答案 5 :(得分:1)
只有尝试帮助没有像我这样的PHP经验的人。
在我的情况下发生此错误,因为我在SQL sintax中有错误。控制台堆栈跟踪不会显示此问题。
当我修复SQL时,proccess一切正常。