Domanda

Sto cercando di eseguire il mio codice PHP, che chiama due query MySQL tramite mysqli, e ottenere l'errore " Comandi non sincronizzati; non puoi eseguire questo comando ora " ;.

Ecco il codice che sto 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;
        }
    }
}

Ho provato a leggere su questo, ma non sono sicuro di cosa fare. Ho letto del risultato del negozio e del risultato gratuito, tuttavia questi non hanno fatto alcuna differenza quando li si utilizza. Non sono sicuro del punto esatto in cui viene causato questo errore e vorrei sapere perché è stato causato e come risolverlo.

Seguendo le mie dichiarazioni di debug, il primo ciclo if per countQuery non viene nemmeno inserito, a causa di un errore nella mia sintassi sql vicino a '% ? %'. Tuttavia, se seleziono * invece di provare a limitare in base a una clausola LIKE, ottengo comunque il comando fuori errore di sincronizzazione.

È stato utile?

Soluzione

Non è possibile avere due query simultanee perché mysqli utilizza query senza buffer per impostazione predefinita (per istruzioni preparate; è l'opposto per vanilla mysql_query). Puoi prendere il primo in un array e scorrere in quel modo, oppure dire a mysqli di bufferizzare le query (usando $stmt->store_result() ).

Vedi qui per i dettagli.

Altri suggerimenti

Ho risolto questo problema nella mia applicazione C - ecco come l'ho fatto:

  1. Citando dai forum mysql:

      

    Questo errore si verifica quando si termina la query con un delimitatore di punto e virgola all'interno dell'applicazione . Mentre è necessario terminare una query con un delimitatore punto e virgola quando viene eseguita dalla riga di comando o nel browser delle query, rimuovere il delimitatore dalla query all'interno dell'applicazione.

  2. Dopo aver eseguito la mia query e aver gestito i risultati [API C: mysql_store_result()], eseguo l'iterazione su eventuali altri risultati potenzialmente in sospeso che si verificano tramite l'esecuzione di più istruzioni SQL come due o più istruzioni select (back to back senza occuparsi dei risultati).

    Il fatto è che le mie procedure non restituiscono più risultati ma il database non lo sa fino a quando non eseguo: [API C: mysql_next_result()]. Lo faccio in un ciclo (per buona misura) fino a quando non restituisce un valore diverso da zero. Questo è quando l'attuale gestore di connessioni sa che va bene eseguire un'altra query (memorizzo nella cache i miei gestori per ridurre al minimo l'overhead della connessione).

    Questo è il ciclo che uso:

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

Non conosco PHP ma sono sicuro che abbia qualcosa di simile.

Oggi ho avuto lo stesso problema, ma solo quando lavoravo con una procedura memorizzata. Questo fa sì che la query si comporti come una multi query, quindi è necessario & Quot; consumare & Quot; altri risultati disponibili prima di effettuare un'altra query.

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

Chiamo questa funzione ogni volta prima di usare $ mysqli - > query Funziona anche con le stored procedure.

function clearStoredResults(){
    global $mysqli;

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

}

Uso CodeIgniter. Un server OK ... questo probabilmente più vecchio ... Comunque usando

$this->db->reconnect();

Risolto.

Il problema è la libreria C client MySQL, su cui sono costruite la maggior parte delle API MySQL. Il problema è che la libreria C non supporta l'esecuzione simultanea di query, quindi non lo fanno anche tutte le API costruite sopra. Anche se usi query senza buffer. Questo è uno dei motivi per cui è stata scritta l'API MySQL asincrona. Comunica direttamente con il server MySQL tramite TCP e il protocollo wire supporta le query simultanee.

La tua soluzione è di modificare l'algoritmo in modo che non sia necessario averli entrambi in corso contemporaneamente o di cambiarli per utilizzare le query con buffer, che è probabilmente uno dei motivi originali della loro esistenza nella libreria C (il altro è fornire una specie di cursore).

per risolvere questo problema devi archiviare i dati dei risultati prima di usarli

$numRecords->execute();

$numRecords->store_result();

tutto qui

Per quelli che le precedenti risposte non hanno aiutato ... ecco qual è stato IL MIO PROBLEMA !!!

il parametro param era " dinamico " quindi avevo una variabile che imposta i parametri dei dati per usare bind_param . Quindi quella variabile era sbagliata ma invece di lanciare un errore come & Quot; err param data & Quot; dice " fuori sincrono bla bla bla " quindi ero confuso ...

Spero che abbia aiutato qualcuno!

Una volta che hai usato

stmt->execute();

Devi chiuderlo per usare un'altra query.

stmt->close();

Questo problema mi stava dando la caccia per ore. Speriamo che risolverà il tuo.

Penso che il problema sia che stai effettuando una nuova connessione nella funzione e non la chiudi alla fine. Perché non provi a passare la connessione esistente e a riutilizzarla?

Un'altra possibilità è che stai tornando nel bel mezzo di un recupero del ciclo while. Non completi mai questo recupero esterno.

Controlla se stai digitando tutti i parametri correttamente. Genera lo stesso errore se la quantità di parametri definiti e quindi passati alla funzione sono diversi.

Questo non è correlato alla domanda originale, ma ho avuto lo stesso messaggio di errore e questo thread è il primo successo in Google e mi ci è voluto un po 'di tempo per capire quale fosse il problema, quindi potrebbe essere utile per altri:

NON sto usando mysqli, sto ancora usando mysql_connect ho avuto alcune query semplici, ma UNA query ha causato il fallimento di tutte le altre query all'interno della stessa connessione.

Uso mysql 5.7 e php 5.6 avevo una tabella con il tipo di dati " JSON " ;. ovviamente, la mia versione di php non ha riconosciuto il valore di ritorno da mysql (php non sapeva cosa fare con il formato JSON perché il modulo mysql incorporato era troppo vecchio (almeno credo))

per ora ho cambiato il tipo di campo JSON in testo (come per ora non ho bisogno della funzionalità JSON mysql nativa) e tutto funziona bene

Se si utilizza il set di risultati Buffered o Unbuffered per il recupero dei dati, per prima cosa è sufficiente cancellare i dati recuperati dalla memoria, dopo aver recuperato tutti i dati . Poiché non è possibile eseguire un'altra procedura MYSQL sulla stessa connessione fino a quando non si cancella la memoria recuperata. Aggiungi questa funzione all'estremità destra dello script, in modo che risolva il problema

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

Riferimento dalla documentazione di PHP

Ho riscontrato questo errore utilizzando Doctrine DBAL QueryBuilder.

Ho creato una query con QueryBuilder che utilizza le sottoselezioni di colonne, anch'esse create con QueryBuilder. Le sottoselezioni sono state create solo tramite $queryBuilder->getSQL() e non eseguite. L'errore si è verificato durante la creazione della seconda sottoselezione. Eseguendo provvisoriamente ogni sottoselezione con $queryBuilder->execute() prima di utilizzare $queryBuilder->connection, tutto ha funzionato. È come se la connessione <=> rimanga in uno stato non valido per la creazione di un nuovo SQL prima di eseguire l'SQL attualmente preparato, nonostante la nuova istanza QueryBuilder su ogni sottoselezione.

La mia soluzione era scrivere le sottoselezioni senza QueryBuilder.

Il mio problema era che stavo usando prima la dichiarazione di preparazione e poi stavo usando la query mysqli sulla stessa pagina e ottenevo l'errore " Comandi non sincronizzati; non puoi eseguire questo comando ora " ;. L'errore è stato solo allora quando stavo usando il codice che aveva preparato statement.

Quello che ho fatto è stato chiudere la domanda. e ha funzionato.

mysqli_stmt_close ($ stmt);

Il mio codice

get_category.php (qui usando l'istruzione preparazione)

    <?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 (qui 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>

Qualcosa che mi è appena passato per la testa, sto anche aggiungendo di nuovo la variabile di connessione tramite $ connection globale ;. Quindi penso che fondamentalmente un nuovo set di sistema di query venga avviato dopo la fine della dichiarazione di preparazione con mysqli_stmt_close ($ stmt); e sto anche aggiungendo questi file e altre cose tramite include

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top