데이터베이스 작업에 PHP를 사용할 때 많은 개발자가 MySQLI 확장을 선택하여 여러 쿼리를 수행합니다. 이 시나리오에서는 next_result () 메소드가 편리합니다. 그러나이 방법을 사용하는 데는 주목할만한 함정이 있습니다. PDO와의 차이를 이해하고 더 나은 대안이 있는지 탐구하는 것은 강력하고 유지 관리 가능한 시스템을 구축하는 데 매우 중요합니다.
Next_result () 는 MySQLI 확장자가 다중 쿼리를 처리하기 위해 제공하는 메소드입니다. 그 목적은 데이터베이스 클라이언트에게 다음 결과 세트를 계속 읽도록 지시하는 것입니다.
일반적인 사용 시나리오는 다음과 같습니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
$query = "CALL complex_procedure(); SELECT * FROM another_table;";
if ($mysqli->multi_query($query)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
}
이 예에서는 Next_Result ()가 여러 결과 세트간에 전환 할 책임이 있습니다.
편리 해 보이지만 Next_result () 의 사용은 약간의 함정을 숨 깁니다.
쿼리가 실패하면 next_result ()가 예외를 직접 던지지 않으면 $ mysqli-> 오류를 통해 오류를 수동으로 감지해야합니다. 또한, 이전 결과 세트를 올바르게 정리하지 않으면 ( store_result () 및 free () 를 통해 (를 통해) Next_Result ()가 실패하여 후속 쿼리 결과가 처리되지 않습니다.
자원을 올바르게 해제하지 않으면 특히 동시 동시성 환경에서 메모리 문제가 발생할 수 있습니다.
다중 계산 처리 로직은 일반적으로 길고 유지 관리가 어려워지고 디버그하기가 더 어렵습니다.
PDO는 다중 상태 쿼리의 결과 처리 방법을 직접 지원하지 않습니다. pdo :: exec ()를 사용하여 여러 문을 실행할 수 있지만 mysqli :: next_result () 와 같은 여러 결과 세트를 처리 할 수 없습니다.
몇 가지 주요 차이점은 다음과 같습니다.
특성 | mysqli ( next_result () ) | pdo |
---|---|---|
다중 상태 쿼리를 지원합니다 | 예 | 예 (제한) |
여러 결과 세트를 처리합니다 | 예 | 아니요 |
예외 처리 메커니즘 | 약합니다 | 더 강한 (pdoexception을 통해) |
단순성과 보안 코딩 | 낮추다 | 더 높은 |
매개 변수 바인딩 지원 | 예 | 예 |
응용 프로그램이 여러 결과 세트를 처리 해야하는 경우 MySQLI는 보다 간단한 선택입니다. 그러나 피할 수 있다면 PDO를 사용하면 보안 및 코드 유지 관리가 향상됩니다.
Multi_Query ()를 사용하지 말고 대신 쿼리를 별도로 실행하여 오류 추적 및 디버깅이 더 쉬울 수 있습니다.
$stmt1 = $pdo->prepare("CALL complex_procedure()");
$stmt1->execute();
$stmt2 = $pdo->prepare("SELECT * FROM another_table");
$stmt2->execute();
$data = $stmt2->fetchAll(PDO::FETCH_ASSOC);
최신 PHP 프레임 워크는 데이터베이스 액세스를위한보다 우아한 캡슐화 방법을 제공하여 기본 복잡한 처리 로직을 숨 깁니다. 예를 들어, Laravel의 Eloquent ORM은 다중 상태 쿼리를 지원하지 않으므로 개발자는 더 명확한 코드를 작성해야합니다.
여러 결과 세트가 실제로 필요한 경우 저장된 프로 시저에 로직을 작성하고 서비스 클래스에서 처리 로직을 캡슐화하여 컨트롤러 계층에서 mysqli :: next_result ()를 직접 작동 할 필요성을 최소화하는 것이 좋습니다.
mysqli :: next_result ()는 여러 결과 세트에 대한 처리 능력을 제공하지만 복잡성과 잠재적 문제는 무시할 수 없습니다. 비즈니스 로직에서 직접 의존하지 않고 PDO 또는 ORM 프레임 워크를 사용하여 단일 쿼리 실행과 같은 명확하고 유지 가능한 대안을 사용하십시오. Next_result ()는 실제로 필요한 경우에만주의해서 사용해야합니다.
?? 팁 : 프로덕션 환경에서 다중 경영 쿼리를 사용하는 경우 적절한 데이터베이스 권한 및 매개 변수 바인딩을 활성화하고 SQL 주입 공격을 방지하기 위해 쿼리에 직접 입력하는 것을 피하십시오.
코드 예제를 테스트하려면 위의 코드를 개발 환경에 배포 할 수 있습니다 (예 : https://gitbox.net/test-db-script.php ).