2

私はこの本当に単純なPHPコードを持っています:

$mysqli = new mysqli('localhost', 'xxx', 'xxxxx', 'xxx');

$query = "SELECT * FROM questions WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('d', $_GET['qid']);
$stmt->execute();
$stmt->bind_result($id, $content, $correct_ans, $lol);
$stmt->fetch();

//do sth with the data

$query = "SELECT * FROM answers WHERE question_id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('d', $_GET['qid']);
$stmt->execute();
$stmt->bind_result($id, $content, $lol);

while($stmt->fetch())
{
    //do sth
}

基本的に、私が何をしても2番目mysqli::prepare()は常にfalseを返すようmysqli::errorですが、何らかの理由で空です。誰でもここで間違いを見ることができますか?

PS。重複した質問ではありません。はい、すでに質問されています。MySQLi の準備済みステートメントは false を返しますが、作成者は自分の解決策を全員と共有することを気にしませんでした。

編集:これを説明する必要があると思いました:2番目の準備のみがfalseを返し、最初の準備はまったく問題ありません。さらに奇妙なのは、コードの最初の行 (つまり、最初の準備) を削除すると、2 番目の行が問題なく動作することです...

EDIT2:まあ、今言えることはWTFだけです。割り当てを削除すると、($stmt = prepare()...)関数を呼び出すだけでなく、$mysqli->errorリストが空ではありません-「コマンドが同期されていません。現在、このコマンドを実行できません」と表示されます。割り当てを行うと、 空っぽです...

EDIT3: PDO に切り替えましたが、完全に動作します。そうでないと証明できるまで、MySQLi にはバグがあると仮定します。

4

3 に答える 3

8

2 回目の使用の前に、 mysqli の結果を解放するか、現在の mysqli ステートメントを閉じるmysqli::prepare()必要があります。

...
//do sth with the data

$mysqli->free(); // or $stmt->close();

$query = "SELECT * FROM answers WHERE question_id = ?";
$stmt  = $mysqli->prepare($query);
...
于 2013-10-19T13:40:39.133 に答える