Estou tentando executar meu código PHP, que chama duas consultas MySQL via mysqli, e recebo 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;
}
}
}
Tentei ler sobre isso, mas não tenho certeza do que fazer. Eu li sobre o resultado da loja e o resultado livre, no entanto, eles não fizeram diferença ao usá-los. Não sei exatamente em que ponto esse erro está sendo causado e gostaria de saber por que ele está sendo causado e como corrigi-lo.
Indo pelas minhas instruções de depuração, o primeiro loop if para countQuery nem mesmo está sendo inserido, por causa de um erro na minha sintaxe sql próximo '% ? %'
. No entanto, se eu apenas selecionar em *
vez de tentar limitar com base em uma cláusula LIKE, ainda recebo o erro de erro de sincronização do comando.
$stmt->store_result();
Acho que sua resposta deve deixar isso mais claro.$select_stmt->close();
para dividi-las (não simultâneas, mas procedimentaisResolvi esse problema em meu aplicativo C - eis como fiz:
Citando de fóruns do mysql:
Depois de executar minha consulta e lidar com os resultados [C API:
mysql_store_result()
], eu itero sobre quaisquer outros resultados potencialmente pendentes que ocorram por meio da execução de várias instruções SQL, como duas ou mais instruções select (consecutivas sem lidar com os resultados).O fato é que meus procedimentos não retornam vários resultados, mas o banco de dados não sabe disso até que eu execute: [C API:
mysql_next_result()
]. Eu faço isso em um loop (para uma boa medida) até que ele retorne diferente de zero. É quando o manipulador de conexão atual sabe que está tudo bem para executar outra consulta (eu coloco meus manipuladores em cache para minimizar a sobrecarga de conexão).Este é o loop que uso:
Não conheço PHP, mas tenho certeza de que tem algo semelhante.
fonte
mysql
extensão legada ?Tive hoje o mesmo problema, mas apenas ao trabalhar com um procedimento armazenado. Isso faz com que a consulta se comporte como uma consulta múltipla, então você precisa "consumir" outros resultados disponíveis antes de fazer outra consulta.
fonte
Eu chamo esta função todas as vezes antes de usar $ mysqli-> query. Funciona com stored procedures também.
fonte
Uma vez que você usou
Você PODE fechá-lo para usar outra consulta.
Este problema estava me perseguindo por horas. Esperançosamente, ele consertará o seu.
fonte
$stmt1->execute(); $stmt2=$conn->prepare(...)
daria esse erro, mas$stmt1->execute(); $result1=$stmt1->get_result(); $stmt2=$conn->prepare(...)
funcionaria bem.Eu uso o CodeIgniter. Um servidor OK ... este provavelmente mais antigo ... De qualquer forma, usando
Corrigido.
fonte
O problema é a biblioteca C do cliente MySQL, na qual a maioria das APIs do MySQL é construída. O problema é que a biblioteca C não suporta a execução simultânea de consultas, então todas as APIs construídas sobre ela também não suportam. Mesmo se você usar consultas sem buffer. Este é um dos motivos pelos quais a API MySQL assíncrona foi escrita. Ele se comunica diretamente com o servidor MySQL usando TCP e o protocolo com fio oferece suporte a consultas simultâneas.
Sua solução é modificar o algoritmo para que você não precise ter ambos em andamento ao mesmo tempo, ou alterá-los para usar consultas em buffer, o que é provavelmente uma das razões originais para sua existência na biblioteca C (o outro é fornecer uma espécie de cursor).
fonte
para resolver este problema, você deve armazenar os dados do resultado antes de usá-lo
Isso é tudo
fonte
Outra causa: store_result () não pode ser chamado duas vezes.
Por exemplo, no código a seguir, Erro 5 é impresso.
(Isso pode não ser relevante para o código de amostra original, mas pode ser relevante para pessoas que buscam respostas para esse erro.)
fonte
Aqui está o que era MEU PROBLEMA !!!
A ligação do parâmetro era "dinâmica", então eu tinha uma variável que define os parâmetros dos dados para usar bind_param . Então essa variável estava errada, mas em vez de lançar um erro como "dados de parâmetro errados", ela diz "fora de sincronia, bla bla bla", então fiquei confuso ...
fonte
Acho que o problema é que você está fazendo uma nova conexão na função e depois não fecha no final. Por que você não tenta passar a conexão existente e reutilizá-la?
Outra possibilidade é que você esteja retornando no meio de uma busca por loop while. Você nunca completa aquela busca externa.
fonte
Verifique se você está digitando todos os parâmetros corretamente. Ele gera o mesmo erro se a quantidade de parâmetros definidos e depois passados para a função forem diferentes.
fonte
Isso não está relacionado à pergunta original, mas recebi a mesma mensagem de erro e este tópico é o primeiro hit no Google e demorei um pouco para descobrir qual era o problema, então pode ser útil para outros:
NÃO estou usando o mysqli, ainda estou usando o mysql_connect. Tive algumas querys simples, mas UMA consulta fez com que todas as outras querys falhassem na mesma conexão.
Eu uso o mysql 5.7 e php 5.6 eu tinha uma tabela com o tipo de dados "JSON". obviamente, minha versão php não reconheceu o valor de retorno do mysql (php simplesmente não sabia o que fazer com o formato JSON porque o módulo interno do mysql era muito antigo (pelo menos eu acho))
por enquanto eu mudei o JSON-Field-Type para Text (por enquanto eu não preciso da funcionalidade JSON nativa do mysql) e tudo funciona bem
fonte
Se você usar o conjunto de resultados Buffered ou Unbuffered para buscar dados, primeiro você deve simplesmente limpar os dados buscados da memória, uma vez que tenha buscado todos os dados . Como você não pode executar outro procedimento MYSQL na mesma conexão até limpar a memória buscada. Adicione esta função abaixo à direita do seu script, então ela resolverá o problema
Referência da documentação do PHP
fonte
Eu encontrei este erro usando Doctrine DBAL QueryBuilder.
Criei uma consulta com QueryBuilder que usa subseleções de coluna, também criada com QueryBuilder. As subseleções só foram criadas via
$queryBuilder->getSQL()
e não executadas. O erro aconteceu ao criar a segunda subseleção. Ao executar provisoriamente cada subseleção$queryBuilder->execute()
antes de usar$queryBuilder->getSQL()
, tudo funcionou. É como se a conexão$queryBuilder->connection
permanecesse 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 subseleção.Minha solução foi escrever as subseleções sem QueryBuilder.
fonte
Estou usando ODBC, e essa correção funciona para mim: ODBC -> guia System DSN -> clique duas vezes para configurar minha fonte de dados -> detalhes -> guia Cursores -> Desmarque [Não armazenar em cache os resultados de cursores somente de encaminhamento] - > clique em Ok
fonte
Freqüentemente, encontro esse erro e é sempre que executo um procedimento armazenado que dependo no phpmyadmin ou no SQL Workbench (estou trabalhando em php conectando-se ao mysqli).
O erro resulta do fato de que a depuração envolve a inserção de instruções SELECT em pontos estratégicos no código para me dizer o estado das variáveis, etc. Executar um procedimento armazenado que produz vários conjuntos de resultados nesses ambientes de cliente é bom, mas produz o " Erro de comandos fora de sincronia "quando chamado de php. A solução é sempre comentar ou remover as seleções de depuração para que o procedimento tenha apenas um conjunto de resultados.
fonte
Meu problema era que eu estava usando primeiro a instrução prepare e, em seguida, estava usando a consulta mysqli na mesma página e estava recebendo o erro "Comandos fora de sincronia; você não pode executar este comando agora". O erro foi só então quando eu estava usando o código que tinha o comando prepare.
O que fiz foi encerrar a pergunta. e funcionou.
mysqli_stmt_close ($ stmt);
Meu código
get_category.php (aqui usando a instrução prepare)
admin_get_category_body.php (aqui mysqli)
Algo que acabou de passar pela minha cabeça, também estou adicionando novamente a variável de conexão via $ connection global ;. Então, acho que basicamente um novo conjunto de sistema de consulta está sendo iniciado após o término da instrução prepare com mysqli_stmt_close ($ stmt); e também estou adicionando esses arquivos e outras coisas via include
fonte
Esta é uma pergunta antiga, mas nenhuma das respostas postadas funcionou no meu caso, eu descobri que no meu caso eu tinha seleções e atualizações em uma tabela no meu procedimento armazenado, a mesma tabela tinha um gatilho de atualização que estava sendo disparado e acionando o procedimento em um loop infinito. Assim que o bug foi encontrado, o erro foi embora.
fonte
Crie duas conexões, use ambas separadamente
fonte