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 :

Améliorer une requête SQL d'autocompletion


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut Améliorer une requête SQL d'autocompletion
    Bonjour

    J'essaie d'améliorer un système d'autocompletion (villes) trouvé ici, pour ça je modifie le fichier PHP appelé par JQuery et plus particulièrement la chaine de la requête SQL.

    Mon problème est que rien ne marche, alors je me demande si c'est la bonne méthode...

    Voici la portion initiale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql = "SELECT code_postal, nom_ville FROM villes WHERE code_postal LIKE :q1 OR nom_ville LIKE :q2";
    $condition = array("q1" => $q.'%',  "q2" => $q.'%');
    $sth = $db->prepare($sql);
    $sth->execute($condition);
    //Réception des résultats
    while($data=$sth->fetch(PDO::FETCH_OBJ))
    {
    	//mise en forme du retour pour l'interprétation de JQUERY
            echo $data->code_postal.' '.utf8_encode($data->nom_ville)."|".$data->code_postal.':'.utf8_encode($data->nom_ville)."\n";
    }
    Voici mes tentatives sur la requête (je les mets toutes, bien que je les teste une par une) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "SELECT code_postal, nom_ville FROM villes WHERE code_postal LIKE :q1
    OR
    nom_ville LIKE :q2'%'
    OR
    nom_ville COLLATE Latin1_general_CI_AI LIKE :q2 COLLATE Latin1_general_CI_AI
    OR
    nom_ville LIKE REPLACE(:q2, 'st', 'saint')
    ORDER BY population";
    Et voici ce que je cherche à faire :
    - ligne3 : le but est que l'autocomplete ne sorte que les villes commençant par l'entrée (si j'entre par exemple 'saint' il renvoie 'Saâne Saint Just') > ça marche avec les 'saint' mais l'autocomplete ne renvoie plus aucune entrée à 1 mot
    - ligne5 : rendre le SELECT insensible aux accents > l'autocomplete ne marche plus
    - ligne7 : permettre l'entrée 'st' au lieu de 'saint' > idem
    - ligne8 : dans la table j'ai une colonne 'population' et j'aimerais qu'elle serve à trier les résultat afin qu'il propose les plus grosses villes en tête de liste > marche pour certaines mais pas pour toutes (?)

    Voilà, j'essaie de modifier la requête SQL mais je ne sais pas si j'ai un problème de syntaxe, ni même si c'est la bonne méthode ..

    Merci pour votre aide

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonjour,

    l'opérateur like ne tient pas compte des accents :
    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
     show create table toto;
    +-------+----------------------------------------------------------------------------+
    | Table | Create Table                                                               |
    +-------+----------------------------------------------------------------------------+
    | toto  | CREATE TABLE `toto` (
      `toto` text
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
    +-------+----------------------------------------------------------------------------+
     
     select * from toto where toto like '%e%';
    +--------+
    | toto   |
    +--------+
    | azerty |
    | azérty |
    +--------+
    Quand tu dit :
    - ligne3 : le but est que l'autocomplete ne sorte que les villes commençant par l'entrée (si j'entre par exemple 'saint' il renvoie 'Saâne Saint Just') > ça marche avec les 'saint' mais l'autocomplete ne renvoie plus aucune entrée à 1 mot
    alors si je demande 'saint' la ville 'Saâne Saint Just' ne doit PAS être remonté par la requête ? C'est déjà le cas non ?

    dans ta requête inutile de mettre :
    car c'est dans le paramètre que tu donnera que tu définira le placement du '%' comme dans l'exemple d'ayeur.

    Puis :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_ville LIKE REPLACE(:q2, 'st', 'saint')

    tu remplace les caractère 'st' par 'saint' mais tu ne rajoute pas le caractère '%' donc il faut que le nom de la ville soit exactement équivalent à :q2 avec les caractère 'st' remplacé, je pense que :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_ville LIKE concat(REPLACE(:q2, 'st', 'saint'), '%')

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut
    l'opérateur like ne tient pas compte des accents
    Actuellement si, mais j'ai du mal à comprendre le comportement actuel, exemple :
    'eb' > 57190 Ébange ..
    'éb' > rien
    'saint e' > 43300 Saint Eble ..
    'saint et' > rien
    'saint ét' > 42100 Saint Étienne ..
    Quelque chose d'illogique au niveau des accents ..

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ENGINE=MyISAM DEFAULT CHARSET=latin1
    Il s'agit du paramétrage de la bdd ?

    alors si je demande 'saint' la ville 'Saâne Saint Just' ne doit PAS être remonté par la requête ? C'est déjà le cas non ?
    Justement actuellement elle remonte. Avec mon LIKE :q2'%' elle ne remonte plus, mais les villes à 1mot ne remontent plus non plus...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_ville LIKE concat(REPLACE(:q2, 'st', 'saint'), '%')
    Avec cette ligne ça se rapproche, par contre :
    'st' > 22400 Saint Aaron ..
    'st ' > 85540 Saint Benoist sur Mer ..
    'st a' > rien
    'st b' > 80200 Saint Christ Briost ..
    'st é' > rien
    'st e' > 42136 Saint Just en Bas ..
    Bref impossible d'attraper une ville qui remonte ..

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut
    Je rectifie : le classement par nb d'habitants marche très bien, il fallait ajouter un DESC ..
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY population DESC

    Par contre je ne comprends pas le fonctionnement des accents ..

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    la ligne :
    Citation Envoyé par sql
    ENGINE=MyISAM DEFAULT CHARSET=latin1
    correspond au moteur MySQL utilisé et l'encodage utilisé mais sa n'a aucune incidence sur le comportement de LIKE il me semble.

    Que contiennent les variables q1 et q2 exactement ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut
    Que contiennent les variables q1 et q2 exactement ?
    Le problème est que je ne connais pas le js .. mais q1 correspond à une entrée numérique de l'utilisateur (code postal) dans le champ, et q2 à une chaine (nom de la ville), ils trouvent leur correspondance dans les colonnes code_postal / nom_ville de la table.

    Cette solution vient de cet article (méthode 2) et je la trouve très pratique (on entre indifféremment un CP ou un nom).

    Aucun problème avec q1, mes questions portent seulement sur q2 ..

Discussions similaires

  1. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 13h52
  4. Résultat d'une requète SQL
    Par camino dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/02/2004, 15h22
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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