mysqli :: real_Query()は、PHPのMySQLI拡張機能によって提供される低レベルの関数であり、結果をすぐに設定せずにSQLクエリステートメントをMySQLサーバーに送信するために使用されます。そのコア設計は、 store_result()およびuse_result()で使用され、開発者が結果を処理する前に動作を細かく制御できるようにし、複数のクエリを実行するときに明確な実行プロセスを維持することさえできます。
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users";
$mysqli->real_query($sql);
$result = $mysqli->store_result();
Real_Query()自体は、複数のクエリステートメントの実行を一度にサポートしていません(セミコロンで区切られています)が、関数への呼び出しを複数回制御することでこの動作をシミュレートするか、 Multi_Query()と組み合わせて組み合わせクエリを実装できます。複数のステートメントを1つずつ実行する必要がある場合、以下はそれに対処するための実行可能で安全な方法です。
$queries = [
"INSERT INTO logs (event) VALUES ('login')",
"UPDATE users SET last_login = NOW() WHERE id = 1",
"SELECT * FROM users WHERE id = 1"
];
foreach ($queries as $query) {
if (!$mysqli->real_query($query)) {
echo "Query failed: " . $mysqli->error;
continue;
}
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
}
Real_Query()を使用して複数のクエリを実行する間、複雑なビジネスロジックをトランザクションメカニズムと組み合わせて実装できます。
$mysqli->begin_transaction();
try {
$mysqli->real_query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$mysqli->real_query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
error_log($e->getMessage());
}
Real_Query()は基礎となる機能ですが、前処理メカニズムと組み合わせて使用する必要があります。前処理ができない状況では、 real_escape_string()を使用してユーザー入力をエスケープしてください。
$name = $mysqli->real_escape_string($_GET['name']);
$sql = "SELECT * FROM users WHERE name = '$name'";
$mysqli->real_query($sql);
$result = $mysqli->store_result();
開発者がSQLの実行プロセスをより明確に理解できるようにするために、 Real_Query()への各呼び出し後の現在の実行ステートメントと実行時間を記録できます。
$start = microtime(true);
$mysqli->real_query($sql);
$duration = microtime(true) - $start;
file_put_contents('/var/log/sql_exec.log', "Executed in $duration: $sql\n", FILE_APPEND);
インターフェイスから構造化されたデータを返してからSQLに変換するなど、いくつかの生成SQLにReal_Query()を使用する場合があります。
$data = file_get_contents('https://gitbox.net/api/v1/users');
$users = json_decode($data, true);
foreach ($users as $user) {
$name = $mysqli->real_escape_string($user['name']);
$mysqli->real_query("INSERT INTO users (name) VALUES ('$name')");
}
Real_Query()はより詳細なコントロールを提供しますが、根本的な機能によりエラーが発生しやすくなります。開発者はそれを使用する必要があります:
クエリが結果を返すかどうかを明確にするため。
結果セットリソースを手動で管理します。
エラー処理ロジックに注意してください。
冗長コードを引き起こすための乱用を避けてください。
全体として、 REAL_QUERY()は、SQL実行のためにより深い制御ニーズがある場合に強力なツールであり、特に中および高複雑さのデータ処理またはデータベースミドルウェアの実装に適しています。トランザクション、結果処理、ロギングメカニズムの使用と組み合わせることで、その利点は極端にもたらすことができます。
関連タグ:
SQL