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

Php 对非对象调用成员函数bind_param(),php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我试图在这个准备好的语句中绑定一个变量,但我一直收到错误: 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 =

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

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

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

正如错误消息所述,
$qSelect
似乎不是对象。尝试通过使用
var\u dump($qSelect)调试此文件就在您准备通话后。还要检查
getDBH()
是否返回所需的内容

听起来prepare调用失败了(不知道为什么),因此它返回
false
-
false
不是对象,因此不能对其调用
bind_param()

编辑:您尚未提供信息,但看起来您正在使用PHP的PDO。在这种情况下,请看一看

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


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

嗯,
prepare()
失败的一个原因是发送给它的sql语句在当前数据库中无效

prepare()
然后将返回false


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

,我也在使用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;
$DBH=getDBH();
$qSelect=$DBH->prepare(“从用户名=?”的用户中选择*”;
$qSelect->bind_参数(“s”,$username);

$qSelect->close();// 看来准备是相当愚蠢的。它并不完全依赖于MySQL端的查询,我的意思是,如果在您的查询中,有一个表恰好有一个关键字的相同名称,比如“user”、“order”…,它只是不将其识别为一个表,而是识别为关键字命令实际执行的操作,因此查询结果是一团混乱,准备工作就失败了

要解决这个问题很简单,您必须以“正确”的方式键入它,并在表名的两侧添加“`”。例如:

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

这是正确的,但是,我觉得准备这种行为很愚蠢。

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

我正在尝试帮助像我这样对PHP没有什么经验的其他人

在我的例子中,发生这个错误是因为我有一个SQL语法错误。控制台堆栈跟踪没有显示问题


当我修复SQL时,错误消失了。

var\u dump($qSelect)
来检查它是否是您认为的。是的,它的qSelect返回bool(false),但这没有任何意义,因为我有一个几乎相同的函数,它工作正常。Hm。我也有一个功能,实际上是相同的情况。事实证明,为了添加一个字段,我复制并粘贴了它。但是我忘记了新字段前面的逗号!这是个愚蠢的错误,但它表明这可能只是你的打字错误。谢谢!这对我帮助很大如果他多次使用这样的函数,我认为,他应该使用reset()而不是close(),并将prepare()移到函数之外,例如,移到构造函数中,将put语句移到属性中,如:$this->qSelect。