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 ユーザー権限にかかっていました。選択、削除などは許可されていましたが、更新は許可されていませんでした。ばかげた間違いですが、見つけるのは難しいです。

最初にコードを調べて構文エラーをチェックすることでこれを発見しましたが、ローカルホストマシンでは機能しましたが、オンラインサーバーでは機能しなかったため、エラーは発生しませんでした. この場合、サーバーのセットアップまたは接続の問題に関係しているに違いありません。コードの問題は除外されました。

他のクエリが正常に機能していたため、接続できませんでした。これにより、さらに困惑しました。そこで、同じコードで別のクエリを試すことにしました。更新する代わりにデータベースから選択しようとしたところ、うまくいきました。これは、それが mysql ユーザー権限の 1 つにすぎないことを意味していました。データベースに接続するときは、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

私はあなたが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 に答える