0

我知道这是一个常见的错误,但我就是想不通,而且我已经受够了挠头。

每当我运行此代码来更新数据库条目时,我都会收到此错误。

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 时,它会标记这个错误。有什么可能的想法吗?

4

5 回答 5

3

要回答我自己的问题,这取决于 mysql 用户权限。它允许选择、删除等。但不能更新。愚蠢的错误,但很难发现。

我通过首先查看代码并检查是否有任何语法错误发现了这一点,但它们不可能是任何错误,因为它在我的 localhost 机器上运行,而不是在我的在线服务器上运行。这种情况一定与我的服务器设置或连接问题有关;排除了代码问题。

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

于 2013-10-21T19:00:20.467 回答
1

从文档:

如果发生错误,mysqli_prepare()/MySQL::prepare() 返回一个语句对象或 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')
}
于 2013-10-21T18:43:18.783 回答
0

首先; 始终尝试在本地主机中运行查询以查看它是否运行没有错误,并且始终确保表中字段的名称与查询中的名称相对应

于 2013-12-26T00:23:08.287 回答
0

您似乎正在使用 MySQLi:

bind_param()

您可能想查看 PDO,您可以bindParam改用。

它会像:

$statement->bindParam ( 1 , $firstName );
$statement->bindParam ( 2 , $username );
于 2013-10-21T18:32:14.207 回答
0

我相信您使用 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();
于 2013-10-21T18:32:45.603 回答