3

私には少し(そしてばかげた)問題があります:mysqliとMySQLサーバーを使用してPHPアプリケーションを構築しています。アプリケーションがロードされると、$databaseという変数が次を使用して初期化されます。

$database = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);

もちろん、これは完全に機能します。クエリを実行するステートメントを作成する場合:

$stmt = $database->prepare('SELECT a, b, c FROM table WHERE a = ?');

これはまだ機能します。しかし、前のステートメントを閉じずに別のステートメントを作成しようとすると、うまくいくこともあれば、今はうまくいくこともあります。ステートメントの作成が失敗したときに発生するエラーは次のとおりです。

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

そして私の質問は:なぜですか?新しいステートメントを作成するたびに(そして別のステートメントを開くたびに)接続(new mysql(...))を開くにはどうすればよいですか?

$stmt = $database->prepare('SELECT a, b, c FROM table WHERE a = ?');
$stmt->bind_param('i', $aValue);
$stmt->execute();
/* do some other operations, without closing $stmt */
$stmt2 = $database->prepare('INSERT INTO table2 (e, f) VALUES (? ,?)');
// Now, $stmt2 isn't initialized, so when the next line is run, the app fails
$stmt2->bind_param('ss', $someValue, $anotherValue);

もし、前に

$stmt2 = $database->prepare('INSERT INTO table2 (e, f) VALUES (? ,?)');

シンプルなものを追加します

$stmt->close();

すべて問題なく動作します。それで、問題は何ですか?

4

2 に答える 2

2

前の結果をすべてフェッチするまで、別のクエリを実行することはできません。それ以外の場合は、別の接続を行う必要があります。

于 2012-08-08T18:40:19.430 に答える
0

bind_param&executeを覚えていますか?:

$stmt->bind_param("s", $string);
$stmt->execute();
//etc..

また

$stmt->bind_param("i", $int);
$stmt->execute();
//etc..

複数のクエリが必要な場合:チェックアウトmulti_query

于 2012-08-08T17:22:49.903 に答える