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