2011-01-21 2 views
5

multi_query를 사용하여 테이블에 상당히 많은 양의 업데이트/삽입을 실행하려고합니다. 이 ~ 14,000 쿼리 총,하지만 기능은 480 ~ 실행, 그것은 오류없이 중지 및 PHP는 아래 싹둑 이상으로 스크립트를 계속 : 첫 번째 문이 실패 할 경우mysqli :: multi_query가 일정량의 행 이후에 정지하는 이유는 무엇입니까?

if($this->db->conn_id->multi_query($sql)){ 
    do{ 
     // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>'; 
    }while($this->db->conn_id->more_results() && $this->db->conn_id->next_result()); 
    $this->message->set('Import complete.','success',TRUE); 
}else{ 
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE); 
} 
+1

약 480 행에 도달하기 전에 쿼리를 실행하는 데 걸리는 시간 (초)은 얼마입니까? CI가 로그 파일에 오류를 기록합니까? – joelcox

+0

@Xoc 실패하기 전에 쿼리가 1 초 미만 동안 실행됩니다. – Erik

답변

0

mysqli는 :: multi_query에만 false를 반환합니다. 당신의 세트에있는 다른 쿼리로부터 에러를 얻으려면, mysqli :: next_result()를 먼저 호출해야한다. 이것은 do while()이하는 일이다.

그러나 mysqli :: next_result()는 실패시 false를 반환하므로 루프가 끝나고 '가져 오기 완료'메시지가 표시됩니다. 성공 메시지를 설정하기 전에 오류를 확인해야하며, 오류가 비어있는 경우에만 성공을 리턴하십시오.

성명에 뒷부분에 오류가있는 경우 다음은 최소한 오류를 표시해야합니다.

if($this->db->conn_id->multi_query($sql)){ 
    do{ 
     // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>'; 
    } while($this->db->conn_id->more_results() && $this->db->conn_id->next_result()); 

    if ($error = mysqli_error($this->db->conn_id)) { 
     $this->message->set('Import could not be completed. ' . $error,'error',TRUE); 
    } else $this->message->set('Import complete.','success',TRUE); 
} else { 
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE); 
} 
+0

실제로 쿼리 자체에는 오류가 없습니다. 나는 SQL 파일의 내용을 전달하고있어 명령 행이나 GUI 도구를 통해 정상적으로 실행된다. – Erik

관련 문제