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 :

Problème SELECT WHERE LIKE


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Par défaut Problème SELECT WHERE LIKE
    Bonjour, je suis en train de réaliser un site Internet pour un groupe automobile. Dans ce site il y a un formulaire de recherche (pour rechercher un véhicule d'occasion) et sur ma page de résultat j'ai fait cette requête qui ne me renvoi pas les données escomptée. Pourrais je avoir un éclaircissement ? Je pense que ma requête bien trop compliquée mais …

    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
     
    $requete="
    (SELECT *
    FROM Eurolinea AS e
    LEFT JOIN PlanetVO AS p ON e.Marque = p.Marque
    WHERE
    e.Marque LIKE '%".$_GET['Marque']."%' AND e.EnergieLibelle LIKE '%".$_GET['EnergieLibelle']."%' OR e.Famille LIKE '%".$_GET['Famille']."%' OR e.Annee LIKE '%".$_GET['Annee']."%' OR e.PrixVenteTTC BETWEEN '%".$_GET['PMini']."%' AND '%".$_GET['PMaxi']."%'OR e.Kilometrage BETWEEN '%".$_GET['KMini']."%' AND '%".$_GET['KMaxi']."%' 
    OR
    p.Marque LIKE '%".$_GET['Marque']."%' AND p.EnergieLibelle LIKE '%".$_GET['EnergieLibelle']."%' OR p.Famille LIKE '%".$_GET['Famille']."%' OR p.Annee LIKE '%".$_GET['Annee']."%' OR p.PrixVenteTTC BETWEEN '%".$_GET['PMini']."%' AND '%".$_GET['PMaxi']."%' OR p.Kilometrage BETWEEN '%".$_GET['KMini']."%' AND '%".$_GET['KMaxi']."%')
     
    UNION
     
    (SELECT *
    FROM Eurolinea AS e
    RIGHT JOIN PlanetVO AS p ON e.Marque = p.Marque
    WHERE
    e.Marque LIKE '%".$_GET['Marque']."%' AND e.EnergieLibelle LIKE '%".$_GET['EnergieLibelle']."%' OR e.Famille LIKE '%".$_GET['Famille']."%' OR e.Annee LIKE '%".$_GET['Annee']."%' OR e.PrixVenteTTC BETWEEN '%".$_GET['PMini']."%' AND '%".$_GET['PMaxi']."%'OR e.Kilometrage BETWEEN '%".$_GET['KMini']."%' AND '%".$_GET['KMaxi']."%' 
    OR
    p.Marque LIKE '%".$_GET['Marque']."%' AND p.EnergieLibelle LIKE '%".$_GET['EnergieLibelle']."%' OR p.Famille LIKE '%".$_GET['Famille']."%' OR p.Annee LIKE '%".$_GET['Annee']."%' OR p.PrixVenteTTC BETWEEN '%".$_GET['PMini']."%' AND '%".$_GET['PMaxi']."%' OR p.Kilometrage BETWEEN '%".$_GET['KMini']."%' AND '%".$_GET['KMaxi']."%')
     
    ";

  2. #2
    Invité
    Invité(e)
    Par défaut
    1/ :alert: Attention aux injections SQL !!
    => il faut IMPERATIVEMENT éviter de mettre directement des variables $_GET[...] dans la requête !

    2/ Tu as des ...AND... et des ...OR... à gogo :
    mets des parenthèses pour bien séparer logiquement les conditions !
    le résultat de :
    -> "a AND b OR c OR d"
    peut être très différent de :
    -> "(a AND b) OR (c OR d)"
    ou :
    -> "(a AND (b OR c)) OR d"
    ou :
    -> "a AND ((b OR c) OR d)"
    ...

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Par défaut
    Bonjour, Toujours avec le même problème de retour de données par formulaire.

    J'ai voulu reprendre à zero mon codage de la page resultat du moteur de recherche et je suis a ceci

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    if(isset($_POST['Marque']))      $Marque = $_POST['Marque'];
    else      $Marque="";
     
    if(isset($_POST['Famille']))      $Famille= $_POST['Famille'];
    else      $Famille="";
     
    if(isset($_POST['EnergieLibelle']))      $Energie= $_POST['EnergieLibelle'];
    else      $Energie="";
     
    if(isset($_POST['Annee']))      $Annee= $_POST['Annee'];
    else      $Annee="";
     
    if(isset($_POST['KMaxi']))      $KMaxi= $_POST['KMaxi'];
    else      $KMaxi='99999999999999';
     
    if(isset($_POST['KMini']))      $KMini= $_POST['KMini'];
    else      $KMini='0';
     
    if(isset($_POST['PMaxi']))      $PMaxi= $_POST['PMaxi'];
    else      $PMaxi='99999999999999';
     
    if(isset($_POST['PMini']))      $PMini= $_POST['PMini'];
    else      $PMini='0';
     
     $requete=" 
     
    SELECT *
    FROM Eurolinea AS e
     
    WHERE
    (e.Marque LIKE '%$Marque%' AND e.Famille LIKE '%$Famille%' AND e.EnergieLibelle LIKE '%$Energie%' AND e.Annee LIKE '%$Annee%')
    AND
    (e.Kilometrage>='$KMini' AND e.Kilometrage<='$KMaxi') AND (e.PrixNeufTTC>='$PMini' AND e.PrixNeufTTC<='$PMaxi')
     
    ";
    Mais le formulaire ne me renvoi rien, ce qui pose problème c'est mes 2 dernières recherche sur le kilometrage et le prix. quelqu'un pourrait me dire pourquoi ?

    Et si le codage vous semble propre. D'avance merci

  4. #4
    Expert confirmé

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Par défaut
    Bonjour,

    Utilise BETWEEN plutôt non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Where e.Kilometrage BETWEEN '$KMini' AND '$KMaxi'
    AND e.PrixNeufTTC BETWEEN '$PMini' AND '$PMaxi'
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Par défaut
    Citation Envoyé par FirePrawn Voir le message
    Bonjour,

    Utilise BETWEEN plutôt non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Where e.Kilometrage BETWEEN '$KMini' AND '$KMaxi'
    AND e.PrixNeufTTC BETWEEN '$PMini' AND '$PMaxi'
    En fait c'est ce dont je me servais, et j'ai voulu essayer avec ça, mais le problème était le même.

    En fait dans phpMyAdmin quand je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WHERE
    (e.Marque LIKE '%toyota%' AND e.Famille LIKE '%yaris%' AND e.EnergieLibelle LIKE '%%' AND e.Annee LIKE '%%') 
    AND
    (e.Kilometrage>='' AND e.Kilometrage<='99999999') AND (e.PrixNeufTTC>='' AND e.PrixNeufTTC<='159000')
    ça fonctionne mais pas dans mon resultat si il n'y a pas de valeur pour les kilometre et le prix.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    je pense que tu as un souci au niveau du typage des données. Tu considère tous tes champs comme des textes. Est-ce la cas ? Même pour le kilométrage, l'année, le prix ?
    J'ai repris ton code avec des commentaires :
    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
    27
    28
    29
    30
    31
    <?php
     
    $where = array();
     
    if (isset($_POST['Marque'])) {
       $where[] = "e.Marque LIKE '%".mysql_real_escape_string($_POST['Marque'])."%'";
    }
     
    if (isset($_POST['Famille'])) {
       $where[] = "e.Famille LIKE '%".mysql_real_escape_string($_POST['Famille'])."%'";
    }
     
    if (isset($_POST['EnergieLibelle'])) {
       $where[] = "e.EnergieLibelle LIKE '%".mysql_real_escape_string($_POST['EnergieLibelle'])."%'";
    }
     
    if (isset($_POST['Annee'])) {
       $where[] = "e.Annee LIKE '%".mysql_real_escape_string($_POST['Annee'])."%'";
    }
     
    // ici j'ai considéré tes champs comme numérique : entiers 
    $kmaxi = (isset($_POST['KMaxi'])) ? intval($_POST['KMaxi']) : 1000000;
    $kmini = (isset($_POST['KMini'])) ? intval($_POST['KMini']) : 0;
    $pmaxi = (isset($_POST['PMaxi'])) ? intval($_POST['PMaxi']) : 1000000;
    $kmini = (isset($_POST['PMini'])) ? intval($_POST['PMini']) : 0;
     
    $where[] = "e.Kilometrage BETWEEN $kmini AND $kmaxi";
    $where[] = "e.PrixNeufTTC BETWEEN $pmini AND $pmaxi";
     
    $sql = 'SELECT * FROM Eurolinea AS e WHERE ' . implode(' AND ', $where);
    ?>
    A toi de bien vérifer le type des données entre ta base et php

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // ici j'ai considéré tes champs comme numérique : entiers 
    $kmaxi = (isset($_POST['KMaxi'])) ? intval($_POST['KMaxi']) : 1000000;
    $kmini = (isset($_POST['KMini'])) ? intval($_POST['KMini']) : 0;
    $pmaxi = (isset($_POST['PMaxi'])) ? intval($_POST['PMaxi']) : 1000000;
    $kmini = (isset($_POST['PMini'])) ? intval($_POST['PMini']) : 0;
    Bonjour, je comprends bien ce que tu m'as dis, effectivement il y a des valeurs textes et des valeurs numériques dans cette recherche.

    j'ai regarder tout le code, il ne marche pas, mais je n'ai pas compris cette partie, ci dessus. Peux tu m'expliquer le ? et le :

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/02/2015, 11h44
  2. Problème de Select avec LIKE
    Par DeWaRs dans le forum Langage SQL
    Réponses: 15
    Dernier message: 10/05/2012, 09h58
  3. Réponses: 3
    Dernier message: 29/11/2011, 13h46
  4. [AC-2003] Requête :SELECT WHERE TABLE1_champ1 LIKE *TABLE2champ2*
    Par mitinou dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/04/2011, 10h26
  5. Select * Where {}
    Par Thomad dans le forum Langage SQL
    Réponses: 14
    Dernier message: 16/10/2003, 21h27

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