begin process at 2012 05 31 07:41:13
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Base de données

 > 

MySQL

 > 

procedure stockée avec parametre en sortie avec PDO/MySQL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales