Ceci est vraiment dérivé de my earlier question today.Appel de la procédure stockée dans la boucle foreach - première exécution seulement
J'ai créé une procédure stockée dans ma base de données que je voulais appeler plusieurs fois de suite à partir de PHP.
Disons que ceci est ma procédure:
CREATE PROCEDURE PROC_1(
IN param1 VARCHAR(255),
IN param2 VARCHAR(255))
BEGIN
DECLARE ok INT;
DECLARE success, failure VARCHAR(255);
/* several SELECT, IF ... THEN, INSERT and UPDATE operations which then SET ok var to 0 or 1 */
IF ok = 1 THEN
SET success = 'Everything went well';
SELECT success;
LEAVE;
ELSE
SET failure = 'Problem description';
SELECT failure;
LEAVE;
END IF;
END
Je l'ai fait de cette façon (version courte):
$calls = array(
"CALL PROC_1('param1', 'param2')",
"CALL PROC_1('param3', 'param4')",
"CALL PROC_1('param5', 'param6')",
);
// assuming I'm already connected to DB with $link
foreach ($calls as $i => $call)
{
echo $i . ': ';
$result = mysql_query($call);
$ok = ($result === FALSE) ? FALSE : TRUE;
var_dump($ok);
if ($result !== FALSE)
mysql_free_result($result);
}
Les premiers travaux d'itération comme prévu, mais quoi que ce soit après le retour FALSE
.
Pourquoi est-ce?
Essayé mysqli
juste au cas où, mais obtenir exactement le même résultat:
0: bool(true)
1: bool(false)
2: bool(false)
Ce qui est intéressant, je l'ai vérifié les journaux MySQL (journalisation configuré pour journaliser toutes les requêtes) et seule la première requête obtient jamais au serveur . Les requêtes suivantes ne parviennent jamais au serveur.
PS. Je cours PHP 5.3.2 et Apache 2.2.17.
MISE À JOUR
Selon la suggestion de Shakti Singh J'ai vérifié $link
état avant interrogation de la base. J'ai remarqué qu'il ya une erreur depuis la deuxième itération voici donc la sortie avec l'erreur:
ERROR: (0)
0: bool(true)
ERROR: (0)
ERROR: (0)
1: bool(false)
ERROR: (2014) Commands out of sync; you can't run this command now
ERROR: (2014) Commands out of sync; you can't run this command now
2: bool(false)
ERROR: (2014) Commands out of sync; you can't run this command now
En outre, cela apparaît dans l'erreur MySQL journal:
101126 15:46:28 [Warning] Aborted connection 129 to db: 'db1' user: 'root' host: 'localhost' (Got an error reading communication packets)
Pouvez-vous var_dump ($ link) en dessous de l'écho $ i. ':'; –
C'était un bon conseil Shakti. Montre un peu plus sur le problème maintenant. Détails dans la question mise à jour –
Une procédure stockée peut renvoyer plusieurs jeux de résultats et renvoie toujours un jeu de résultats supplémentaire qui ne contient aucune donnée mais les informations d'erreur/d'avertissement globales concernant l'appel de procédure en plus de tous les jeux de résultats renvoyés explicitement. - http://forums.mysql.com/read.php?52,228296,228347#msg-228347 – ajreal