J'essaye d'exécuter mon code PHP, qui appelle deux requêtes MySQL via mysqli, et j'obtiens l'erreur "Commandes désynchronisées; vous ne pouvez pas exécuter cette commande maintenant".
Voici le code que j'utilise
<?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 lire à ce sujet, mais je ne sais pas quoi faire. J'ai lu sur le résultat du magasin et le résultat gratuit, mais ceux-ci n'ont fait aucune différence lors de leur utilisation. Je ne sais pas exactement à quel point cette erreur est causée et j'aimerais savoir pourquoi elle est causée et comment y remédier.
En suivant mes instructions de débogage, la première boucle if pour countQuery n'est même pas entrée, en raison d'une erreur dans ma syntaxe SQL proche de '% ? %'
. Cependant, si je sélectionne simplement *
au lieu d'essayer de limiter en fonction d'une clause LIKE, j'obtiens toujours une erreur de désynchronisation de la commande.
$stmt->store_result();
je pense que votre réponse devrait clarifier cela.$select_stmt->close();
de séparer mes requêtes avec pour les diviser (pas simultanées mais procéduralesJ'ai résolu ce problème dans mon application C - voici comment je l'ai fait:
Citant des forums mysql:
Après avoir exécuté ma requête et traité les résultats [API C:
mysql_store_result()
], j'effectue une itération sur tout autre résultat potentiellement en attente qui se produit via l'exécution de plusieurs instructions SQL telles que deux ou plusieurs instructions select (dos à dos sans traiter les résultats).Le fait est que mes procédures ne renvoient pas plusieurs résultats mais la base de données ne le sait pas tant que je n'exécute pas: [C API:
mysql_next_result()
]. Je fais cela en boucle (pour faire bonne mesure) jusqu'à ce qu'il retourne non nul. C'est à ce moment que le gestionnaire de connexion actuel sait qu'il est correct d'exécuter une autre requête (je cache mes gestionnaires pour minimiser la surcharge de connexion).C'est la boucle que j'utilise:
Je ne connais pas PHP mais je suis sûr qu'il a quelque chose de similaire.
la source
mysql
extension héritée ?J'ai eu aujourd'hui le même problème, mais uniquement en travaillant avec une procédure stockée. Cela fait que la requête se comporte comme une requête multiple, vous devez donc «consommer» les autres résultats disponibles avant d'effectuer une autre requête.
la source
J'appelle cette fonction à chaque fois avant d'utiliser $ mysqli-> query Fonctionne également avec les procédures stockées.
la source
Une fois que vous avez utilisé
Vous POURRIEZ fermer à utiliser une autre requête.
Ce problème me traquait pendant des heures. J'espère que cela réparera le vôtre.
la source
$stmt1->execute(); $stmt2=$conn->prepare(...)
donnerait cette erreur, mais$stmt1->execute(); $result1=$stmt1->get_result(); $stmt2=$conn->prepare(...)
fonctionnerait très bien.J'utilise CodeIgniter. Un serveur OK ... celui-ci probablement plus ancien ... De toute façon en utilisant
Corrigé.
la source
Le problème est la bibliothèque C du client MySQL, sur laquelle la plupart des API MySQL sont construites. Le problème est que la bibliothèque C ne prend pas en charge l'exécution simultanée de requêtes, de sorte que toutes les API créées en plus ne le font pas non plus. Même si vous utilisez des requêtes sans tampon. C'est l'une des raisons pour lesquelles l'API MySQL asynchrone a été écrite. Il communique directement avec le serveur MySQL en utilisant TCP et le protocole filaire prend en charge les requêtes simultanées.
Votre solution consiste soit à modifier l'algorithme pour ne pas avoir à avoir les deux en cours à la fois, soit à les changer pour utiliser des requêtes tamponnées, ce qui est probablement l'une des raisons originales de leur existence dans la bibliothèque C (l'autre est de fournir une sorte de curseur).
la source
pour résoudre ce problème, vous devez stocker les données de résultat avant de les utiliser
c'est tout
la source
Autre cause: store_result () ne peut pas être appelé deux fois.
Par exemple, dans le code suivant, l'erreur 5 est imprimée.
(Cela peut ne pas être pertinent pour l'exemple de code d'origine, mais cela peut être pertinent pour les personnes cherchant des réponses à cette erreur.)
la source
Voici quel était mon problème !!!
La liaison des paramètres était "dynamique", donc j'avais une variable qui définit les paramètres des données afin d'utiliser bind_param . Donc, cette variable était fausse, mais au lieu de lancer une erreur comme «mauvaises données de paramètres», elle dit «désynchronisé bla bla bla», donc j'étais confus ...
la source
Je pense que le problème est que vous établissez une nouvelle connexion dans la fonction, puis que vous ne la fermez pas à la fin. Pourquoi n'essayez-vous pas de transmettre la connexion existante et de la réutiliser?
Une autre possibilité est que vous reveniez au milieu d'une récupération en boucle while. Vous ne terminez jamais cette recherche externe.
la source
Vérifiez si vous saisissez correctement tous les paramètres. Il renvoie la même erreur si la quantité de paramètres définis puis passés à la fonction est différente.
la source
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 pour comprendre quel était le problème, il peut donc être utile pour d'autres:
Je n'utilise PAS mysqli, j'utilise toujours mysql_connect J'ai eu quelques requêtes simples, mais UNE requête a provoqué l'échec de toutes les autres requêtes dans la même connexion.
J'utilise mysql 5.7 et php 5.6 j'avais une table avec le type de données "JSON". évidemment, ma version php n'a pas reconnu la valeur de retour de mysql (php ne savait tout simplement pas quoi faire avec le format JSON car le module mysql intégré était trop vieux (du moins je pense))
pour l'instant, j'ai changé le type de champ JSON en texte (car pour l'instant je n'ai pas besoin de la fonctionnalité native mysql JSON) et tout fonctionne bien
la source
Si vous utilisez le jeu de résultats Buffered ou Unbuffered pour récupérer des données, vous devez d'abord 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 procédure MYSQL sur la même connexion tant que vous n'avez pas effacé la mémoire récupérée. Ajoutez cette fonction ci-dessous à l'extrémité droite de votre script, cela résoudra le problème
Référence de la documentation PHP
la source
J'ai rencontré cette erreur en utilisant Doctrine DBAL QueryBuilder.
J'ai créé une requête avec QueryBuilder qui utilise des sous-sélections de colonnes, également créées avec QueryBuilder. Les sous-sélections ont été créées uniquement via
$queryBuilder->getSQL()
et non exécutées. L'erreur s'est produite lors de la création de la deuxième sous-sélection. En exécutant provisoirement chaque sous-sélection avec$queryBuilder->execute()
avant de l'utiliser$queryBuilder->getSQL()
, tout fonctionnait. C'est comme si la connexion$queryBuilder->connection
restait dans un état non valide pour créer un nouveau SQL avant d'exécuter le SQL actuellement préparé, malgré la nouvelle instance de QueryBuilder à chaque sous-sélection.Ma solution était d'écrire les sous-sélections sans QueryBuilder.
la source
J'utilise ODBC, et ce correctif fonctionne pour moi: ODBC -> onglet DSN système -> double-cliquez pour configurer ma source de données -> détails -> onglet Curseurs -> Décochez [Ne pas mettre en cache les résultats des curseurs avant uniquement] - > cliquez sur Ok
la source
Je rencontre souvent cette erreur et c'est toujours lorsque j'exécute une procédure stockée que j'ai débogué dans phpmyadmin ou SQL Workbench (je travaille en php en me connectant à mysqli).
L'erreur résulte du fait que le débogage implique l'insertion d'instructions SELECT à des points stratégiques du code pour me dire l'état des variables, etc. Erreur "Commandes désynchronisées" lorsqu'elles sont appelées depuis php. La solution est toujours de commenter ou de supprimer les sélections de débogage afin que la procédure n'ait qu'un seul jeu de résultats.
la source
Mon problème était que j'utilisais la première instruction prepare, puis j'utilisais la requête mysqli sur la même page et j'obtenais l'erreur "Commandes désynchronisées; vous ne pouvez pas exécuter cette commande maintenant". L'erreur était seulement alors quand j'utilisais le code qui avait la déclaration de préparation.
Ce que j'ai fait, c'est clore la question. et cela a fonctionné.
mysqli_stmt_close ($ stmt);
Mon code
get_category.php (ici en utilisant l'instruction prepare)
admin_get_category_body.php (ici mysqli)
Quelque chose qui vient de me traverser l'esprit, j'ajoute à nouveau une variable de connexion via global $ connection ;. Donc, je pense que fondamentalement, un tout nouvel ensemble de système de requête est démarré après la fin de l'instruction prepare avec mysqli_stmt_close ($ stmt); et aussi j'ajoute ces fichiers et d'autres choses via include
la source
C'est une vieille question, mais aucune des réponses publiées n'a fonctionné dans mon cas, j'ai trouvé que dans mon cas, j'avais des sélections et des mises à jour sur une table dans ma procédure stockée, la même table avait un déclencheur de mise à jour qui était déclenché et déclenché le procédure dans une boucle infinie. Une fois le bogue trouvé, l'erreur a disparu.
la source
Créez deux connexions, utilisez les deux séparément
la source