2010-12-20 99 views
23

我想在这个准备好的声明一个变量绑定,但我不断收到错误:调用一个成员函数bind_param()一个非对象

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

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

+3

'var_dump($ qSelect)'来检查它是否是你认为的。 – Mchl 2010-12-20 08:43:41

回答

23

作为错误消息说,$qSelect似乎不是一个对象。尝试通过使用var_dump($qSelect);在您的准备呼叫之后进行调试。还请检查getDBH()是否会返回您所需的内容。

听起来像准备呼叫失败(不知道为什么),所以它返回false - false是不是一个对象,所以你不能呼吁bind_param()就此。

编辑:你没有给出信息,但它看起来像你使用PHP的PDO。在这种情况下,请看the documentation

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-异常,它会告诉你为什么准备调用失败。

+0

是的,它的qSelect正在返回布尔(假),但这没有任何意义,因为我有一个几乎相同的功能,它工作正常。 – mcbeav 2010-12-20 09:13:21

+0

我正在使用mysqli – mcbeav 2010-12-20 09:13:44

+0

嗯。我也处于具有几乎相同功能的情况。事实证明,我已经复制并粘贴它,以添加一个字段。但我在新领域之前忘了逗号!愚蠢的错误,但它只是表明,它可能只是您输入的错误。 – 2017-01-30 21:41:07

67

好,一个原因准备()可以失败是 -

if the sql statement sent to it is not valid in the current DB. 

准备(),然后将返回false。

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

+0

完美信息。 – ripa 2014-04-09 05:32:23

+0

谢谢!这帮助了我很多。 :) – dotslash 2014-12-27 17:20:16

17

我正在使用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; 
+0

如果他多次使用这样的函数,我认为他应该使用reset()而不是close(),并且将funcion之外的prepare()移动到构造函数中,像这样将put语句放入属性中: $ this-> qSelect。 – qdinar 2016-08-24 19:50:07

2

看起来准备很愚蠢。它不会完全依赖于MySQL的查询,我的意思是,如果在你的查询中,你有一个恰好与关键字名称相同的表,比如说“user”,“order”...... ,它只是不会将其识别为表格,而是将其视为关键字命令实际执行的内容,因此查询结果变得混乱,准备失败。

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

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

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

1

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

1

只用于帮助没有像我这样的PHP经验的人。

在我的情况下,这个错误发生,因为我在SQL sintax中有一个错误。控制台堆栈跟踪不显示此问题。

当我修复SQL的过程没有问题。

相关问题