调用一个非对象成员函数bind_param()

我想在这个准备好的语句中绑定一个variables,但是我一直收到错误:

Call to a member function bind_param() on a non-object 

该函数被调用,并将variables传递给它。 当我更改函数只是回显variables,variables打印在页面上罚款,但如果我尝试绑定在这里我收到错误。 谁能帮忙?

 //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); } 

我知道这个函数并不完全写在这里,但是这不应该是一个问题。 我不明白为什么我收到这个错误。

如错误消息所示, $qSelect似乎不是一个对象。 尝试通过使用var_dump($qSelect);来debugging这个var_dump($qSelect); 在您的预备电话之后。 还要检查getDBH()返回你所需要的。

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

编辑:你没有提供的信息,但它看起来像你使用PHP的PDO。 在这种情况下,请查看文档 。

如果数据库服务器成功准备语句,则PDO :: prepare()将返回一个PDOStatement对象。 如果数据库服务器无法成功准备语句,则PDO :: prepare()返回FALSE或发出PDOException(取决于error handling)。

你应该configuration你的服务器返回这些PDO-Exceptions,它会告诉你为什么准备呼叫失败。

那么, prepare()可能会失败的一个原因是 –

 if the sql statement sent to it is not valid in the current DB. 

prepare()将返回false。

例如 – 如果表名不正确或查询中有一个或多个字段不存在

我也使用mysqli的方法,并得到了同样的错误,当我closures第一个实例之前创buildmysqli的另一个实例。 所以在启动相同的代码之前使用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; 

看来,准备是相当愚蠢的。 它并不完全依赖于MySQL方面的查询,我的意思是,如果在你的查询中,你有一个恰好与关键字名称相同的表,比如说“user”,“order”,… ,它只是不认识它作为一个表,而是作为关键字命令实际上做,所以查询变成一团糟,准备失败。

要解决这个问题很简单,你必须以“正确”的方式在表名两边添加“`”。 例:

 `user`, `order`, `...` 

这是正确的,然而,我觉得从准备这个行为是愚蠢的。

检查数据库中用户的权限。 没有“插入”权限的用户在尝试插入时也会导致“在非对象上调用成员函数bind_param()”的消息错误。

只是为了帮助没有像我这样的PHP经验的人。

在我的情况下,这个错误发生,因为我在SQL sintax中有一个错误。 控制台堆栈跟踪不显示此问题。

当我解决了SQL的过程没有问题。