在非对象上调用成员函数bind_param()

mcb*_*eav 27 php mysqli prepared-statement

我试图在这个准备好的语句中绑定一个变量,但我一直收到错误:

Call to a member function bind_param() on a non-object
Run Code Online (Sandbox Code Playgroud)

调用该函数,并将变量传递给它.当我将函数更改为仅回显变量时,变量在页面上打印正常,但如果我尝试在此处绑定它,则会收到错误.有人可以帮忙吗?

//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);
}
Run Code Online (Sandbox Code Playgroud)

我知道这里没有完全写出这个功能,但这应该不是问题.我不明白为什么我收到这个错误.

小智 69

好吧,一个原因prepare()可能是失败的,如果发送给它的sql语句在当前数据库中无效.

prepare() 然后将返回false.

例如 - 如果表名不正确或查询中的一个或多个字段不存在.


oez*_*ezi 24

正如错误信息所说,$qSelect似乎不是一个对象.尝试var_dump($qSelect);在准备通话后立即使用调试.还要检查是否getDBH()返回你需要的东西.

听起来像准备调用失败(不知道为什么),所以它返回false- false不是一个对象,所以你不能调用bind_param()它.

编辑:你没有给出信息,但看起来你正在使用PHP的PDO.在这种情况下,请查看文档.

如果数据库服务器成功准备语句,PDO :: prepare()将返回PDOStatement对象.如果数据库服务器无法成功准备语句,PDO :: prepare()将返回FALSE或发出PDOException(取决于错误处理).

您应该将服务器配置为返回那些PDO-Exceptions,这将告诉您为什么prepare调用失败.


小智 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;
Run Code Online (Sandbox Code Playgroud)