调用一个非对象成员函数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()
返回你所需要的。
听起来像准备调用失败(不知道为什么),所以它返回false
– false
不是一个对象,所以你不能调用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的过程没有问题。