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 :

Appel de procédure stockée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut Appel de procédure stockée
    Bonjour,


    j'essaye d'appeler une procédure stockée mais je n'arrive pas à récuperer le résultat avec php...

    voici le code que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?php
     
    include('conn.php');
     
    if(isset($_POST['conn']))
    {
    	open();
     
    	$email = strtolower($_POST['login']);
    	$pwd = $_POST['pwd'];
    	$dateTime = date("Y-m-d H:i:s");
     
    	mysql_query("call sp_auth_ID($email,$pwd,$dateTime,@rep);"); // Requête SQL
    	$reponse = mysql_query("select @rep;");
    	while($donnees = mysql_fetch_array($reponse)){
    		echo $donnees[0];	}
     
    	close();
    }
    ?>
    Je n'ai pas d'érreur mais le résultat est vide ...


    cordialement,

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    je tenterais un truc du genre

    mysql_query("
    SET @rep='';
    call sp_auth_ID($email,$pwd,$dateTime,@rep);
    SELECT @rep as xxx from dual ; /*ce qui te renvoi la variable*/
    ");

  3. #3
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    Ca ne fonctionne pas.
    Ce que je ne comprends pas c'est que j'execute la meme requete dans 'MySQL Query Browser' et la sa fonctionne mais aprés avec php je n'arrive pas à récuperer de résultats...



  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    Pour moi, le problème provient du fait que tu exécute deux requêtes.

    Les environnements sont forcements différents, donc la variable @rep n'est pas connue dans le deuxième, c'est pourquoi j'ai proposer de tout mettre dans la même requête.

    Quel version de mysql utilise tu ?
    Quel est le message d'erreur (si tu le récupère) ?

  5. #5
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    Citation Envoyé par romulus1206 Voir le message
    Pour moi, le problème provient du fait que tu exécute deux requêtes.

    Les environnements sont forcements différents, donc la variable @rep n'est pas connue dans le deuxième, c'est pourquoi j'ai proposer de tout mettre dans la même requête.

    Quel version de mysql utilise tu ?
    Quel est le message d'erreur (si tu le récupère) ?
    Voila l'erreur que je récupere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <br />
    <b>Warning</b>:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource in <b>C
    :\...\ig\scripts\auth.php</b> on line <b>17</b><br 
    />
    en faisant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	$reponse = mysql_query("
    	SET @rep='';
    	call sp_auth_ID($email,$pwd,$dateTime,@rep);
    	SELECT @rep as xxx from dual ;"); 
    	while($donnees = mysql_fetch_array($reponse)){
    		echo $donnees[0];	}
    ma version de mysql est 5.1.30

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    Bien,

    Voila un petit test que j'ai réalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
      $cnx  =  mysql_connect($serveur, $user, $pass);
      mysql_select_db($database, $cnx);
      $result =  mysql_query(" CALL sp_auth(@rep);", $cnx);
      $result =  mysql_query("SELECT @rep as tt;", $cnx);
     
      if (!$result) 
      {
           die(mysql_error($cnx));
      }
      $row = mysql_fetch_assoc($result);
      echo  $row["tt"];
    ?>
    avec la procédure stockée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    CREATE  PROCEDURE `sp_auth`(
            OUT p VARCHAR(20)
        )
    BEGIN
    	set p ='5555';
    END;

    Et cela fonctionne
    NB : mysql_query ne supporte pas les requêtes multiples donc ce que je t'ai dit tout à l'heure ne fonctionnait pas DSL .

    Donc ceci correspond exactement à ce que tu fais, c'est surement ton appel à la procédure stockée qui pose problème (chaines de caractère entre quottes ?) de toute façon recupère le résultat de l'éxecution de l'appel à la procédure.

  7. #7
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    Merci je vais regarder ca!

  8. #8
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    CA ne fonctionne pas... je ne comprends pas pkoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	echo $result = mysql_query('call sp_auth_ID('. $email .','. $pwd .',' . $dateTime . ',@rep);',$cnx);
    	echo $result = mysql_query('SELECT @rep as tt;',$cnx);

    voila ce que ca m'affiche quand j'affiche $result. à ce quoi correspond cela?

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    Ok, tu peux essayer cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $result = mysql_query("call sp_auth_ID('". $email ."','". $pwd ."','" . $dateTime . "',@rep);",$cnx);
    if (!$result) echo mysql_error($cnx);

  10. #10
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    Je dois avoir un probleme dans ma procédure stockée, il ne veut rien me retourner...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `sp_auth_ID` $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_auth_ID`(IN p_email varchar(250), IN p_pwd varchar(250), IN p_datetime datetime, OUT p_ID varchar(20))
    BEGIN
     
    set p_ID = '0';
     
    select ID into p_ID from services_users where email=p_email and password=p_pwd;
     
    if p_ID > 0 then
      UPDATE services_users SET last_connexion=p_datetime WHERE id=p_ID;
    end if;
     
     
    END $$
     
    DELIMITER ;

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    bien, bien,

    J'ai tester en modifiant un peux ta procédure.

    ne passe pas le datetime (il sert à rien, remplace le dans l'update par un NOW().

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `sp_auth_ID` $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_auth_ID`(IN p_email varchar(250), IN p_pwd varchar(250),  OUT p_ID varchar(20))
    BEGIN
     
    set p_ID = '0';
     
    select ID into p_ID from services_users where email=p_email and password=p_pwd;
     
    if p_ID > 0 then
      UPDATE services_users SET last_connexion=NOW() WHERE id=p_ID;
    end if;
     
     
    END $$
     
    DELIMITER ;
    l'appel et le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call sp_auth('toto@toto.fr','titi',@rep);
    ca fonctionne pour moi

  12. #12
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    tu peux afficher ton code php complet stp

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?php
      $cnx  =  mysql_connect("localhost", "root", "");
      mysql_select_db("test", $cnx);
      $email = 'toto@toto.fr';
      $pass = 'titi';
      $result =  mysql_query(" SET @rep = 'wwww';", $cnx);
      $result =  mysql_query("CALL sp_auth('$email','$pass',@rep);", $cnx);
      $result =  mysql_query("SELECT @rep as tt;", $cnx);
     
      if (!$result) 
      {
           die(mysql_error($cnx));
      }
      $row = mysql_fetch_assoc($result);
      echo  $row["tt"];
    ?>

  14. #14
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    youpi ca fonctionne enfin!
    Merci beaucoup de ton aide

    Je n'avais pas mit cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result =  mysql_query(" SET @rep = '0';");

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
     
    include('conn.php');
     
    if(isset($_POST['conn']))
    {
    	$cnx = open();
    	$email = strtolower($_POST['login']);
    	$pwd = $_POST['pwd'];
     
      $result =  mysql_query(" SET @rep = '0';");
      $result =  mysql_query("CALL sp_auth_ID('$email','$pwd',@rep);", $cnx);
      $result =  mysql_query("SELECT @rep as tt;", $cnx);
     
      if (!$result) 
      {
           die(mysql_error($cnx));
      }
      $row = mysql_fetch_assoc($result);
      echo  $row["tt"];
     
    	close();
    }
    ?>

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    de rien,

    Juste un dernier point, fait attention au injection SQL, ton code ne parait être protéger.

    Bon courage.

  16. #16
    Membre éclairé Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Par défaut
    Que me conseils tu?

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    Bonjour,

    tout dépend de ton paramétrage et surtout il me parait, veux surtout pas dire que tu as mal fait ou que tu dois faire quelque chose.

    Il existe des fonction bien précises comme celle-ci

    'mysql_escape_string' à utiliser avec un test comme 'get_magic_quotes_gpc'.

    un petit lien : http://fr.php.net/manual/fr/function...ape-string.php
    Le test le plus facile à faire est de saisir dans le email et le pass une chaine comme celle-ci:

    email : ' Or '1' = '1
    pass : ' Or '1' = '1

    ensuite tu vérifie si sa passe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/02/2006, 00h11
  2. Réponses: 3
    Dernier message: 17/01/2006, 17h12
  3. Update appelant une procédure stockées
    Par meufeu dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/10/2005, 18h31
  4. [appeler une procédure stockée]
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 10/03/2005, 22h38
  5. Appel de Procédure stockée en ASP
    Par James85 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/11/2004, 17h55

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