sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué mysqli da un error de sincronización de Comandos?

El cliente MySQL no le permite ejecutar una nueva consulta donde todavía hay filas para obtener de una consulta en curso. Consulte Comandos no sincronizados en el documento de MySQL sobre errores comunes.

Puede usar mysqli_store_result() para precargar todas las filas de la consulta externa. Eso los almacenará en el cliente MySQL, por lo que, desde el punto de vista del servidor, su aplicación ha obtenido el conjunto de resultados completo. Luego puede ejecutar más consultas incluso en un ciclo de obtención de filas del conjunto de resultados externo ahora almacenado en búfer.

O usted mysqli_result::fetch_all() que devuelve el conjunto de resultados completo como una matriz de PHP, y luego puede recorrer esa matriz.

Llamar a procedimientos almacenados es un caso especial, porque un procedimiento almacenado tiene el potencial de devolver varios conjuntos de resultados, cada uno de los cuales puede tener su propio conjunto de filas. Es por eso que la respuesta de @a1ex07 menciona el uso de mysqli_multi_query() y en bucle hasta mysqli_next_result() no tiene más conjuntos de resultados. Esto es necesario para cumplir con el protocolo MySQL, incluso si en su caso su procedimiento almacenado tiene un solo conjunto de resultados.

PD:Por cierto, veo que estás haciendo las consultas anidadas porque tienes datos que representan una jerarquía. Es posible que desee considerar almacenar los datos de manera diferente, para que pueda consultarlos más fácilmente. Hice una presentación sobre esto titulada Modelos para datos jerárquicos con SQL y PHP . También cubro este tema en un capítulo de mi libro Antipatrones SQL:Cómo evitar las trampas de la base de datos Programación .

Aquí se explica cómo implementar mysqli_next_result() en CodeIgnitor 3.0.3:

En la línea 262 de system/database/drivers/mysqli/mysqli_driver.php cambiar

protected function _execute($sql)
{
    return $this->conn_id->query($this->_prep_query($sql));
}

a esto

protected function _execute($sql)
{
    $results = $this->conn_id->query($this->_prep_query($sql));
    @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
    return $results;
}

Esto ha sido un problema desde 2.x. Acabo de actualizar a 3.x y tuve que copiar este truco a la nueva versión.