Pregunta

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 cerca '% ? %'.Sin embargo, si solo selecciono * en lugar de intentar limitar en función de una cláusula LIKE, sigo recibiendo el error de desincronización del comando.

¿Fue útil?

Solución

No puede tener dos consultas simultáneas porque mysqli usa consultas sin búfer por defecto (para declaraciones preparadas; es lo contrario para vainilla mysql_query). Puede buscar el primero en una matriz y recorrerlo, o decirle a mysqli que almacene las consultas (usando $stmt->store_result() ).

Ver aquí para más detalles.

Otros consejos

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

  1. Cita 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.

  2. Después de ejecutar mi consulta y tratar con los resultados [API de C: mysql_store_result()], repito cualquier otro resultado potencialmente pendiente que ocurra a través de la ejecución de múltiples sentencias SQL, como dos o más sentencias select (back to back sin lidiar con 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. Es entonces 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 ciclo que uso:

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

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

Tuve hoy 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 & Quot; consumir & Quot; otros resultados disponibles antes de realizar otra consulta.

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}

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());        

}

Yo uso CodeIgniter. Un servidor está bien ... este probablemente sea más antiguo ... De todos modos usando

$this->db->reconnect();

Lo arregló.

El problema es la biblioteca del cliente MySQL C, 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 tampoco todas las API creadas sobre eso. Incluso si usa consultas sin búfer. Esta es una razón por la cual se escribió la API asincrónica de MySQL. Se comunica directamente con el servidor MySQL mediante TCP y el protocolo de cable admite consultas simultáneas.

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

para resolver este problema, debe almacenar los datos de resultados antes de usarlos

$numRecords->execute();

$numRecords->store_result();

eso es todo

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

la unión del parámetro fue & "; dinámica &"; entonces 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 & Quot; datos de parámetro incorrectos & Quot; dice & "; fuera de sincronización bla bla bla &"; así que estaba confundido ...

¡Espero que haya ayudado a alguien!

Una vez que usaste

stmt->execute();

Debe cerrarlo para usar otra consulta.

stmt->close();

Este problema me estaba persiguiendo por horas. Con suerte, arreglará el tuyo.

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

Otra posibilidad es que regrese de la recuperación de bucles de medio tiempo. Nunca completas esa búsqueda externa.

Verifique 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.

Esto no está relacionado con la pregunta original, pero tuve el mismo mensaje de error y este hilo es el primer éxito 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 tuve algunas consultas simples, pero UNA consulta causó que todas las demás consultas fallaran dentro de la misma Conexión.

Uso mysql 5.7 y php 5.6 Tenía una tabla con el tipo de datos " JSON " ;. obviamente, mi versión php no reconocía 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 tipo de campo JSON a texto (ya que por ahora no necesito la funcionalidad nativa mysql JSON) y todo funciona bien

Si utiliza el conjunto de resultados con o sin búfer para recuperar datos, primero debe simplemente borrar los datos recuperados de la memoria, una vez que haya recuperado 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 debajo del extremo derecho de su script, para que resuelva el problema

$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch

Referencia de la documentación de PHP

Me encontré con este error al usar Doctrine DBAL QueryBuilder.

Creé una consulta con QueryBuilder que usa subselecciones de columnas, también creada con QueryBuilder.Las subselecciones sólo se crearon mediante $queryBuilder->getSQL() y no ejecutado.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 permanece 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.

Mi problema fue que estaba usando primero la instrucción prepare y luego estaba usando la consulta mysqli en la misma página y recibía el error " Comandos fuera de sincronización; no puedes 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)

    <?php


    global $connection;
    $cat_to_delete =    mysqli_real_escape_string($connection, $_GET['get'] );

    $sql = "SELECT category_name FROM categories WHERE category_id = ? ;";


    $stmt = mysqli_stmt_init($connection);

    if (!mysqli_stmt_prepare($stmt, $sql))
        $_SESSION['error'] = "Error at preaparing for deleting query. mysqli_stmt_error($stmt) ." & redirect('../error.php');

    mysqli_stmt_bind_param($stmt, 's', $cat_to_delete);

    if (!mysqli_stmt_execute($stmt))
        $_SESSION['error'] = "ERror at executing delete category ".mysqli_stmt_error($stmt) &
            redirect('../error.php');


    mysqli_stmt_bind_result($stmt, $cat_name);

    if (!mysqli_stmt_fetch($stmt)) {
        mysqli_stmt_error($stmt);
    }



    mysqli_stmt_free_result($stmt);
    mysqli_stmt_close($stmt);

admin_get_category_body.php (aquí mysqli)

        <?php

        if (isset($_GET['get']) && !empty($_GET['get']) )
        {
            include 'intodb/edit_category.php';
        }


        if (check_method('get') && isset($_GET['delete']) )
        {
            require 'intodb/delete_category.php';
        }


        if (check_method('get') && isset($_GET['get']) )
        {
            require 'intodb/get_category.php';
        }


        ?>

        <!--            start: cat body          -->

        <div     class="columns is-mobile is-centered is-vcentered">
            <div class="column is-half">
                <div   class="section has-background-white-ter box ">


                    <div class="has-text-centered column    " >
                        <h4 class="title is-4">Ctegories</h4>
                    </div>

                    <div class="column " >


                        <?php if (check_method('get') && isset($_GET['get'])) {?>
                        <form action="" method="post">
                            <?php } else {?>
                            <form action="intodb/add_category.php" method="post">
                                <?php } ?>

                                <label class="label" for="admin_add_category_bar">Add Category</label>
                                <div class="field is-grouped">

                                    <p class="control is-expanded">

                                        <?php if (check_method('get') && isset($_GET['get'])) {?>

                                            <input id="admin_add_category_bar" name="admin_add_category_bar_edit" class="input" type="text" placeholder="Add Your Category Here" value="<?php echo $cat_name; ?>">

                                            <?php


                                            ?>
                                        <?php } else {?>
                                            <input id="admin_add_category_bar" name="admin_add_category_bar" class="input" type="text" placeholder="Add Your Category Here">

                                        <?php } ?>
                                    </p>
                                    <p class="control">
                                        <input type="submit" name="admin_add_category_submit" class="button is-info my_fucking_hover_right_arrow" value="Add Category">
                                    </p>
                                </div>
                            </form>


                            <div class="">

                                <!--            start: body for all posts inside admin          -->


                                <table class="table is-bordered">
                                    <thead>
                                    <tr>
                                        <th><p>Category Name</p></th>
                                        <th><p>Edit</p></th>
                                        <th><p>Delete</p></th>
                                    </tr>
                                    </thead>

                                    <?php

                                    global $connection;
                                    $sql = "SELECT * FROM categories ;";

                                    $result = mysqli_query($connection, $sql);
                                    if (!$result) {
                                        echo mysqli_error($connection);
                                    }
                                    while($row = mysqli_fetch_assoc($result))
                                    {
                                        ?>
                                        <tbody>
                                        <tr>
                                            <td><p><?php echo $row['category_name']?></p></td>
                                            <td>
                                                <a href="admin_category.php?get=<?php echo $row['category_id']; ?>" class="button is-info my_fucking_hover_right_arrow" >Edit</a>

                                            </td>

                                            <td>
                                                <a href="admin_category.php?delete=<?php echo $row['category_id']; ?>" class="button is-danger my_fucking_hover_right_arrow" >Delete</a>

                                            </td>
                                        </tr>


                                        </tbody>
                                    <?php }?>
                                </table>

                                <!--           end: body for all posts inside admin             -->




                            </div>

                    </div>
                </div>


            </div>

        </div>
        </div>

Algo que acaba de pasar por mi mente, también estoy agregando nuevamente la variable de conexión a través de la conexión global $. Entonces, creo que básicamente se está iniciando un conjunto completamente nuevo de sistema de consulta 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 incluir

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top