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 :

Fonction avec variable dans la requête


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut Fonction avec variable dans la requête
    Bonjour à tous,

    J'essaie désespérément de faire une fonction contenant une requête SQL avec des variables à l'intérieur afin de savoir si une ligne existe dans ma BDD dans un premier temps et également connaitre la valeur du booléen.

    Cependant, je ne sais pas pourquoi mais elle ne fonctionne pas.

    Est-ce qu'une âme charitable pourrait m'aider, s'il vous plait?
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function alert_exist($idses, $alert_type) {
    	 $req_alert = $bdd->query('
    	       SELECT "$alert_type"
    	       FROM gdpm_setup 
    	       WHERE id_user = "$idses"
    	       AND "$alert_type" = TRUE');
    	 $alert = $req_alert->fetch();
    	 $alert = $alert[$alert_type];
    	 return $alert;	                    
    }
     
    $alert = alert_exist(1, mail);
    echo $alert;
    Je vous remercie!

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Salut,

    Modifies ta requête comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     $req_alert = $bdd->query("SELECT '$alert_type'
    	       FROM gdpm_setup 
    	       WHERE id_user = '$idses'
    	       AND '$alert_type' = TRUE");
    Mais avant, il faut t'assurer que la requête retourne bien une ligne, pour ça tu peux utiliser num_rows.
    En gros ta fonction doit être comme suite :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function alert_exist($idses, $alert_type) {
    	 $req_alert = $bdd->query("SELECT '$alert_type'
    	       FROM gdpm_setup 
    	       WHERE id_user = '$idses'
    	       AND '$alert_type' = TRUE");
             $nbrLignes=$req_alert->num_rows;
             if($nbrLignes>0){
    	    $alert = $req_alert->fetch();
    	    $alert = $alert[$alert_type];
             }
             else $alert="Aucune ligne trouvée !";
    	 return $alert;	                    
    }
    et quand tu veux appeler la fonction, il faut mettre le champ mail entre double quotes "" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $alert = alert_exist(1, "mail");

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Bonjour Toufik82,

    Merci beaucoup pour ta réponse.

    J'ai bien effectué les modifications, cependant, j'ai le même problème, lorsque j'appelle la fonction
    avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $alert = alert_exist(1, "mail");
    La page ne s'affiche plus.

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    as-tu copier/coller le corps de la fonction comme je l'ai mis dans mon post plus haut ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Oui, la page ne s'affiche pas

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Si la page ne s'affiche pas et qu'il n'y a aucune erreur affichée, cela veut dire qu'il y'a un truc anormal.

    commençons par voir les exceptions (s'il y'en a), englobe le corps de la fonction dans un bloc try catch :
    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
     
    function alert_exist($idses, $alert_type) {
       try{
    	$req_alert = $bdd->query("SELECT '$alert_type'
    	       FROM gdpm_setup 
    	       WHERE id_user = '$idses'
    	       AND '$alert_type' = TRUE");
             $nbrLignes=$req_alert->num_rows;
             if($nbrLignes>0){
    	    $alert = $req_alert->fetch();
    	    $alert = $alert[$alert_type];
             }
             else $alert="Aucune ligne trouvée !";
          }catch(Exception $e){
              $alert=$e->getMessage();
          }
       return $alert;	                    
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    La page ne s'affiche toujours pas...

    Après quelques recherche, je viens de trouver la fonction ->rowCount(); pour remplacer ->num_rows;.

    Je fais quelques tests et reviens après.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Bon, ça ne fonctionne pas mieux pour autant...

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Je ne suis pas un fan de mysqli mais je pense que le souci est dans la ligne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $req_alert->fetch();

    Essaies d'utiliser un fetch_assoc du style orienté objet dans une boucle while.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Attention aux guillemets utilisés !
    • Pour les noms de colonnes, ce n'est pas ', mais `.
    • Pour les valeurs, on met des ' pour des chaines. Pas pour des numériques (id_user)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	$req_alert = $bdd->query("SELECT `$alert_type`
    	       FROM gdpm_setup 
    	       WHERE id_user = $idses
    	       AND `$alert_type` = TRUE");
    Cela dit, il faudrait au moins :

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    En suivant les exemples, voici où j'en suis arrivé :

    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
    26
    $mysqli = new mysqli("localhost", "my_user", "my_password");
     
    /* Vérification de la connexion */
    if (mysqli_connect_errno()) {
        printf("Échec de la connexion : %s\n", $mysqli->connect_error);
        exit();
    }
     
    $alert_type = "mail";
    $query = "SELECT '.$alert_type.'
    	       FROM gdpm_setup 
    	       WHERE id_user = .$idses";
     
    if($result = $mysqli->query($query)) {
     
         /* Récupère un tableau associatif */
         while ($row = $result->fetch_assoc()) {
               printf ("%s (%s)\n", $row[$alert_type];
         }
     
         /* Libération des résultats */
         $result->free();
    }
     
    /* Fermeture de la connexion */
    $mysqli->close();
    Cependant, cela ne fonctionne pas.
    J'ai enlevé la fonction afin d'essayer de cibler le problème.

    Il y a également un truc de bizarre avec la requête PDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $alert = $alert[$alert_type];
    Pour moi, la ligne ci-dessus devrait renvoyé un booléen mais elle renvoie "mail" : le nom de la colonne et non pas la valeur...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Bonjour jreaux62,

    Merci pour ta réponse

    Je suis passé en "prepare", normalement il ne devrait plus y avoir de problème de ce coté là :
    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
    $alert_type = "mail";
    $req_alert = $bdd->prepare("
    	 SELECT :alert_type
    	 FROM gdpm_setup 
    	 WHERE id_user = :idses");
    $req_alert->execute(array(
    	'alert_type' => $alert_type,
    	'idses' => $idses));
     
    $nbrLignes=$req_alert->rowCount();
     
    if($nbrLignes>0) {
    	$alert = $req_alert->fetch();
    	$alert1 = $alert['alert_mail_post'];
    }
    else {
    $alert="Aucune ligne trouvée !";
    }
    Citation Envoyé par jreaux62 Voir le message
    Cela dit, il faudrait au moins :
    • vérifier que $alert_type est bien un nom de colonne valide
    C'est tout bon pour ça

    Citation Envoyé par jreaux62 Voir le message
    Je ne connais pas du tout, je vais essayer de me pencher dessus.

    Merci beaucoup!

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    [*]sécuriser $idses avec mysqli_real_escape_string()
    Jreaux62, ça marche avec PDO ou uniquement avec mysqli?

  14. #14
    Invité
    Invité(e)
    Par défaut
    LOL... mysqli.

    Mais si tu utilises PDO, c'est MIEUX !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $alert_type = "mail";
    $sql_alert = "SELECT ".$alert_type." 
    	 FROM gdpm_setup 
    	 WHERE id_user = :idses";
     
    $req_alert = $bdd->prepare($sql_alert);
    $req_alert->execute(array(
    	'idses' => $idses
    	));
    Remarque importante :
    • un nom de la colonne en paramètre ($alert_type) NE PEUT PAS être "préparé" *.
    • SEULES les valeurs peuvent l'être (voir PDO::prepare).


    * C'est pourquoi j'ai préciser qu'il fallait BIEN VÉRIFIER que $alert_type est bien un nom de colonne valide (présent dans la table gdpm_setup).
    On peut/doit utiliser PDO::quote (à confirmer... car non testé)
    [EDIT] OUBLIE $bdd->quote() ici : il ne peut pas être utilisé sur un nom de colonne.
    Dernière modification par Invité ; 28/01/2020 à 17h20.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Après plusieurs essais, cela ne fonctionne toujours pas.

    Il y a deux points qui me semblent bizarre:
    - La requête "fonctionne" si elle n'est pas dans la fonction. Mais une fois dans la fonction, le script s'arrête au niveau de la désignation de la variable $sql_alert.
    - Hors de la fonction, lorsque que j’exécute la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $alert_type = "mail";
    $sql_alert = "SELECT ".$bdd->quote($alert_type)." 
    						 FROM gdpm_setup 
    						 WHERE id_user = :idses";
    $req_alert = $bdd->prepare($sql_alert);
    $req_alert->execute(array(
    	'idses' => $idses));
    $donnees = $req_alert->fetch();
    La variable $donnees['mail'] me retourne "mail" alors que je devrais avoir un booléen 1 ou 0...

    Avez-vous d'autres pistes?

    Merci pour votre aide.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    'mail' est une chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $alert = alert_exist(1, 'mail');
    Ensuite, dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $row = $req_alert->fetch();
    $donnees = $row[$alert_type];

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Merci jreaux62 pour ton temps passé,

    La fonction bloque toujours au niveau suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_alert = "SELECT ".$bdd->quote($alert_type)." 
    	FROM gdpm_setup 
    	WHERE id_user = :idses";
    Cordialement,

    Gauthier

  18. #18
    Invité
    Invité(e)
    Par défaut
    1- On ne peut pas tester/dégoguer à ta place.

    2- OUBLIE $bdd->quote() (il ne peut pas être utilisé sur un nom de colonne)

    3- Mets un try catch :

    Dernière modification par Invité ; 28/01/2020 à 17h19.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bon sang, mais c'est bien sûr !!...
    Si tu es dans une fonction, il faut y définir la connexion !


    Si $bdd est déjà définit en amont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function alert_exist($idses, $alert_type) {
       global $bdd;
    ...
    }
    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function alert_exist($idses, $alert_type) {
       $bdd = .......; // ou include('connect.php') ou...-> il faut définir la variable de connexion !
    ...
    }

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Cool! Merci!
    ça a déjà débloqué une bonne partie.

    Il ne reste plus que le fait que la variable $donnees vaut 'mail' alors qu'elle devrait valoir 1 ou 0, non?

    Merci beaucoup en tout cas pour ce déblocage

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [phpMyAdmin] Passer le nom d'une table en variable dans une requête avec phpMyAdmin
    Par EnRadeSurEclipse dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 29/09/2014, 11h49
  2. Requête sql avec variable dans cellule excel
    Par MENOT72 dans le forum SQL
    Réponses: 2
    Dernier message: 09/09/2011, 17h33
  3. [MySQL] erreur avec une variable dans une requête
    Par Hayabusa dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/03/2007, 23h42
  4. Nom de champ variable dans une requête SQL
    Par stip dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2004, 18h02
  5. Passage de variable dans une requête
    Par zestrellita dans le forum Langage SQL
    Réponses: 5
    Dernier message: 02/09/2004, 13h27

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