2013-10-21 55 views
0

我知道这是一个常见的错误,但我无法弄清楚这一点,我已经有了足够的头部划痕。PHP致命错误:调用一个非对象的成员函数bind_param()

当我运行此代码更新数据库条目时,我得到此错误。

ERROR : Call to a member function bind_param() on a non-object 

$firstName = "Jack"; 
$username = "JackTrow"; 

$query = " 
    UPDATE users SET 
    first_name=? 
    WHERE username=? 
    "; 
    $statement = $DatabaseHandler->getMysqli()->prepare($query); 
    $statement->bind_param('ss', 
    $firstName, $username); 
    $statement->execute(); 
    $statement->free_result(); 

我只是不明白这是怎么尽可能然而,当上传到我的VPS它标志了这个错误此代码的工作在我的本地罚款。任何可能的想法?

+0

$ statement的类型是什么? prepare()函数可能不工作(无论出于何种原因,数据库连接错误等)并返回FALSE。 – initramfs

+0

由于它听起来像是服务器配置错误,请检查phpinfo()的输出并查看是否安装了mysqli模块。 –

+0

此代码在我的网站上运行,并且所有其他数据库通信都可以运行,并且它是mysqli语句 –

回答

3

要回答我的问题是下到mysql用户权限。它允许选择,删除等,但不更新。愚蠢的错误,但它很难找到。

我通过首先查看代码并检查任何语法错误发现了这一点,但它们不能在我的本地主机上运行,​​但不能在我的在线服务器上运行。有了这种情况,它必须与我的服务器设置或连接问题;代码问题被排除了。

它不可能是连接,因为其他查询工作正常,这让我更难倒了。所以我决定尝试使用相同代码的另一个查询,我试图从数据库中选择而不是更新,并且它工作。这意味着它只能是mysql用户权限的一件事。当你连接到使用mysql用户连接的数据库时,你可以允许/禁止它允许执行的查询类型;我没有添加允许更新查询。所以我登录到cPanel并将其更改为允许它工作!

+2

如果您添加了您发现的情况,我确信其他人对此非常感激。 –

+0

我在考虑加入,但是以为人们只想直接找到答案,但你是对的;有疯狂的方法,它的答案和答案一样好。 –

+0

这些谁看起来学习,但不明白不欢迎在这里。我通常会冷静地回答没有教导但只是提供解决方案的答案。有很多蹩脚的'开发者论坛'在那里提供代码片段作为解决方案,没有任何解释。你可以很容易地看到谁访问他们,因为答案总是“你可以试试这个:[大块代码]” –

0

你似乎使用的MySQLi:

bind_param() 

你可能想看看PDO,你可以使用bindParam代替。

它会是这样的:

$statement->bindParam (1 , $firstName); 
$statement->bindParam (2 , $username); 
+1

他没有收到'undefined method'错误。 – webbiedave

+0

我试图出于好奇,因为得到相同的错误,调用成员函数bindParam()在非对象 –

+0

-1 [bind_param](http://php.net/manual/en/mysqli-stmt.bind -param.php)当然*不存在。它不存在于* PDO *类中,但它在** MySQLi **接口中。 – cwallenpoole

0

我相信你AR使用PDO吗? 尝试这种方式

/* Execute a prepared statement by binding PHP variables */ 
$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < :calories AND colour = :colour'); 
$sth->bindParam(':calories', $calories, PDO::PARAM_INT); 
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); 
$sth->execute(); 
+0

此语句是一个mysqli不是pdo,对于不包括在问题 –

+5

不抱歉,他使用** MySQLi ** – Yang

1

从文档:

mysqli_prepare()/ MySQL的准备::()返回一个语句对象或FALSE如果错误发生 。

听起来像一个连接问题,因为它在你的本地机器上工作“很好”。 为了确保这一点,你可以测试它喜欢,

$statement = $DatabaseHandler->getMysqli()->prepare($query); 

if (is_object($statement)) { 
    // Here it returned Statement object 
    // So it's kinda safe to call bind_param() 
    $statement->bind_param('ss'.....  
} else { 
    // Seems like its FALSE now, because of connection issues 
    die('Jeez, connection issue') 
} 
+1

该脚本返回“ Jeez,连接问题“,因此它们必须是连接问题,但是当我从数据库中查询并选择数据时,它们都很好;哦,我想我只是想出了它,它必须是我设置给数据库用户的特权,只有解释。 –

+0

是的,唯一的可能性是特权和唯一的,当然 – Yang

+0

Yesss!它的工作原理,改变了允许更新的权限,并像梦一样工作,想知道为什么这个查询不起作用,其他人都感谢你的帮助。 –

0

第一个;总是尝试在本地主机上运行查询以查看它是否正常运行,并且始终确保表中的字段名称与您在查询中的字段名称相对应

相关问题