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 :

Récupération d'une valeur à partir d'une procédure stockée


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut Récupération d'une valeur à partir d'une procédure stockée
    Bonjour, comment dans mon code php je peux récupérer le résulat de la procédure stockée suivant:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `test`.`test` $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(OUT param1 INTEGER(11))
    BEGIN
         SELECT auteur INTO param1 FROM contenu;
    END $$
     
    DELIMITER ;


    En fait quand j'appelle ma procédure stockée, le message d'erreur m'indique qu'il manque un paramètre, hors c'est un parametre OUT, donc que je voudrais récupérer.
    Comment récupérer la valeur de param1 dans une page PHP?
    Merci pour vos réponses,

  2. #2
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    call test(@mavar);
    select @mavar;

    en IN tu définit les variables que la procédure va exploiter. en out tu définit ce que la procédure va resortir. mais lors de l'appel tu dois lui donner les variables IN, ainsi que les OUT , enfait, tu lui indiques quel variable la procédure va réellement enregistrer en OUT, car comme je te l'ai expliqué tout à l'heure, la procédure ne renvois rien

    du coup en php, bah il te faudra faire :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $req = mysql_query('call test(@mavar); select @mavar as auteur;');
    $row = mysql_fetch_array($req);

    ici, $row['auteur'] aura pour valeur le résultat de ta requète
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Encore merci pour l'explication!

    Euh quand je teste dans mon requeteur:

    call test(@mavar);
    select @mavar;

    il m'indique @mavar = NULL
    Peut-etre que le INTO dans la procédure provoque ce bug?

  4. #4
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    NB : mon 'as auteur' est optionnel, mais cela te permet de ne pas être perdu ensuite car tu n'aura qu'à appeler $row['auteur'].

    Les procédures c'est assez ambigue parce que les variables OUT sont souvent assimilé au RETURNS d'une fonction.

    Ce qu'il faut retenir c'est que la procédure enregistre mais ne retourne rien directement! La fonction elle, retourne un résultat
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    En fait la requete ne marche pas avec le INTO.

    Mon but est de récupérer les données d'un select sans passer par une fonction.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    En fait pour faire plus simple, je veux juste créer une procédure stockée avec un select comme celle ci:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE DEFINER=`root`@`localhost` PROCEDURE `test2`()
    BEGIN
    SELECT auteur FROM contenu;
    END

    J'aimerai juste récupérer le resultset dans mon code PHP, mais comment faire?
    (sans passer par une fonction)

  7. #7
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    là ta procédure stocké ne vas rien faire du tout.

    elle va selectionner les auteurs, certes, mais elle va les afficher nulle part!

    ce que je ne saisis pas , c'est pourquoi tient tu à faire une procédure stockée?


    et je pense que si ton INTO ne marche pas, c'est parceque selon moi ton champ auteur est probablement un champ texte (char, varchar...) et que la variable à laquelle tu l'enregistre est un entier (int(11)), logique que cela ne passe pas
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    En faut je vais rejoindre un projet web dans lequel il travaille énormément avec des procédures stockées, c'est pour cela que j'aimerais en faire le tour.
    La question que je me pose, est ce que je peux mettre une variable de sortie (dans ma procédure stocké) qui serait "typé" en tableau pour ressortir un flot tabulaire dans mon code php?
    En fait, tu penses qu'une procédure peut renvoyer un flot tabulaire, mais qu'on ne ne peut pas l extraire?

  9. #9
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    je reflechit et jte dis ca , je suis péssimiste quand même
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut

    Ce que je voulais dire par là, c'est qu'il existe peut etre un moyen pour retourner le flot tabulaire dans une page PHP à partir d'une simple procédure stockée contenant un simple :
    select * from table

  11. #11
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    d'une part tu ne pourras jamais retourner quoi que ce soit dans une procédure
    en faisant un SELECT *, il te faudra spécifier les champs , ce ne sera qu'un peu plus verbeux.

    assure toi que le projet que tu rejoins fasse vraiment des procédure stockées coté MySQL, car si ca strouve il ne font que du prepare('select...' coté php, et dans ce cas tu t'enbète pour rien

    concrètement, il n'y à pas de type Array en MySQL, tout simplement parce que les Array sont des tables !

    donc deux vrais solution mais dans les deux cas, coté php, il faudra faire deux appel MySQL :

    Soit, tu te sert des fonction CONCAT et GROUP_CONCAT pour regrouper toute tes valeurs dans une même variables (ou plusieurs, tu n'es pas vraiment limité)
    , enfait tu va concatener tes champs dans un même champs séparé par des caractères que tu sauras redétecter en php. tu implode en MySQL et tu explode en PHP.

    soit, et pour moi ce serait la plus "propre" , ta procédure stockées créer une table temporaire (on se rapproche déjà plus des "tableaux") dans laquel elle va stocker tout le résultat de ton SELECT. algorithmiquement (ouha le joli mot) parlant ca donneré :

    Code Algo / MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procédure auteur()
    debut
     
    create temporary table auteur_bis like auteur;
     
    insert into auteur_bis select * from auteur;
     
    FIN

    Puis
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mysl_query('select * from auteur_bis');
    while($row=mysql_fetch_blabla...) {
    et enfin
    Code php/MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query('drop table auteur_bis');


    La dernière solution est là dans un but sécuritaire
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    je comprends le concept, c'est vrai que la deuxieme méthode parait plus propre.
    Pour m'amuser j'ai créer une procédure stockée avec un parametre de sortie:

    Code:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(OUT param1 VARCHAR(32))
    BEGIN
    SELECT auteur INTO param1 FROM contenu WHERE id = 1;
    END

    La requete renvoi "antho" logiquement.
    Dans mysql Administrator (dans le query browser), je tape:
    call test(@nom)
    select @nom

    Puis rien ne s'affche, est ce normal (j'ai essayé avec des ;)?

  13. #13
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    c'est étrange, je viens de tester chez moi sur une table semblable avec exactement la même procédure, et ca marche

    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    --------------
    CREATE PROCEDURE test(OUT param1 char(255)) BEGIN SELECT nom_admin into param1 from admin where nom_admin like '%Sph%'; END;
    --------------

    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    --------------
    call test(@ok)
    --------------

    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    --------------
    select @ok
    --------------
     
    +---------+
    | @ok     |
    +---------+
    | SphynXz |
    +---------+
    1 row in set (0.00 sec)
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Ca marche aussi chez moi quand j'utilise mysql par ligne de commande, quand j'utilise le query browser de mysql, rien ne marche, pourquoi? je ne sais pas!
    En tout cas les procédures marchent, donc je me pose la question maintenant, est que je peux récupérer un "SELECT @mavar" dans mon code PHP, si oui comment?

    ("SELECT @mavar" serait un parametre de sortie d'une procédure quelconque)

  15. #15
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    je pense qu'à ce niveau là la librairie mysql pour php atteint ses limites.

    peut être avec mysqli ou pdo, ou là tu auras la possibilité de substitué le "@mavar", par une variable que tu peux instancier coté php

    il te faudra activer la librairie

    http://www.php.net/pdo , tu as de très beaux exemple d'appel de procédure stockée
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

Discussions similaires

  1. [XL-2003] Récupération des données dans une base à partir d'une valeur donnée
    Par mandrake57 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 01/04/2011, 15h33
  2. Réponses: 2
    Dernier message: 01/08/2008, 10h33
  3. ecrire à partir d'une macro sous excel une valeur dans une base sql server
    Par Guena5635 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/04/2008, 09h53
  4. Réponses: 1
    Dernier message: 26/09/2007, 18h50
  5. Réponses: 7
    Dernier message: 28/01/2007, 12h38

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