Comandos no sincronizados; no puedes ejecutar este comando ahora
Estoy intentando ejecutar mi código PHP, que llama a dos consultas MySQL a través de mysqli, y aparece el error "Comandos no sincronizados; no puedes 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;
}
}
}
Intenté 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 en qué momento exacto se produce este error y me gustaría saber por qué se produce 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 de near '% ? %'
. Sin embargo, si simplemente selecciono *
en lugar de intentar limitar en función de una cláusula LIKE, sigo recibiendo el error de desincronización del comando.
No puede tener dos consultas simultáneas porque mysqli usa consultas sin búfer de forma predeterminada (para declaraciones preparadas; es lo contrario para vanilla mysql_query
). Puede buscar el primero en una matriz y recorrerlo, o decirle a mysqli que guarde las consultas en el buffer (usando $stmt->store_result()
).
Consulte aquí para obtener más detalles.
Resolví este problema en mi aplicación C; así es como lo hice:
Citando de 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 ejecutarla desde la línea de comandos o en el navegador de consultas, elimine el delimitador de la consulta dentro de su aplicación.
Después de ejecutar mi consulta y procesar los resultados [C API:
mysql_store_result()
], repito cualquier otro resultado potencialmente pendiente que se produzca a través de la ejecución de múltiples declaraciones SQL, como dos o más declaraciones selectas (espalda con espalda sin tratar 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 la conexión).Este es el bucle que uso:
for(; mysql_next_result(mysql_handler) == 0;) /* do nothing */;
No conozco PHP pero seguro que tiene algo parecido.