Erreur MySQL - Commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant
Je suis de l'utilisation de MySQL avec PHP, Codeigniter. J'avais une question qui a été répondu par bluefeet dans le post ici
J'ai créé une procédure stockée pour la deuxième solution par bluefeet. Il fonctionne parfaitement, cependant, alors que la procédure est appelée dans l'environnement de production, tous les autres utilisateurs reçoivent le message d'erreur
Commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant
Pas sûr de savoir comment puis-je surmonter avec cette erreur. J'ai aussi essayé de fermer la connexion après la procédure est appelée, toutefois, les Requêtes des autres utilisateurs sont exécutés avant que la connexion est fermée. Tout le travail autour de ce problème?
Ci-dessous la procédure stockée que j'ai utilisé
DROP PROCEDURE IF EXISTS mailbox.circle_pending_p;
CREATE PROCEDURE mailbox.`circle_pending_p`()
BEGIN
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(CASE WHEN maildate = ''',
date_format(mailtime, '%e-%b'),
''' THEN 1 else 0 END) AS `',
date_format(mailtime, '%e-%b'), '`'
)
) INTO @sql
FROM circle_pending_temp
WHERE mailtime >= (select date_sub(max(mailtime), interval 8 DAY)
from circle_pending_temp);
SET @sql
= CONCAT('SELECT coalesce(email_Circle, ''Grand Total'') Circle,
max(`< 9 days`) `< 9 days`, ', @sql, ' ,
count(*) GrandTotal
from
(
select c.email_Circle,
date_format(c.mailtime, ''%e-%b'') maildate,
coalesce(o.`< 9 days`, 0) `< 9 days`
from circle_pending_temp c
left join
(
select email_Circle,
count(*) `< 9 days`
from circle_pending_temp
where mailtime <= (select date_sub(max(mailtime), interval 8 DAY)
from circle_pending_temp)
) o
on c.email_Circle = o.email_Circle
where c.mailtime >= (select date_sub(max(mailtime), interval 8 DAY)
from circle_pending_temp)
) d
group by email_Circle with rollup ');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
Le PHP que j'utilise pour l'appel de cette procédure est
$db = $this->load->database('mailbox',TRUE);
$res = $db->query('Call circle_pending_p()');
echo $db->_error_message();
$db->close();
$db = $this->load->database('mailbox',TRUE);
if ($res->num_rows() > 0) {
return $res->result_array();
} else {
return 0;
}
OriginalL'auteur Guns | 2013-04-16
Vous devez vous connecter pour publier un commentaire.
Eu la Réponse! Il semble que codeigniter du pilote mysql a des bugs de la manipulation des procédures stockées.
J'ai changé les pilotes à partir de mysql mysqli dans le config/database fichier en changeant de
à
Post que j'ai modifié le system/database/drivers/mysqli/mysqli_result.php fichier et ajouté au-dessous de la fonction
et modifié le modèle ci-dessous
Cela a résolu le problème!
OriginalL'auteur Guns
Essayer:
Après l'appel de procédure.
MySQLi
ne pouvez pas appeler une autre procédure, tandis que les résultats précédents.Vous devez utiliser
free()
pour chacun d'eux avant toute poursuite de la procédure d'appel ou de l'exécution de la requête.Source: http://php.net/manual/en/mysqli.query.php
Vous devez le faire après la TOUS
SQL procedure
appel et l'obtention de résultats. Je net know how it should look while using you
base de données wrapper. Still, you probably closed
DB connection " ici:$db->close(); $db = $this->load->database('mailbox',TRUE);
. Je ne pense pas que ce besoin là-bas.OriginalL'auteur BlitZ
Dans le fichier
Ajouter:
OriginalL'auteur nthaih
J'ai fait face à de même problème lorsque j'ai été en cours d'exécution de la procédure stockée dans une boucle. Le code ci-dessous j'ai été en utilisant:
Dans ce cas, la table temporaire que j'ai créé était plaint de ce que la table existe déjà.
Donc utilisé cette approche à la place:
Maintenant l'exécution a été parfait
OriginalL'auteur Active India