Estoy intentando ejecutar mi código PHP, que llama a dos consultas MySQL a través de mysqli, y aparece el error "Comandos desincronizados; no 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 de 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 declaraciones de depuración, el primer bucle if para countQuery ni siquiera se ingresa, debido a un error en mi sintaxis sql cerca '% ? %'
. Sin embargo, si solo selecciono en *
lugar de intentar limitar en función de una cláusula LIKE, todavía obtengo el error de sincronización del comando.
$stmt->store_result();
Creo que su respuesta debe hacer más que clara.$select_stmt->close();
para dividirlas (no simultáneas sino de procedimientoResolví este problema en mi aplicación C; así es como lo hice:
Citando de foros de mysql:
Después de ejecutar mi consulta y tratar con los resultados [API C:
mysql_store_result()
], iteraré sobre cualquier resultado potencialmente pendiente adicional que ocurra a través de la ejecución de múltiples sentencias SQL, como dos o más sentencias select (una tras otra sin ocuparse de los resultados).El hecho es que mis procedimientos no devuelven múltiples resultados, pero la base de datos no lo sabe hasta que ejecuto: [C API:
mysql_next_result()
]. Hago esto en un bucle (por si acaso) 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 en caché mis controladores para minimizar la sobrecarga de conexión).Este es el bucle que uso:
No conozco PHP pero estoy seguro de que tiene algo similar.
fuente
mysql
extensión heredada ?Hoy tuve el mismo problema, pero solo cuando trabajaba con un procedimiento almacenado. Esto hace que la consulta se comporte como una consulta múltiple, por lo que debe "consumir" otros resultados disponibles antes de realizar otra consulta.
fuente
Llamo a esta función cada vez antes de usar $ mysqli-> query Funciona con procedimientos almacenados también.
fuente
Una vez que usaste
Usted PUEDE cerrarla utilizar otra consulta.
Este problema me persiguió durante horas. Con suerte, arreglará el tuyo.
fuente
$stmt1->execute(); $stmt2=$conn->prepare(...)
daría este error, pero$stmt1->execute(); $result1=$stmt1->get_result(); $stmt2=$conn->prepare(...)
funcionaría bien.Yo uso CodeIgniter. Un servidor bien ... este probablemente más antiguo ... De todos modos usando
Arreglado.
fuente
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 construidas sobre eso tampoco lo hacen. Incluso si usa consultas sin búfer. Esta es una de las razones por las que se escribió la API MySQL asincrónica. Se comunica directamente con el servidor MySQL usando TCP y el alambre-protocolo no apoyar 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 en búfer, que es probablemente una de las razones originales de su existencia en la biblioteca C (la otra es proporcionar una especie de cursor).
fuente
para resolver este problema, debe almacenar los datos de los resultados antes de usarlos
eso es todo
fuente
Otra causa: store_result () no se puede llamar dos veces.
Por ejemplo, en el siguiente código, se imprime el Error 5.
(Es posible que esto no sea relevante para el código de muestra original, pero puede ser relevante para las personas que buscan respuestas a este error).
fuente
Aquí está lo que era MI PROBLEMA !!!
El enlace de parámetros 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 mal, pero en lugar de arrojar un error como "datos de parámetros incorrectos", dice "fuera de sincronización bla bla bla", así que estaba confundido ...
fuente
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 reutilizarla?
Otra posibilidad es que regrese de la mitad de una búsqueda de bucle while. Nunca completas esa búsqueda externa.
fuente
Compruebe si está escribiendo todos los parámetros correctamente. Lanza el mismo error si la cantidad de parámetros definidos y luego pasados a la función son diferentes.
fuente
Esto no está relacionado con la pregunta original, pero tuve el mismo mensaje de error y este hilo es el primer resultado en Google y me tomó un tiempo descubrir cuál era el problema, por lo que puede ser útil para otros:
NO estoy usando mysqli, sigo usando mysql_connect. Tenía algunas consultas simples, pero UNA consulta hizo que todas las demás consultas fallaran dentro de la misma conexión.
Yo uso mysql 5.7 y php 5.6. Tenía una tabla con el tipo de datos "JSON". obviamente, mi versión de 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 creo))
por ahora cambié JSON-Field-Type a Text (ya que por ahora no necesito la funcionalidad JSON nativa de mysql) y todo funciona bien
fuente
Si usa el conjunto de resultados con búfer o sin búfer para obtener datos, primero debe simplemente borrar los datos recuperados de la memoria, una vez que haya obtenido todos los datos . Como no puede ejecutar otro procedimiento MYSQL en la misma conexión hasta que borre la memoria recuperada. Agregue esta función a continuación en el extremo derecho de su secuencia de comandos, por lo que resolverá el problema
Referencia de la documentación de PHP
fuente
Me encontré con este error usando Doctrine DBAL QueryBuilder.
Creé una consulta con QueryBuilder que usa subselecciones de columna, también creada con QueryBuilder. Las subselecciones solo se crearon mediante
$queryBuilder->getSQL()
y no se ejecutaron. El error ocurrió al crear la segunda subselección. Al ejecutar provisionalmente cada subselección con$queryBuilder->execute()
antes de usar$queryBuilder->getSQL()
, todo funcionó. Es como si la conexión$queryBuilder->connection
permaneciera en un estado no válido para crear un nuevo SQL antes de ejecutar el SQL actualmente preparado, a pesar de la nueva instancia de QueryBuilder en cada subselección.Mi solución fue escribir las subselecciones sin QueryBuilder.
fuente
Estoy usando ODBC, y esta solución me funciona: ODBC -> pestaña System DSN -> doble clic para configurar mi fuente de datos -> detalles -> pestaña Cursores -> Desmarque [No almacenar en caché los resultados de los cursores de solo avance] - > haga clic en Aceptar
fuente
A menudo encuentro este error y es siempre cuando ejecuto un procedimiento almacenado que he estado depurando en phpmyadmin o SQL Workbench (estoy trabajando en php conectándome con mysqli).
El error se debe al hecho de que la depuración implica insertar sentencias SELECT en puntos estratégicos del código para indicarme el estado de las variables, etc. Ejecutar un procedimiento almacenado que produce múltiples conjuntos de resultados en estos entornos de cliente está bien, pero produce el " Comandos no sincronizados "error cuando se llama desde php. La solución es siempre comentar o eliminar las selecciones de depuración para que el procedimiento tenga solo un conjunto de resultados.
fuente
Mi problema era que estaba usando la primera declaración de preparación y luego estaba usando la consulta mysqli en la misma página y recibía el error "Comandos no sincronizados; no puede ejecutar este comando ahora". El error fue solo entonces cuando estaba usando el código que tenía la declaración de preparación.
Lo que hice fue cerrar la pregunta. Y funcionó.
mysqli_stmt_close ($ stmt);
Mi código
get_category.php (aquí usando la declaración de preparación)
admin_get_category_body.php (aquí mysqli)
Algo que acaba de pasar por mi mente, también estoy agregando nuevamente la variable de conexión a través de $ conexión global ;. Así que creo que básicamente se está iniciando un nuevo conjunto de sistema de consultas después de finalizar la declaración de preparación con mysqli_stmt_close ($ stmt); y también estoy agregando estos archivos y otras cosas a través de include
fuente
Esta es una pregunta antigua, pero ninguna de las respuestas publicadas funcionó en mi caso, descubrí que en mi caso tenía selecciones y actualizaciones en una tabla en mi procedimiento almacenado, la misma tabla tenía un disparador de actualización que se estaba activando y enviando el procedimiento en un bucle infinito. Una vez que se encontró el error, el error desapareció.
fuente
Cree dos conexiones, use ambas por separado
fuente