Pergunta

Eu estou tentando executar o meu código PHP, o que exige dois MySQL consultas via mysqli, e obter o erro "Comandos fora de sincronia, você não pode executar este comando agora".

Aqui está o código que estou 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;
        }
    }
}

Eu tentei ler sobre isso, mas não tenho a certeza do que fazer. Eu li sobre o resultado de loja e resultado livre, no entanto estes não fizeram nenhuma diferença quando usá-los. Eu tenho certeza exatamente que ponto este erro está sendo causado, e gostaria de saber por que ele está sendo causado, e como corrigi-lo.

Indo por minhas instruções de depuração, o loop primeiro se para countQuery não está sendo sequer entraram, por causa de um erro na minha sintaxe SQL perto '% ? %' próximo. No entanto, se eu apenas selecione * em vez de tentar limite baseado em uma cláusula LIKE, eu ainda obter o comando de erro de sincronização.

Foi útil?

Solução

Você não pode ter duas consultas simultâneas porque mysqli usa consultas sem buffer por padrão (para instruções preparadas, é o oposto de mysql_query baunilha). Pode quer buscar o primeiro em uma matriz e um loop por que, ou dizer mysqli para tamponar as consultas (utilizando $stmt->store_result() ).

aqui para mais detalhes.

Outras dicas

Eu resolvi este problema na minha aplicação C - aqui está como eu fiz isso:

  1. Citando fóruns mysql:

    Este erro ocorre quando você encerrar a sua consulta com um delimitador de vírgula dentro do aplicativo . Enquanto ele é necessário para terminar uma consulta com um delimitador de vírgula quando executá-lo a partir da linha de comando ou no navegador da consulta, remova o delimitador a partir da consulta dentro de sua aplicação.

  2. Depois de executar minha consulta e lidar com os resultados [C API: mysql_store_result()], eu iterar sobre qualquer outra potencialmente pendente resultados que ocorre através de execução de instrução múltipla SQL, tais como duas ou mais instruções SELECT (back to back sem lidar com os resultados).

    O fato é que meus procedimentos não retornam vários resultados, mas o banco de dados não sabe que até eu executar: [C API: mysql_next_result()]. Eu faço isso em um loop (para uma boa medida) até que ele retorne diferente de zero. Foi quando o manipulador de conexão atual sabe não há problema em executar outra consulta (I armazenar em cache os meus manipuladores para minimizar a sobrecarga de conexão).

    Este é o uso de loop I:

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

Eu não sei PHP, mas eu tenho certeza que ele tem algo semelhante.

Tive hoje o mesmo problema, mas apenas quando se trabalha com um procedimento armazenado. Isto faz a comportar consulta como uma consulta multi, então você precisa para "consumir" outros resultados disponíveis antes de fazer uma outra consulta.

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

Eu chamo esta função todas as vezes antes de usar $ mysqli-> query Funciona com procedimentos armazenados também.

function clearStoredResults(){
    global $mysqli;

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

}

Eu uso CodeIgniter. Um servidor OK ... este provavelmente mais velho ... De qualquer forma usando

$this->db->reconnect();

Fixed-lo.

O problema é a biblioteca C cliente MySQL, que a maioria das APIs do MySQL são construídas sobre. O problema é que a biblioteca C não suporta a execução simultânea de consultas, assim que todas as APIs construídas em cima disso, também não. Mesmo se você usar consultas unbuffered. Esta é uma das razões por que a API MySQL assíncrono foi escrito. Ele se comunica diretamente com o servidor MySQL usando TCP e o protocolo de fio faz de apoio consultas simultâneas.

A sua solução é modificar o algoritmo para que você não precisa ter tanto em andamento ao mesmo tempo, ou alterá-los para usar consultas em buffer, que é provavelmente uma das razões originais para a sua existência na biblioteca C (o outra é fornecer um tipo de cursor).

para resolver este problema que você tem para armazenar dados de resultado antes de usá-lo

$numRecords->execute();

$numRecords->store_result();

isso é tudo

Para não aqueles que as respostas anteriores não ajuda ... aqui é o que era o meu problema !!!

a ligação param era "dinâmico" então eu tive uma variável que define o params dos dados a fim de usar bind_param . Portanto, essa variável estava errado, mas em vez de jogar um erro como "dados param errado" ele diz que "fora de sincronia bla bla bla" então eu estava confuso ...

Espero que ajudou alguém!

Uma vez que você usou

stmt->execute();

Você deve fechar-se usar outra consulta.

stmt->close();

Este problema foi me caça por horas. Esperamos que ele vai corrigir o seu.

Eu acho que o problema é que você está fazendo uma nova conexão na função, e depois não fechá-lo no final. Por que você não tenta passar na conexão existente e re usando-lo?

Outra possibilidade é que você está retornando para fora do meio de uma ao buscar loop. Você nunca concluir que exterior buscar.

Verifique se você está digitando todos os parâmetros corretamente. Ele lança o mesmo erro se a quantidade de parâmetros definidos e, em seguida, passados ??para a função são diferentes.

Isso não está relacionado à pergunta original, mas eu tinha o mesmo erro de mensagem e esta discussão é o primeiro hit no Google e ele me levou um tempo para descobrir qual era o problema, por isso pode ser útil para outros:

Eu não estou usando mysqli, ainda usando mysql_connect i tinha algumas querys simples, mas uma consulta causou todos os outros querys a falhar dentro da mesma conexão.

Eu uso mysql 5,7 e 5,6 php eu tinha uma tabela com os dados-Type "JSON". obviamente, o meu php-versão não reconheceu o valor de retorno de mysql (php simplesmente não sabia o que fazer com o JSON-Formato porque o built-in mysql-módulo era muito velho (pelo menos eu acho))

por agora eu mudei o JSON-Campo-Type para Texto (por enquanto eu não preciso do mysql nativa JSON-funcionalidade) e tudo funciona

Se você quer usar Buffered ou conjunto de resultados sem buffer para buscar dados, primeiro você deve simplesmente limpar os dados buscados a partir da memória, uma vez que você tem buscado todos os dados . Como você não pode executar outro procedimento MYSQL na mesma conexão até que você limpar a memória buscado. Adicione esta abaixo função extremidade direita do seu script, por isso vai resolver o problema

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

Referência da documentação PHP

Eu corri para este erro usando Doutrina DBAL QueryBuilder.

Eu criei uma consulta com QueryBuilder que usa subselects coluna, também criados com QueryBuilder. Os subselects só foram criados através $queryBuilder->getSQL() e não executado. O erro aconteceu na criação da segunda subselect. Ao executar provisoriamente cada subselect com $queryBuilder->execute() antes de usar $queryBuilder->getSQL(), tudo funcionou. É como se os restos conexão $queryBuilder->connection em um estado inválido para a criação de um novo SQL antes de executar o SQL atualmente preparado, apesar da nova instância QueryBuilder em cada subselect.

Minha solução foi a escrever as subselects sem QueryBuilder.

Meu problema era que eu estava usando primeiro preparar declaração e, em seguida, eu estava usando consulta mysqli na mesma página e estava recebendo o erro "Commands out of sync, você não pode executar este comando agora". O erro foi só então quando eu estava usando o código que tinha preparar comunicado.

O que fiz foi para fechar a questão. e funcionou.

mysqli_stmt_close ($ stmt);

Meu código

get_category.php (aqui usando preparar declaração)

    <?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 (aqui 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 apenas passou pela minha cabeça, eu também estou novamente acrescentando variável conexão via $ conexão global ;. Então eu acho que, basicamente, todo um novo conjunto de consulta do sistema está sendo iniciado após o término de preparar declaração com mysqli_stmt_close ($ stmt); e também estou adicionando esses arquivos e outras coisas via incluem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top