2011-01-21 18 views
5

Estoy intentando ejecutar una cantidad bastante grande de actualizaciones/inserciones en una tabla usando multi_query. Hay ~ 14.000 consultas totales, pero la función sólo se ejecuta ~ 480, luego se detiene sin errores y PHP sigue el guión más allá del recorte a continuación:¿Por qué mysqli :: multi_query se detiene después de una cierta cantidad de filas?

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

¿Cuánto tiempo (en segundos) se ejecuta la consulta antes de que llegue a aproximadamente 480 filas? ¿CI registra algún error en el archivo de registro? – joelcox

+0

@Xoc la consulta se ejecuta durante menos de un segundo antes de fallar. – Erik

Respuesta

0

mysqli :: única consulta múltiple devuelve falso si la primera sentencia falla. Para obtener los errores de las otras consultas en su conjunto, primero debe llamar a mysqli :: next_result(), que es lo que está haciendo su while().

Sin embargo, dado que mysqli :: next_result() devuelve falso en caso de error, hará que el ciclo finalice y se muestre el mensaje "Importar completado". Probablemente necesite comprobar si hay un error antes de establecer el mensaje de éxito, y solo si el error está en blanco, devuelva el éxito.

Lo siguiente al menos debería mostrar el error si hubo uno más adelante en la declaración.

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

En realidad, no hay errores en las consultas. Estoy pasando el contenido de un archivo sql y funciona bien a través de línea de comandos o herramienta GUI. – Erik

Cuestiones relacionadas