PHPでは、MySQLI拡張機能を使用してデータベースを照会するとき、多くの開発者は混乱する質問に遭遇します。何が起こっているのですか?この記事は、一般的な誤解を整理し、問題の根本原因を見つけるのに役立ちます。
mysqli_multi_queryは、複数のSQLステートメントを一度に実行できる方法ですが、ブール値を返し、実際の結果セットはmysqli_store_resultまたはmysqli_use_resultを介して取得されます。
サンプルコード:
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM products;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
echo "現在の結果セット行数: " . $result->num_rows . "<br>";
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
?>
Multi_Query Return ValueでNum_Rowsを呼び出すと、もちろん0が取得されます。結果セットオブジェクトを正しく取得してください。
一部の開発者は$ stmt = $ mysqli-> prepare(...)を書き、 $ stmt-> num_rowsを直接使用しましたが、注: prepareはクエリを実行しない、それは単なる準備です。
クエリを最初に実行する必要があり、結果を取得する必要があります。
<?php
$stmt = $mysqli->prepare("SELECT * FROM users WHERE age > ?");
$stmt->bind_param("i", $age);
$age = 18;
$stmt->execute();
$result = $stmt->get_result();
echo "行数: " . $result->num_rows;
?>
実行またはget_resultをスキップすると、 num_rowsには話す方法がありません。
デフォルトでは、MySQLIはバッファークエリを使用しており、 Num_Rowsを直接使用できます。ただし、 mysqli_use_resultモードを使用する場合、結果セットはストリーミングであり、mysqlは通過する前に行の総数を計算できません。
例:
<?php
$result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT);
echo $result->num_rows; // 間違い:現時点では、行数は取得できません
解決策は、デフォルトのバッファリングモードを使用するか、統計を自分で繰り返すことです。
多くの人々は、 num_rowsを挿入、更新、削除で使用できると誤って信じています。実際、これらの操作には結果が設定されていないため、 $ mysqli-> riffected_rowsを使用する必要があります。
<?php
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "影響を受ける行の数: " . $mysqli->affected_rows;
?>
覚えておいてください: Selectクエリによって生成された結果セットのみがnum_Rowsを持っています。
num_rowsが常に0を返す場合は、最初に確認してください。
? Multi_Queryを使用しましたが、結果のセットを取得できませんでしたか?
?準備後に実行してget_resultを実行するのを忘れましたか?
?バッファーモードを使用しましたか?
?クエリタイプを間違えましたか?
これらの誤解を避けることにより、 mysqli_resultとnum_rowsを正しく使用して迂回することができます。