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 () 와 함께 조합 쿼리를 구현할 수 있습니다. 여러 진술을 하나씩 실행 해야하는 경우 다음은 실현 가능하고 안전한 방법입니다.
$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