データベース操作にPHPのMySQLI拡張機能を使用する場合、 next_result()関数は、複数の結果セット(たとえば、複数のSQLステートメントを実行するMulti_Query()呼び出しを含むクエリを処理するためによく使用されます。ただし、開発者は、関数がfalseを返すことがあることがある場合があります。これにより、その後の結果セットが利用できなくなる可能性があります。では、 next_result()がfalseを返す理由は何ですか?それをトラブルシューティングと解決する方法は?
この記事では、この問題を詳細に分析します。
mysqli :: next_result()は、 multi_query()で使用される次の結果セットに移動するために使用される方法です。通常、マルチステートメントクエリを実行するときは、各結果を1つずつ設定するために使用する必要があります。
基本的な使用例:
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "Query Error: " . $mysqli->error;
}
最も一般的な理由は、すべての結果セットが読み取られていることです。現時点では、 next_result()を呼び出すとfalseが返され、「これ以上の結果はありません」を示します。
解決策:サイクル終了条件を合理的に制御するだけで、追加の処理は必要ありません。
Multi_Query()によって実行された複数のSQLステートメントの1つが失敗した場合、 next_result()はfalseを返し、 $ mysqli->エラーには特定のエラー情報があります。
例:
$sql = "SELECT * FROM valid_table; SELECT * FROM invalid_table;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// 処理結果
$result->free();
} else {
if ($mysqli->errno) {
echo "Error: " . $mysqli->error;
break;
}
}
} while ($mysqli->next_result());
}
前の結果セットが正しくリリースされていない場合、またはstore_result()を介して明示的に抽出されない場合、特にPHPまたはMySQLの古いバージョンでnext_result()に問題を引き起こす可能性があります。
提案:結果コンテンツを処理しない場合でも、常に$ result-> free()または$ mysqli-> store_result()を呼び出します。
Multi_Query()は複数のステートメントをサポートしていますが、すべてのタイプのステートメントの組み合わせをサポートしていません。たとえば、特定のDDLステートメント(作成手順など)を厳密なモードで実行することが制限される場合があります。
提案:すべてのステートメントが合法であることを確認し、必要に応じてトラブルシューティングに$ mysqli->エラーを使用してください。
すべてのエラープロンプトを有効にするには、 error_reporting(e_all)を使用します。
詳細なエラー情報については、 $ mysqli-> errnoおよび$ mysqli->エラーを確認してください。
ロギング:各next_result()のnext_result()の値とエラー出力をログに書き込み、簡単にトラブルシューティングを行います。
mysqli_more_results()を使用して、結果セットがまだあるかどうかを判断します。
if ($mysqli->more_results()) {
$mysqli->next_result();
}
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders WHERE order_date > '2024-01-01'";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo "データ: " . implode(", ", $row) . "<br>";
}
$result->free();
} else {
if ($mysqli->errno) {
echo "間違い: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo "最初のクエリに失敗しました:" . $mysqli->error;
}