本问题已经有最佳答案,请猛点这里访问。
我正在尝试在此准备好的语句中绑定变量,但我一直收到错误:
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);
}
我知道函数没有完全写在这里,但这不应该是一个问题。 我不明白为什么我会收到此错误。
var_dump($qSelect)检查它是否符合您的想法。
好吧,prepare()失败的原因之一是,如果发送给它的sql语句在当前数据库中无效。
prepare()然后将返回false。
例如-如果表名不正确或者查询中的一个或多个字段不存在。
完美的信息。
谢谢! 那对我很有帮助。 :)
如错误消息所述,$qSelect似乎不是对象。尝试在准备调用之后使用var_dump($qSelect);进行调试。还检查getDBH()是否返回您需要的内容。
听起来像prepare-call失败了(不知道为什么),所以它返回false-false不是对象,因此您不能在该对象上调用bind_param()。
编辑:您尚未提供该信息,但似乎您正在使用PHP的PDO。在这种情况下,请查看文档。
If the database server successfully
prepares the statement, PDO::prepare()
returns a PDOStatement object. If the
database server cannot successfully
prepare the statement, PDO::prepare()
returns FALSE or emits PDOException
(depending on error handling).
您应该将服务器配置为返回那些PDO异常,这将告诉您为什么prepare调用失败。
是的,它的qSelect返回bool(false),但这没有任何意义,因为我有一个几乎相同的函数,并且可以正常工作。
我正在使用mysqli
嗯 我也处于一种功能几乎相同的情况。 原来,我已经复制并粘贴了它以便添加字段。 但是我忘记了在新领域之前的逗号! 愚蠢的错误,但这只是表明它可能只是您的输入错误。
我也使用mysqli方法,并且在关闭第一个实例之前创建另一个mysqli实例时遇到了相同的错误。因此,在启动同一段代码之前使用close()很重要。例如:
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
$qSelect->close(); //
如果他多次使用该函数,我想他应该使用reset()而不是close(),并将prepare()移到funcion之外,例如,移至构造函数中,并将put语句移入如下属性:$ this- > qSelect。
看来准备工作很笨。它并不完全依赖于MySQL的查询,这意味着,如果在您的查询中,您有一个表恰好具有关键字的相同名称,例如" user"," order",... ,它只是不能将其识别为表,而是将其识别为关键字命令的实际作用,因此查询变成一团糟,并且prepare失败了。
要解决此问题很简单,您必须以"正确"的方式键入该名称,并在表名的两侧加上"`"。例:
`user`, `order`, `...`
没错,但是,我发现从准备这种行为开始就很愚蠢。
仅用于尝试帮助没有PHP经验的人像我一样。
就我而言,发生此错误是因为我在SQL sintax中出错。控制台堆栈跟踪不显示此问题。
当我修复SQL时,过程正常。
检查数据库中用户的权限。没有"插入"权限的用户在尝试插入时也会导致"在非对象上调用成员函数bind_param()"消息错误。