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

Langage PHP Discussion :

Requête SQL PHP préparée pour chercher une des valeurs d'un tableau


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Par défaut Requête SQL PHP préparée pour chercher une des valeurs d'un tableau
    Bonjour

    Je suis en train de passer au crible toutes les requêtes sql d'un code que j'ai rédigé il y a un petit moment pour les transformer en requêtes préparées avec prepare et execute(array()). Cependant, j'avais rédigé une requête que je ne parviens pas à traduire proprement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $requete = "";
    foreach ($_POST['perso'] as $key => $value) {
        $requete = $requete . 'clef=\'Personnage\' AND valeur=\''.$value.'\'' . " OR ";
    }
    $requete = $requete . "0=1";
    $req = $bdd->query('SELECT * FROM options WHERE '.$requete.'  ORDER BY sequence ASC');
    Ce que fait ce code :
    • On récupère dans $_POST une liste de clé et de valeurs
    • On veut récupérer toutes les ligne avec au moins une valeur
    • Pour ça on fait une requête partielle avec les conditions, du type
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      'clef=\'Personnage\' AND valeur=\'valeur1'\' OR clef=\'Personnage\' AND valeur=\'valeur1\' ... OR'
    • On conclue par "0=1" pour échapper le dernier OR
    • On envoie la requête

    Le problème : on ne sait pas ce qu'il y a dans $_POST. En particulier, il peut y avoi des guillemets échappatoires et autres fantaisies de ce type. Je voudrais donc utiliser plutôt une requête préparé, mais je n'ai pas d'idée. Quelqu'un a t il déjà rencontré ce type de cas?

    Merci beaucoup pour votre aide

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 002
    Par défaut
    Citation Envoyé par Léo-Nils Voir le message
    Le problème : on ne sait pas ce qu'il y a dans $_POST. En particulier, il peut y avoi des guillemets échappatoires et autres fantaisies de ce type. Je voudrais donc utiliser plutôt une requête préparé, mais je n'ai pas d'idée. Quelqu'un a t il déjà rencontré ce type de cas?
    C'est tout l'intérêt des requêtes préparées, on se contrefiche de ce que peuvent contenir les variables qu'on lui passe, les échappements nécessaires sont fait automatiquement.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // On fait quelques vérifications sur $_POST['perso'] et des éventuels sanitizations,
    // puis on affecte le résultat à la variable $perso.
    // En d'autres termes on ne passe pas directement un POST ou un GET à une requête.
     
    $requete = 'SELECT * FROM options WHERE clef="Personnage" AND valeur IN (?'
             . str_repeat(',?', count($perso) - 1)
             . ') ORDER BY sequence ASC';
    $stmt = $bdd->prepare($requete);
    $stmt->execute($perso);
    Aussi, mieux vaut remplacer SELECT * par SELECT champ1, champ2..., c'est plus rapide.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Par défaut
    Bonjour
    Merci beaucoup pour votre réponse. J'avais en effet toujours utilisé les reqêtes prépérées avec quelquechose de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $req = $bdd->prepare('SELECT * FROM scenario WHERE ordre=:ordre');
    $req->execute(array('ordre'=>$ordre));
    Je n'avais donc jamais eut affaire à des cas plus complexes ou dynamique.
    Merci beaucoup pour votre aide

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

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