Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2010, 16h13   #1
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Par défaut Procédures stockées et PDO

Bonjour,

j'essaie d'exécuter une procédure stockée via PDO tout comme l'exemple de php.net mais cela ne marche pas. J'ai lu quelque part que PDO avait du mal avec les procédures stockées...c'est le cas ?

Voici mon exemple à priori simple :

Code sql :
1
2
3
4
5
6
 
delimiter |
CREATE PROCEDURE test(OUT sortie varchar(20))
BEGIN
SELECT 'Ici la sortie !!' INTO sortie;
END |

Sous cmd, pas de soucis ma ps marche.

Via php :

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
try{
	$connexion = new PDO('mysql:host=localhost;dbname=xxx', 'root', '', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
}catch(PDOException $e){
	echo 'foiré';
}
 
$stmt = $connexion->prepare("CALL test(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 
 
$stmt->execute();
 
echo "La procédure a retourné : $return_value\n";

Citation:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine boursier.test is not a variable or NEW pseudo-variable in BEFORE trigger' in C:\wamp\www\procedure\index.php:14 Stack trace: #0 C:\wamp\www\procedure\index.php(14): PDOStatement->execute() #1 {main} thrown in C:\wamp\www\procedure\index.php on line 14
J'ai essayé différentes choses, je récupère toujours une erreur...

Quelqu'un pourrait il me confirmer qu'on peut exécuter une ps via PDO ?

Merci
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 16h32   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Est-ce que cela fonctionne en dehors de PDO ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 17h42   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Oui, cela fonctionne bien en mode console MySQL

EDIT:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
mysql> CALL test(@sortie);
Query OK, 0 rows affected (0.00 sec)
 
mysql> select @sortie;
+-----------------+
| @sortie         |
+-----------------+
| ici la sortie ! |
+-----------------+
1 row in set (0.00 sec)
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 15h37   #4
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Pour palier le probable bug de l'extension MySQL pour PDO concernant les procédures stockées (les exemples 10 et 11 ne marchent pas), j'ai contourné le problème en faisant ceci :

Code sql :
1
2
3
4
5
6
 
DELIMITER $$
CREATE PROCEDURE test(IN entree varchar(50), OUT sortie varchar(50))
BEGIN
SET sortie = entree;
END $$

Code php :
1
2
3
4
5
6
7
8
9
10
11
 
$statement = $this->_connexion->prepare('CALL test(:entree, @sortie); SELECT @sortie AS sortie;');
$entree = 'du texte en entrée !';
$statement->bindParam(':entree', $entree);
$statement->execute();
 
$statement->nextRowset(); 
$row = $statement->fetchObject();
 
echo $row->sortie;
// du texte en entrée !

Suis pas contre une méthode plus propre si quelqu'un a mieux...
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 08h53   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 699
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 699
Points : 3 269
Points : 3 269
Salut

Je vais peut être dire une ânerie, mais pour la requête (1er post), ne faudrait il pas faire comme ceci :
Code :
$stmt = $connexion->prepare("CALL test(@?)");
Qu'il manquerait l'@, non ?
D'après l'erreur la valeur ne serait pas perçue comme une variable SQL, et c'est l'@ qui définie une valeur pour une variable dans ce cadre là, non ?


Je n'ai jamais pris le temps de faire des procédures stockées, donc je ne sais pas en faite.
Mais sait on jamais.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 11h38   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Salut et merci pour ta réponse

J'ai testé :

Code php :
1
2
3
4
5
6
7
8
 
$stmt = $connexion->prepare("CALL test(@?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 
// ou $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 
 
$stmt->execute();
 
echo "La procédure a retourné : $return_value\n";

Mais j'obtiens :

Citation:
La procédure a retourné :
Sans la valeur de retour ^^
Par contre j'ai plus d'erreur maintenant

Mais bon, j'ai lu sur plusieurs forums (non officiels) que l'extension MySQL pour PDO présente un bug, tout comme l'extension MSSQL je crois. Bref, je suis condamné à "bidouiller" un peu en attendant la correction du bug.


Merci en tout cas de ta réponse et Bonnes Fêtes :bbcodePereNoelQuiNexistePas:
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h48.


 
 
 
 
Partenaires

Hébergement Web