Codeigniter (특히 CodeIgniter 3)를 사용하는 개발 프로세스 동안, 때로는 여러 SQL 쿼리를 포함하는 명령문 블록 (멀티 쿼리)을 실행해야합니다. 예를 들어, 한 번에 여러 저장된 절차를 호출하거나 효율성을 향상시키기 위해 한 번의 요청에서 여러 쿼리를 실행할 수 있습니다.
그러나 멀티 스테이트 쿼리를 사용하는 경우 일반적인 문제는 다음과 같습니다. 첫 번째 결과 세트 만 액세스 할 수 있고 다른 결과 세트를 얻을 수 없습니다 . Codeigniter는 MySQLI 드라이버를 사용할 때 여러 결과 세트를 자동으로 처리하지 않기 때문입니다. 이 문제를 해결하려면 이전 결과 세트를 정리하고 다음 결과를 위해 시스템을 준비하려면 $ this-> db-> next_result () 메소드를 수동으로 호출해야합니다.
이 기사에서는 CodeIgniter에서 Next_result ()를 올바르게 사용하여 다중 성분 쿼리를 처리하는 방법을 보여줍니다.
저장된 프로 시저 파일이 있거나 컨트롤러에서 다음과 같이 SQL을 실행한다고 가정합니다.
$sql = "
CALL get_users();
CALL get_orders();
";
이 유형의 다중 상태 SQL을 실행하려면 Query () 메소드를 사용하고 결과 세트를 수동으로 관리 할 수 있습니다.
$result = $this->db->query("CALL get_users();");
if ($result) {
$users = $result->result();
// 첫 번째 결과 세트를 정리하십시오
$result->free_result();
$this->db->next_result();
// 두 번째 결과 세트를 가져옵니다
$result2 = $this->db->query("CALL get_orders();");
if ($result2) {
$orders = $result2->result();
// 다시 정리하십시오
$result2->free_result();
$this->db->next_result();
}
}
이 방법은 한 번에 하나의 저장된 절차 만 호출 한 다음 다음 명령문을 수동으로 실행하는 데 적합합니다. 그러나 예를 들어 여러 SQL 문을 한 번에 실행하려면 다음과 같습니다.
$sql = "
CALL get_users();
CALL get_orders();
CALL get_products();
";
MySQLI의 기본 Multi_Query () 함수를 사용하여 구현할 수 있습니다.
Codeigniter에서 MySQLI 드라이버를 사용하는 경우 다음을 수행 할 수 있습니다.
$mysqli = $this->db->conn_id; // 기본을 얻으십시오 MySQLi 리소스에 연결하십시오
$sql = "
CALL get_users();
CALL get_orders();
CALL get_products();
";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// 현재 결과 세트를 처리하십시오
$data[] = $result->fetch_all(MYSQLI_ASSOC);
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
이 코드는 여러 결과 세트를 차례로 가져오고 다음 _result ()를 사용하여 다음 단계를 준비합니다.
Multi_Query ()를 직접 사용할 수 있지만, 특히 보안 및 안정성에 대한 요구 사항이 높은 경우 여러 문장을 개별적으로 실행하는 것이 좋습니다 . 데이터베이스 작업의 경우 다음과 같은 관행이 권장됩니다.
연결을 정리하려면 각 쿼리 후 Free_result () 및 Next_result ()를 호출하십시오.
모델에서 여러 통화를 직접 쓰지 말고 대신 한 번의 통화로 캡슐화하면 논리적 제어가 PHP 계층에 배치됩니다.
multi_query ()를 사용해야하는 경우 반환 된 모든 결과 세트를 처리하고 "동기화 된 명령"오류를 피하십시오.
이 프로세스를 모델 방법으로 캡슐화하고 여러 데이터 세트가 포함 된 배열을 반환 할 수 있습니다.
public function get_multi_data()
{
$mysqli = $this->db->conn_id;
$sql = "
CALL get_users();
CALL get_orders();
CALL get_products();
";
$data = [];
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
$data[] = $result->fetch_all(MYSQLI_ASSOC);
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
return $data;
}
컨트롤러에서 다음과 같이 부를 수 있습니다.
$this->load->model('Data_model');
$result_sets = $this->Data_model->get_multi_data();
$users = $result_sets[0];
$orders = $result_sets[1];
$products = $result_sets[2];
다중 상태 쿼리를 디버깅 할 때 Codeigniter의 로깅 기능을 활성화하고 응용 프로그램/로그 에서 내용을 관찰하여 문제 해결 오류를 용이하게하는 것이 좋습니다.