【问题标题】:Call to a member function bind_param() on a non-object [duplicate]在非对象上调用成员函数 bind_param() [重复]
【发布时间】:2011-05-28 03:29:46
【问题描述】:

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

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) 检查它是否是您认为的那样。

标签: php mysqli prepared-statement


【解决方案1】:

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

prepare() 然后将返回 false。

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

【讨论】:

  • 谢谢!这对我帮助很大。 :)
【解决方案2】:

正如错误消息所说,$qSelect 似乎不是一个对象。尝试在准备调用后立即使用var_dump($qSelect); 进行调试。还要检查getDBH() 是否返回您需要的内容。

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

编辑:您没有提供信息,但看起来您正在使用 PHP 的 PDO。在这种情况下,请查看the documentation

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

您应该配置您的服务器以返回那些 PDO 异常,这会告诉您准备调用失败的原因。

【讨论】:

  • 是的,它的 qSelect 正在返回 bool(false) 但这没有任何意义,因为我有一个几乎相同的功能并且它工作正常。
  • 嗯。我也处于具有几乎相同功能的情况。原来,我复制并粘贴它是为了添加一个字段。但是我忘记了新字段前的逗号!愚蠢的错误,但这只是表明它可能只是您的打字错误。
【解决方案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()移到函数之外,例如,进入构造函数,一个put语句进入这样的属性: $this->qSelect .
【解决方案4】:

看来 prepare 很愚蠢。它并不完全依赖 MySQL 端的查询,我的意思是,如果在您的查询中,您有一个恰好具有相同名称的关键字的表,例如“用户”、“订单”... ,它只是不将其识别为表,而是将其识别为关键字命令实际执行的操作,因此查询结果变得一团糟,并且准备失败。

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

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

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

【讨论】:

    【解决方案5】:

    我正在努力帮助像我一样在 PHP 方面缺乏经验的其他人。

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2013-09-26
        • 1970-01-01
        • 2015-10-24
        • 2015-02-02
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        相关资源
        最近更新 更多