IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Procédures stockées et PDO


Sujet :

PHP & Base de données

  1. #1
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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";

    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

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que cela fonctionne en dehors de PDO ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Oui, cela fonctionne bien en mode console MySQL

    EDIT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  4. #4
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Je vais peut être dire une ânerie, mais pour la requête (1er post), ne faudrait il pas faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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]

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Salut et merci pour ta réponse

    J'ai testé :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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:

Discussions similaires

  1. [SQL-Server] Procédure stockée et PDO
    Par zenoX dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 14/11/2012, 00h19
  2. [PDO] [PHP 5.3][ZEND][PDO] Exécution d'une procédure stockée via PDO et Zend
    Par daav14 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/10/2010, 20h56
  3. Php pdo et procédure stockée
    Par geo54 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/06/2010, 04h54
  4. [MySQL] PDO et procédure stockée mysql
    Par 0redd dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/09/2009, 00h11
  5. Mysql5, Procédure stockée et PDO::LastInsertId()
    Par Philsmile dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 10/04/2006, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo