[php] Comandos fuera de sincronización; no puedes ejecutar este comando ahora


Answers

Resolví este problema en mi aplicación C: así es como lo hice:

  1. Citando de los foros de mysql:

    Este error se produce cuando finaliza su consulta con un delimitador de punto y coma dentro de la aplicación . Si bien es necesario finalizar una consulta con un delimitador de punto y coma al ejecutarlo desde la línea de comandos o en el navegador de consultas, elimine el delimitador de la consulta dentro de su aplicación.

  2. Después de ejecutar mi consulta y mysql_store_result() los resultados [C API: mysql_store_result() ], mysql_store_result() posibles resultados pendientes que se producen a través de la ejecución de varias sentencias de SQL, como dos o más sentencias select (de forma consecutiva sin tratar con los resultados) .

    El hecho es que mis procedimientos no devuelven resultados múltiples, pero la base de datos no lo sabe hasta que ejecuto: [C API: mysql_next_result() ]. Hago esto en un bucle (por si fuera poco) hasta que devuelve un valor distinto de cero. Ahí es cuando el controlador de conexión actual sabe que está bien ejecutar otra consulta (guardo mis manejadores en la memoria caché para minimizar la sobrecarga de conexión).

    Este es el ciclo que uso:

    for(; mysql_next_result(mysql_handler) == 0;) 
      /* do nothing */;
    

No sé PHP, pero estoy seguro de que tiene algo similar.

Question

Estoy tratando de ejecutar mi código PHP, que llama a dos consultas MySQL a través de mysqli, y aparece el error "Comandos fuera de sincronización; no se puede ejecutar este comando ahora".

Aquí está el código que estoy usando

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". Mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
}  else {

print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "user", "password", "db");
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("s", $searchString);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = $result->fetch_assoc()) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

He intentado leer sobre esto, pero no estoy seguro de qué hacer. He leído sobre el resultado de la tienda y el resultado gratuito, sin embargo, estos no han hecho ninguna diferencia al usarlos. No estoy seguro exactamente en qué punto se está causando este error, y me gustaría saber por qué se está causando y cómo solucionarlo.

Siguiendo mis instrucciones de depuración, el primer bucle if de countQuery ni siquiera se está ingresando, debido a un error en mi sintaxis sql cerca de '% ? %' '% ? %' . Sin embargo, si selecciono * lugar de tratar de limitar en función de una cláusula LIKE, sigo recibiendo el comando de error de sincronización.




Creo que el problema es que estás haciendo una nueva conexión en la función y luego no la cierras al final. ¿Por qué no intentas pasar la conexión existente y volver a usarla?

Otra posibilidad es que vuelvas fuera del medio de un ciclo de bucle. Nunca completas esa búsqueda externa.




Para aquellos que las respuestas anteriores no ayudaron ... ¡aquí está lo que fue MI PROBLEMA!

el enlace param era "dinámico", así que tenía una variable que establece los parámetros de los datos para usar bind_param . Entonces esa variable estaba equivocada, pero en lugar de arrojar un error como "datos de param incorrectos" dice "fuera de sincronización bla bla bla", así que estaba confundido ...

¡Espero que haya ayudado a alguien!




Esto no está relacionado con la pregunta original, pero tuve el mismo mensaje de error y este hilo es el primer golpe en Google y me tomó un tiempo averiguar cuál era el problema, por lo que puede ser útil para otros:

NO estoy usando mysqli, todavía estoy usando mysql_connect. Tenía algunas consultas simples, pero UNA consulta provocó que todas las otras consultas fallaran dentro de la misma conexión.

Yo uso mysql 5.7 y php 5.6 tuve una tabla con el tipo de datos "JSON". Obviamente, mi versión php no reconoció el valor de retorno de mysql (php simplemente no sabía qué hacer con el formato JSON porque el módulo mysql incorporado era demasiado antiguo (al menos eso creo))

por ahora cambié el JSON-Field-Type a texto (por ahora no necesito la funcionalidad nativa mysql JSON) y todo funciona bien




Llamo a esta función cada vez antes de usar $ mysqli-> query Funciona también con procedimientos almacenados.

function clearStoredResults(){
    global $mysqli;

    do {
         if ($res = $mysqli->store_result()) {
           $res->free();
         }
        } while ($mysqli->more_results() && $mysqli->next_result());        

}



El problema es la biblioteca C del cliente MySQL, en la que se basan la mayoría de las API de MySQL. El problema es que la biblioteca C no admite la ejecución simultánea de consultas, por lo que todas las API creadas además de eso tampoco. Incluso si usa consultas sin búfer. Esta es una razón por la cual se escribió la API asíncrona de MySQL. Se comunica directamente con el servidor MySQL utilizando TCP y el protocolo wire admite consultas simultáneas.

Su solución es modificar el algoritmo para que no necesite tener ambos en progreso a la vez, o cambiarlos para usar consultas almacenadas, que es probablemente una de las razones originales para su existencia en la biblioteca C (la otra es proporcionar una especie de cursor).




Related