mysqli::real_query()是PHP 中mysqli擴展提供的一個低級函數,用於向MySQL 服務器發送一條SQL 查詢語句而不立即獲取結果集。其核心設計是與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()實現組合查詢。如果需要逐條執行多個語句,以下是一種可行且安全的處理方式:
$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);
有時你會將real_query()用於一些生成型SQL,例如從接口返回結構化數據再轉化為SQL:
$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