我正在尝试在此准备好的语句中绑定变量,但我不断收到错误:

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)检查它是否符合您的想法。

#1 楼

如错误消息所述,$qSelect似乎不是对象。尝试在您的prepare-call之后使用var_dump($qSelect);调试它。还检查getDBH()是否返回所需的信息。

诸如prepare-call之类的声音失败(不知道为什么),因此它返回false-false不是对象,因此无法调用bind_param()

编辑:您尚未提供该信息,但似乎您正在使用PHP的PDO。在这种情况下,请查看文档。


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


您应该配置服务器以返回那些PDO异常,这将告诉您为什么prepare调用失败。

评论


是的,它的qSelect返回bool(false),但这没有任何意义,因为我有一个几乎相同的函数,并且可以正常工作。

–mcbeav
2010-12-20 9:13

嗯我也处于一种功能几乎相同的情况。原来,我已经复制并粘贴了它以便添加字段。但是我忘记了在新领域之前的逗号!愚蠢的错误,但这只是表明它可能只是您的输入错误。

–汤姆·麦吉(Tom McGee)
17年1月30日在21:41

#2 楼

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

prepare()然后将返回false。

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

评论


谢谢!那对我很有帮助。 :)

–ankush981
2014年12月27日在17:20

#3 楼

我也使用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;


评论


如果他多次使用该函数,我想他应该使用reset()而不是close(),然后将prepare()移到funcion之外,例如,移入构造函数中,然后将put语句移入如下属性:$ this- > qSelect。

– qdinar
16年8月24日在19:50

#4 楼

看来准备工作很笨。它并不完全依赖于MySQL的查询,这意味着,如果在您的查询中,您有一个表恰好具有关键字的相同名称,例如“ user”,“ order”,...。 ,它只是不能将其识别为表,而是将其识别为关键字命令的实际作用,因此查询变得一团糟,并且prepare失败。

要解决此问题很简单,您必须以“正确”的方式键入它,在表名的两边都加上“`”。示例:

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


这是正确的,但是我发现从准备这种行为很愚蠢。

#5 楼

我正在尝试帮助像我这样在PHP方面经验很少的其他人。

就我而言,发生此错误是因为我遇到了SQL语法错误。控制台堆栈跟踪未显示问题。

修复SQL时,错误消失了。

#6 楼

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