Accueil > Forum > > > > procedure stockée avec parametre en sortie avec PDO/MySQL
procedure stockée avec parametre en sortie avec PDO/MySQL
mercredi 5 août 2009 à 11:44:38 |
procedure stockée avec parametre en sortie avec PDO/MySQL

poland_power
|
Hello m'sieurs dames,
en esperant que l'un de vous puisse m'aider, je vous expose mon soucis.
j'ai une procédure stockée nommée avec un parametre de sortie dont voici le prototye:
Code : PROCEDURE `sp_create_user`(
IN _login VARCHAR(20),
IN _pass VARCHAR(40),
IN _name VARCHAR(40),
IN _email VARCHAR(320),
OUT _err_code INT
)
avec un parametre en sortie donc...
je me suis mis en tete d'utiliser PDO pour faire les appels de mes procedures stockées puisque j'ai pas trouvé de moyen de le faire nativement avec des fonction PHP et que "la POO de toute facon c'est mieux".
braf j'ai mon petit bout de code qui normalement devrait executer ma procédure stockée:
Code PHP :
$stmt = $dbh->prepare('CALL sp_create_user( :login, :pass, :name, :email, :err );');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->bindParam(':login', $login);
$stmt->bindParam(':pass', $pass);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':err', $err, PDO::PARAM_INT, 10);
$stmt->execute();
$errInfo = $stmt->errorInfo();
print( $errInfo[0] .' - '. $errInfo[1] .' - '. $errInfo[2] .'<br/>' );
mon probleme c'est que lorsque j'execute ca, j'obtiens:
42000 - 1414 - OUT or INOUT argument 5 for routine chat.sp_create_user is not a variable or NEW pseudo-variable in BEFORE trigger
et honnetement, apres quelques heures de recherche, je vois pas ou se trouve le probleme.
peut etre le driver PDO_MYSQL qui gere pas les parametre en sortie...? j'ai pas reussi a trouver de confirmation de ca en tout cas...
bref, si vous trouvez une erreur dans ma facon de faire, si vous avez une technique toute autre pour executer une procedure stockée MySQL avec parametre en sortie (et pour recuperer la valeur du parametre bien evidemment) avec PDO ou pas, merci de m'eclairer :)
|
|
mercredi 5 août 2009 à 14:47:46 |
Re : procedure stockée avec parametre en sortie avec PDO/MySQL

poland_power
|
Réponse acceptée !
Eureka! comme dirait l'autre...
j'ai enfin trouvé une reponse convenable et, comme ca me met de bonne humeur, je vous montre (pour ceux que ca interesse).
alors en gardant la meme procedure stockée, on peut adapter le code PHP précédant pour obtenir ca:
Code PHP :
// on remplace le parametre PDO par une variable de session SQL (@err en l'occurence)
// et on selectionne cette variable apres l'appel de la procedure stockée
$stmt = $dbh->prepare('CALL out_sp_create_user( :login, :pass, :name, :email, @err ); SELECT @err');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->bindParam(':login', $login);
$stmt->bindParam(':pass', $pass);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
// on enleve la ligne suivante qui est devenue inutile
//$stmt->bindParam(':err', $err, PDO::PARAM_INT, 10);
$stmt->execute();
// on enleve aussi l'affichage des erreurs, c'etait juste pour tester
//$errInfo = $stmt->errorInfo();
//print( $errInfo[0] .' - '. $errInfo[1] .' - '. $errInfo[2] .'<br/>' );
// et surtout, on rajoute ca apres:
$stmt->nextRowset(); // permet de passer au resultat suivant
$out = $stmt->fetch(); // on recupere l'unique ligne de resultat
print( '@err = '. $out['@err'] ); // et on recupere la valeur de notre variable @err
je trouve ca un peu tordu, mais bon, hein...
visiblement PDO n'accepte pas qu'on lui "bind" un parametre en sortie, donc on a pas trop le choix (ou si on a le choix, je veux bien savoir quelles sont les autres options).
bref, voici les liens des pages ou j'ai pu trouver des elements de reponse:
http://forums.mysql.com/read.php?52,198596,219159#msg-219159
http://www.tek-tips.com/viewthread.cfm?qid=1441148&page=10
http://www.artfulsoftware.com/infotree/tip.php?id=130
(oui, c'est tout en anglais... apparemment les francophones se posent pas trop ce genre de questions xD )
merci de votre attention et a la prochaine!
|
|
mercredi 5 août 2009 à 20:54:16 |
Re : procedure stockée avec parametre en sortie avec PDO/MySQL

nautilus99
|
Bonsoir, si, on peut binder de sparamètres en entrée et en sortie.. (un seul en sortie).. Mais il y a une syntaxe à bien respecter..
dans la documentation PDO - Procédures stockées et requêtes préparées les exemples 4 et 5 contiennent la syntaxe à utiliser pour un bind correct.
|
|
mercredi 5 août 2009 à 22:57:39 |
Re : procedure stockée avec parametre en sortie avec PDO/MySQL

poland_power
|
oui j'ai vu cette page et quelques autres sur d'autres sites qui se contentent de copier celle ci.
c'est meme la premiere chose que j'ai essayé...
alors effectivement, dans le code que j'ai copié, j'ai oublié le "|PDO::PARAM_INPUT_OUTPUT" dans le bind du parametre en sortie, mais j'ai bien essayé avec, et si ca avait fonctionné, j'aurais pas cherché plus loin.
seulement voila... pas moyen de faire fonctionner cette syntaxe... je viens de reverifier histoire de pas dire n'importe quoi :)
avec exactement ce code qui est tres tres proche du code donné en exemple...
Code PHP :
$stmt = $dbh->prepare("CALL sp_create_user( ?, ?, ?, ?, ? );");
$stmt->bindParam(1, $login);
$stmt->bindParam(2, $pass);
$stmt->bindParam(3, $name);
$stmt->bindParam(4, $email);
$stmt->bindParam(5, $value, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 10);
// Appel de la procédure stockée
$stmt->execute();
$errInfo = $stmt->errorInfo();
print( $errInfo[0] .' - '. $errInfo[1] .' - '. $errInfo[2] .'<br />');
print( "La procédure a retourné : $value\n" );
...j'obtiens exactement ce resultat:
HY000 - 1414 - OUT or INOUT argument 5 for routine chat.sp_create_user is not a variable or NEW pseudo-variable in BEFORE trigger
La procédure a retourné :
c'est pas vraiment mieux...
alors je suis sans doute passé a coté de quelques chose ... mais quoi...?
peux tu m'eclairer...?
merci :)
|
|
jeudi 6 août 2009 à 00:46:18 |
Re : procedure stockée avec parametre en sortie avec PDO/MySQL

nautilus99
|
lol :)
Très simple en plus là...
HY000 - 1414 - OUT or INOUT argument 5 for routine chat.sp_create_user is not a variable or NEW pseudo-variable in BEFORE trigger
Est-ce qu eau moins tu as déclaré et initialisé ta variable de retour $value AVANT le bind ?
Su rce coup là, ce n'est pa sun bug de PHP ni d eMySQL (ni de postgresql, oracle...) mais les procèdures stockées ont toujours exigé en SQL qu eles bounds soient déclarés et initialisés avant le call, puisqu eles routines d'exécution des procédures et triggers se contentent d'utiliser un pointeur sur l'adresse de la variable.
|
|
jeudi 6 août 2009 à 01:12:32 |
Re : procedure stockée avec parametre en sortie avec PDO/MySQL

poland_power
|
alors... en ajoutant une initialisation de la variable $value pour finalement obtenir le code suivant:
Code PHP :
$value = 12345;
$stmt = $dbh->prepare("CALL sp_create_user( ?, ?, ?, ?, ? );");
$stmt->bindParam(1, $login);
$stmt->bindParam(2, $pass);
$stmt->bindParam(3, $name);
$stmt->bindParam(4, $email);
$stmt->bindParam(5, $value, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 10);
// Appel de la procédure stockée
$stmt->execute();
$errInfo = $stmt->errorInfo();
print( $errInfo[0] .' - '. $errInfo[1] .' - '. $errInfo[2] .'<br />');
print( "La procédure a retourné : $value\n" );
bah j'obtiens toujours le meme resultat:
42000 - 1414 - OUT or INOUT argument 5 for routine chat.sp_create_user is not a variable or NEW pseudo-variable in BEFORE trigger
La procédure a retourné : 12345
la seule difference, c'est que la variable $value me retourne la valeur a laquelle elle a été initialisé...
ici, 12345, alors que la procedure stockée doit la mettre a 0; 1 ou 2...
en plus je comprends peut etre rien, mais dans mon exemple qui fonctionne avec une variable de session et une 2e requete, on peut remarquer que la variable de session (@err) n'est pas initialisé.
alors l'argument de l'initialisation de la variable passée a la procédure, ca tient pas...
bon sinon, loin de moi l'intention de paraitre desagrable, c'est sympa de chercher a m'aider, mais as tu deja vu un script fonctionner avec la methode fournie dans la doc PDO nautilus...?
si oui, ca serait sympa d'en poster un bout histoire de pouvoir comparer.
merci
|
|
jeudi 6 août 2009 à 01:41:15 |
Re : procedure stockée avec parametre en sortie avec PDO/MySQL

nautilus99
|
Avec quasiment le smêmes paramètres que toi, PHP 5.3, Mysql 5.1.37 sur un Linux Opensuse 11.1, je n'ai aucun problème.
Idem sur une série de serveurs de production, qui eux ont le même PHP 5.3, MySQL 5.1.37 et Fedora 11.
C'ets la raison pour laquelle j'ai cherché dans ton code ce qui peut ne pas aller.
Petit détail peut-être, tant sur mon serveur d edev que sur les serveurs d eprod, les procédures stockées sont toutes dans des basses InnoDB, je n'ai pas testé sur des bases MyISAM.
|
|
jeudi 6 août 2009 à 02:10:19 |
Re : procedure stockée avec parametre en sortie avec PDO/MySQL

poland_power
|
humpf...
alors je developpe avec la derniere version de WAMP Serveur:
Windows XP SP1
Apache 2.2.11
PHP 5.3
MySQL 5.1.36
ma base utilise MyISAM par defaut (j'ai pas trouvé comment changer ca dans PHPMyAdmin) mais toutes mes tables utilisent InnoDB...
bon... si tu me dit que ca fonctionne autant sur des serveur de dev que de prod c'est que ca doit venir de chez moi.
faudra que je teste ca sous linux avec la derniere version de MySQL a l'occaz...
en attendant je vais me contenter d'utiliser mon "astuce".
merci pour l'aide en tout cas
|
|
Cette discussion est classée dans : code, parametre, sortie, stmt, pdo
Répondre à ce message
Sujets en rapport avec ce message
php SQL selection de la 1ère ligne [ par fredo35m ]
Bonjour,j'ai une requete qui selectionne l'ensemble des lignes d'une bdd possèdant les caracteriqtiques souhaitées ordonner par date.$sSQL="SELECT COD
Avec PDO, impossible de récupérer des exceptions en connexion persistante [ par Nix6800 ]
Bonjour. J'utilise PDO pour me connecter à ma BDD Oracle et j'aimerais utiliser des connections persistantes en faisant des envoies multiples (avec un
Code de sortie [ par gwadarky ]
Slt a tous !Je cherche un code qui permet d'ouvrir automatiquement une nouvelle page quand quelqu'un quitte le site. Merci d'avance !Un site cool pour
PDO + singleton [ par eltyty ]
Bonjour, J'ai réalisé un code pour réaliser une connexion "singleton" avec PDO or j'ai une erreur. Voilà le code du singleton : [code=php] class C
PDO serveur BDD distant [ par TheGorgo ]
Bonjour, Je cherche à me connecter à un serveur de base de données distante en utilisant Doctrine. Lorsque je veux générer mon schèma de données, j'a
Problème PDO [ par supertailleur ]
Bonjour à tous, J'aurai besoin de vos compétences concernant un problème sur des requêtes en PDO. Lorsque je code sur mon serveur wamp tout marchait
moteur de recherche en php [ par aminagu ]
bonjours , j essey de faire un moteur de recherche en php , le systeme me donne le message d erreur suivant : /* LIKE '%inpt%'SELECT * FROM `table-m
connexion Myslq PDO [ par vargas ]
Bonjour à tous me voila avec une autre question présentement j'ai un fichier fonctions.php qui est une classe qui extend de PDO dans laquelle j'ai t
connexion PDO [ par vargas ]
Bonjour je voudrais créer une classe connexion à ma bd MySql et une autre classe qui vas contenir toutes mes requêtes. Pour le le moment j'ai ça :
La valeur de la balise option (select) [ par fallisme ]
Bonjour à tous.ce bout de code un extrait. C'est en fait une balise "select" qui affiche des informations extraites d'une table de la base et dont le
Livres en rapport
|
Derniers Blogs
ROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGEROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGE par Matthieu MEZIL
Si vous utilisez Roslyn et que vous vous voulez vous simplifier le code du code rewriter, je vous conseille d'installer mon NuGet package RoslynHelper ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|