현재 위치: > 최신 기사 목록> Codeigniter의 Next_result ()를 다중 상태 쿼리를 처리합니다

Codeigniter의 Next_result ()를 다중 상태 쿼리를 처리합니다

gitbox 2025-05-06

Codeigniter (특히 CodeIgniter 3)를 사용하는 개발 프로세스 동안, 때로는 여러 SQL 쿼리를 포함하는 명령문 블록 (멀티 쿼리)을 실행해야합니다. 예를 들어, 한 번에 여러 저장된 절차를 호출하거나 효율성을 향상시키기 위해 한 번의 요청에서 여러 쿼리를 실행할 수 있습니다.

그러나 멀티 스테이트 쿼리를 사용하는 경우 일반적인 문제는 다음과 같습니다. 첫 번째 결과 세트 만 액세스 할 수 있고 다른 결과 세트를 얻을 수 없습니다 . Codeigniter는 MySQLI 드라이버를 사용할 때 여러 결과 세트를 자동으로 처리하지 않기 때문입니다. 이 문제를 해결하려면 이전 결과 세트를 정리하고 다음 결과를 위해 시스템을 준비하려면 $ this-> db-> next_result () 메소드를 수동으로 호출해야합니다.

이 기사에서는 CodeIgniter에서 Next_result ()를 올바르게 사용하여 다중 성분 쿼리를 처리하는 방법을 보여줍니다.

기본 예 : multi_querynext_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 () 함수를 사용하여 구현할 수 있습니다.

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 ()를 사용하여 다음 단계를 준비합니다.

Codeigniter의 올바른 사용에 대한 권장 사항

Multi_Query ()를 직접 사용할 수 있지만, 특히 보안 및 안정성에 대한 요구 사항이 높은 경우 여러 문장을 개별적으로 실행하는 것이 좋습니다 . 데이터베이스 작업의 경우 다음과 같은 관행이 권장됩니다.

  1. 연결을 정리하려면 각 쿼리 후 Free_result ()Next_result ()를 호출하십시오.

  2. 모델에서 여러 통화를 직접 쓰지 말고 대신 한 번의 통화로 캡슐화하면 논리적 제어가 PHP 계층에 배치됩니다.

  3. 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의 로깅 기능을 활성화하고 응용 프로그램/로그 에서 내용을 관찰하여 문제 해결 오류를 용이하게하는 것이 좋습니다.