Les commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant
Je suis en train d'exécuter mon code PHP, ce qui appelle deux requêtes MySQL via mysqli, et obtenez le message d'erreur "Commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant".
Voici le code, je suis en utilisant
<?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;
}
}
}
J'ai essayé de faire des lectures sur ce sujet, mais je suis pas sûr de quoi faire. J'ai lu à propos de stocker le résultat et libre de suite, cependant, ils n'ont fait aucune différence lors de leur utilisation. Je ne sais pas exactement à quel point cette erreur est causée, et voudrais savoir pourquoi il est dû, et comment le résoudre.
En passant par mes instructions de débogage, le premier si la boucle pour countQuery n'est même pas entré en raison d'une erreur dans mon sql syntaxe près de près de '% ? %'
. Cependant, si je viens de sélectionner *
au lieu d'essayer de limiter fondée sur une clause LIKE, je reçois toujours la commande de l'erreur de synchronisation.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir deux requêtes simultanées parce que mysqli utilise des barrettes de mémoire par défaut des requêtes (pour les instructions préparées; il est à l'opposé de la vanille
mysql_query
). Vous pouvez récupérer le premier dans un tableau et une boucle par qui, ou de dire mysqli pour le tampon de requêtes (à l'aide de$stmt->store_result()
).Voir ici pour plus de détails.
$stmt->store_result();
je pense que votre réponse devrait en faire plus clair.$select_stmt->close();
à partager (pas simultanés mais procéduraleswpdb
pour appeler une procédure stockée et cette erreur vient "Commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant"J'ai résolu ce problème dans mon application C - voici comment j'ai fait:
Citant mysql forums:
Après l'exécution de ma requête et de traiter avec les résultats [de l'API C:
mysql_store_result()
], je itérer sur toutes les autres, potentiellement, dans l'attente des résultats qui se produit par le biais de multiples exécution de l'instruction SQL comme deux ou plusieurs instructions select (dos à dos sans traiter avec les résultats).Le fait est que mon procédures ne retourne pas de résultats multiples, mais la base de données ne sait pas que jusqu'à ce que j'execute: [API C:
mysql_next_result()
]. Je fais cela dans une boucle (pour faire bonne mesure) jusqu'à ce qu'elle renvoie zéro. C'est alors que l'actuel gestionnaire de connexion de la sait que c'est ok pour exécuter une autre requête (je cache mes gestionnaires afin de minimiser les connexions).C'est la boucle j'utilise:
Je ne connais pas PHP, mais je suis sûr qu'il a quelque chose de similaire.
mysql
extension?J'ai eu aujourd'hui le même problème, mais seulement lorsque l'on travaille avec une procédure stockée. Ce que la requête se comporter comme un multi de requête, de sorte que vous besoin de "consommer" les autres résultats disponibles avant de faire une autre requête.
J'ai appeler cette fonction avant chaque utilisation $mysqli->query
Fonctionne avec des procédures stockées en tant que bien.
J'utilise CodeIgniter.
Un serveur OK ... celui-ci sans doute plus ...
De toute façon, à l'aide de
Il fixe.
Le problème, c'est le client MySQL C de la bibliothèque, dont la plupart des Api MySQL sont construits sur. Le problème est que la bibliothèque C ne prend pas en charge simultanée de l'exécution de requêtes, de sorte que toutes les Api intégré sur le dessus de cela aussi ne pas. Même si vous utilisez des barrettes de mémoire les requêtes. C'est une des raisons pourquoi l'asynchrone API MySQL a été écrit. Elle communique directement avec le serveur MySQL en utilisant le protocole TCP et le fil-protocole ne soutien de requêtes simultanées.
Votre solution est soit de modifier l'algorithme de sorte que vous n'avez pas besoin d'avoir les deux en cours à la fois, ou d'en changer, à utiliser en tampon de requêtes, ce qui est probablement une des raisons de leur existence dans la bibliothèque C (l'autre est de fournir une sorte de curseur).
pour résoudre ce problème, vous devez stocker le résultat de données avant de l'utiliser
c'est tout
Pour ceux que les réponses précédentes n'ont pas les aider... voici quel était MON PROBLÈME!!!!!!
le paramètre de liaison est "dynamique", j'ai donc eu une variable qui définit les paramètres des données afin de les utiliser bind_param. De sorte que la variable était mauvais, mais au lieu de lancer une erreur comme "mauvais param données", il dit: "out of sync bla bla bla" donc, j'étais confus...
J'espère que cela a aidé quelqu'un!
Une fois que vous avez utilisé
Vous devez la fermer à utiliser une autre requête.
Ce problème m'avait prise en chasse pendant des heures. J'espère que cela va résoudre le vôtre.
Je pense que le problème est que vous êtes de prendre une nouvelle connexion dans la fonction, et pas de fermeture à la fin. Pourquoi n'essayez-vous pas de passage dans la connexion existante et de ré-utiliser?
Une autre possibilité est que vous êtes de retour au milieu d'une boucle while chercher. Vous n'avez jamais complète que l'extérieur de fetch.
Vérifier pour voir si vous tapez tous les paramètres correctement. Il jette la même erreur si le nombre de paramètres définis et puis passés à la fonction sont différentes.
Ce n'est pas lié à la question d'origine, mais j'ai eu le même message d'erreur et ce fil est le premier succès dans Google et il m'a fallu un certain temps à comprendre quel était le Problème, de sorte qu'il Peut être utile pour les autres:
je ne suis PAS à l'aide de mysqli, toujours à l'aide de mysql_connect
j'ai eu quelques simples requêtes sur, mais UNE requête a provoqué toutes les autres requêtes sur l'échec au sein de la même Connexion.
J'utilise mysql 5.7 et de php 5.6
j'avais un tableau avec les données de Type "JSON". évidemment, mon php-version ne reconnaît pas la valeur de retour de mysql (php, il suffit de ne pas savoir quoi faire avec le Format JSON parce que le haut-mysql-module était trop vieux (du moins je pense))
pour l'instant j'ai changé le JSON-Champ de Type Texte (comme pour l'instant je n'ai pas besoin natif mysql JSON-fonctionnalité) et tout fonctionne bien
Si vous utilisez l'Tampon ou sans Tampon ensemble de résultats de l'extraction de données, vous devez d'abord tout simplement effacer les données extraites de la mémoire, une fois que vous avez récupéré toutes les données. Comme vous ne pouvez pas exécuter une autre MYSQL procédure sur la même connexion jusqu'à ce que vous désactivez la récupérées de la mémoire. Ajouter en-dessous de fonction de droite à la fin du script, donc il va résoudre le problème
Référence de la documentation PHP
Je suis tombé sur cette erreur à l'aide de la Doctrine DBAL QueryBuilder.
J'ai créé une requête avec le QueryBuilder qui utilise la colonne les sous-sélections, a aussi créé avec le QueryBuilder. Le les sous-sélections ont été créés uniquement via
$queryBuilder->getSQL()
et ne sera pas exécuté. L'erreur qui s'est passé sur la création de la deuxième sous-sélection. Par provisoirement l'exécution de chaque instruction de sous-sélection avec$queryBuilder->execute()
avant d'utiliser$queryBuilder->getSQL()
, tout a fonctionné. C'est comme si la connexion$queryBuilder->connection
reste dans un état non valide pour la création d'un nouveau SQL avant l'exécution de la actuellement préparé SQL, en dépit de la nouvelle QueryBuilder instance sur chaque sous-sélection.Ma solution a été d'écrire le les sous-sélections sans QueryBuilder.
Mon problème est que j'ai été en utilisant d'abord préparer déclaration puis j'ai été en utilisant mysqli requête sur la même page, et a été l'obtention de l'erreur "Commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant". L'erreur est seulement alors, quand j'ai été en utilisant le code qui avait préparer déclaration.
Ce que j'ai fait a été de près la question. et cela a fonctionné.
mysqli_stmt_close($stmt);
Mon code
get_category.php (ici à l'aide de préparer la déclaration )
admin_get_category_body.php (ici mysqli)
Quelque chose qui a traversé mon esprit, je suis également une fois de plus l'ajout de variable de connexion via global $connexion;. Donc, je pense que, fondamentalement, un nouvel ensemble complet de système de requête est en cours de démarrage après la fin de l'instruction prepare avec mysqli_stmt_close($stmt); et aussi, je suis l'ajout de ces fichiers et d'autres choses via incluent