Procedure stockée avec mysql 5

Petit nouveau ! | 5 Messages

03 janv. 2008, 15:53

bonjour
j'essaie d'appeler une procedure stockée avec un paramètre soit entre ou sortie nimporte.
je reussi a appeler une procedure stockée qui ne copie pas de valeur mais qd parametre je n'aipas le lien entre variable PHP et Mysql
voici mon code

pour para en entree

Code : Tout sélectionner

CREATE PROCEDURE `bdtest`.`paraEntree` ( nb varchar(20)) BEGIN insert into tabletest values(null,nb); END
ou

pour sortie

Code : Tout sélectionner

CREATE PROCEDURE `bdtest`.`paraSortie` (out nb int) BEGIN select max(id) into nb from tableTest; END
et le code php :
try {
   $dbh = new PDO('mysql:host=localhost;dbname=bdtest', 'utBase', 'hwQTMMvCEa35aeHF');

// pour entre 
$stmt = $dbh->prepare("CALL paraEntree(?)");
$stmt->bindParam(1, $nb, PDO::PARAM_STR,20);
$value = 'rrr';
$stmt->execute();

//pour sortie
$stmt = $dbh->prepare("CALL paraSortie(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 20);
// Appel de la procédure stockée
$stmt->execute();
print "La procédure a retourné : $return_value\n";

   $dbh = null;
} 
catch (PDOException $e) {
echo $e->errorInfo() ;
}
?> 
pbl ds passage parametre car sans para c ok et test des proc direct sur mysql ok !

help
merci

et pourtant pas d'erreur

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 janv. 2008, 16:20

Modération :
sebpern, merci de faire attention à l'orthographe et à la ponctuation lorsque tu rédiges tes messages..

De plus, le multipostage est interdit sur PHPFrance
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

03 janv. 2008, 19:14

pbl ds passage parametre car sans para c ok et test des proc direct sur mysql ok !
De mon côté, je rech proj prof pour proj priv, s'adr a l'hot Mar. (et plus si affinités)

Plus sérieusement, pourrais-tu ré-expliquer ton problème en faisant des phrases complètes, s'il te plait ? Personnellement, je n'ai rien compris et ça ne m'étonnerait pas que ce soit le cas des autres personnes à avoir lu ce sujet.

Petit nouveau ! | 5 Messages

05 janv. 2008, 12:30

alors, je souhaite appeler une procedure stockée, crée sous MYSQL5, depuis le PHP.

avec une procedure stockée sans parametre : pas de soucis

mais lorsque j'ai une procedure stockée avec des paramètres ( entrée ou sortie ) cela ne marche pas : en effet j'appelle ma procedure stockée avec le parametre en sortie et ds mon PHP je ne recupère pas les valeurs que la procédure stockée est censé copier. Cependant je n'ai pas d'erreur.

une idée ?
merci

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 janv. 2008, 15:38

Apparement, le driver PDO de MySQL ne supporte pas cette utilisation (cf #35935) donc il te faudra utiliser une variable sur le serveur, que tu récupères ensuite par un SELECT, eg
//pour sortie 
$stmt = $pdo->prepare("CALL paraSortie(@foo)"); 
if (!$stmt->execute())
{
	die('Erreur ' . $stmt->errorInfo());
}

list($return_value) = $pdo->query('SELECT @foo')->fetch();
Note aussi l'utilisation de errorInfo() pour récupérer les erreurs.

Petit nouveau ! | 5 Messages

06 janv. 2008, 17:43

et pour une fonction comment je recupère le retour ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 janv. 2008, 18:26

Probablement avec un truc comme

Code : Tout sélectionner

SET @foo = ma_fonction()

Petit nouveau ! | 5 Messages

06 janv. 2008, 18:29

j'ai utilisé cette methode :

Code : Tout sélectionner

$return_value = $pdo->query('SELECT fonction()')->fetch();
par contre la question je me pose c'est avec ce bug on perd qd meme pas mal l'avantage en gain de performance des procedures stockées non ?
vu que l'on est obligé par exemple pour le para en sortie de refaire une requete pour recupérer le résultat

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 janv. 2008, 18:57

En effet, SELECT fonction() paraît une meilleure méthode.
avec ce bug on perd qd meme pas mal l'avantage en gain de performance des procedures stockées non ?
À ma connaissance, ce n'est pas un bug, l'API C de MySQL n'offre simplement pas cette possibilité.

Pour ce qui est des performances... tout ce que tu perds c'est moins de 1ms à recontacter le serveur, donc rien de très grave à mon avis.

ViPHP
ViPHP | 5924 Messages

07 janv. 2008, 02:31

Le gain des performances des procédures stockées réside surtout dans les possibilités qu'elles offrent, qui nécessiteraient des requètes plus complexes si c'était fait plus classiquement…