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 :

différents mots clé en recherche sur table mysql [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut différents mots clé en recherche sur table mysql
    Bonjour à tous,

    J'ai un problème sur lequel je cale, et j'aimerais bien votre avis :

    Je voudrais faire un moteur de recherche pour une association pour chercher des membres. Je voudrais qu'on puisse faire des recherche par code postal, département ou par ville, séparés par des virgules dans le champ de recherche.
    Exemple : lyon, 75, 69008 > sort les membres habitant à Lyon, dans le département 75 ou ayant le code postal 69008.

    Dans ma table, j'ai une colonne pour la ville, une pour le département, et une pour le code postal.

    Est-ce qu'il faut que je regroupe ces 3 informations (ville, dep, cp) dans une seule colonne (que je passerais en index?) et faire les recherches dedans ou bien faut il faire un "explode" des mots-clé et faire une recherche dans les 3 colonnes ???

    Aussi, est-ce que qqun aurait un lien qui présente un script qui ressemblerait à ce que je voudrais faire ?

    Merci infiniment pour votre aide !

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Je dois aussi faire un moteur de recherche donc je ne pense pas t'apporter la meilleure solution étant donné que je coince aussi.

    Cependant ce dont je suis sûr c'est qu'au pire des cas je ferais un SELECT * FROM table WHERE champs LIKE %valeur% OR champs LIKE %valeur%.

    Je ne suis pas sur de l'utilisation de like, regarde sur le tuto SQL mais quoi qu'il en soit, de cette façon tu recherches des infos sur plusieurs champs de plusieurs tables (si nécessaires) : surtout ne modifie pas ton schéma relationnel pour cette raison.

    Après, comme tu le dis, un explode() te permettra de remplir le champs de tables. Bref, lis bien le tuto sur SQL et ensuite fais tes SELECT de recherche depuis phpmyadmin par exemple et quand tu trouves tes infos fais ça bien en php. Sinon tu risques de t'embrouiller en mélangeant php et mysql. C'est mon avis.

    En ce qui me concerne, procédé de la sorte risque d'être très long et sachant que j'ai une 50aines de tables, je ne me vois pas tapper la requête SQL sur chaque formulaire de requête. Je souhaiterai trouver une solution permettant de générer des scripts, formulaires, etc, jenesaispas... Bref qq chose qui prend en entrée (en php) un nom de table et qui me retourne un formulaire de recherche.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    salut, merci de ta réponse, mais ce n'est pas un problème de select (enfin pas pour le moment) . Actuellement, j'ai plutot besoin de savoir si 1) je peux créer une seule colonne qui contiendrait pour chaque membre son code postal, ville et département, et y faire toutes mes recherches dedans, ou 2) si je dois faire une recherche dans ces 3 colonnes, auquel cas, comment spécifier en PHP qu'un nombre de 2 chiffres correspond à un département et qu'il faut chercher dans la colonne Département, qu'un nombre de 5 chiffres est un code postal et un mot est un nom de ville ??

    Merci,

    a+

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    1) je peux créer une seule colonne qui contiendrait pour chaque membre son code postal, ville et département
    Oublie
    2) si je dois faire une recherche dans ces 3 colonnes, auquel cas, comment spécifier en PHP qu'un nombre de 2 chiffres correspond à un département et qu'il faut chercher dans la colonne Département, qu'un nombre de 5 chiffres est un code postal et un mot est un nom de ville ??
    C'est ce que j'essaie de t'expliquer, tu peux créer une seule requête qui recherche tout ça dans ta base de données et tu ne t'embetteras pas à rechercher dans une colonne.

    Déjà tu devrais PAR EXEMPLE avoir une table Ville conteant les champs codepostal/ville/id_departement et et une table Departement departement contenant les champs id_departement/departement. Avec une clé étrangère id_departement dans Ville.

    Après tu t'en fiche de savoir si ton élément appartient ou non à une ville, cp pour ta requête. A la limite dans ton formulaire oui, tu peux vérifier pour être sûr que la personne n'a pas entrée des lettres dans le CP par exemple. Regarde l'expression SQL %like%. Un coup de explode et c'est réglé : t'as qu'a construire ta requête, c'est à dire 5 lignes de codes PHP.

    Maintenant si c'est un TP de cours que tu as et que tu dois impérativement déterminer s'il s'agit d'une ville ou d'un département/cp c'est facile : si tu as des lettres, ce n'est certainement pas un CP ou un département. Si tu as plus de 3 chiffres et que des chiffres, il s'agit d'un CP et enfin, si tu as entre 2 et 3 chiffres c'est un département. Pour tester ça, un moyen pas simple mais efficace sont les expressions régulières.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    merci, en fait j'avais bien compris ce que tu me disais, mais le gros problème qui m'est posé en amont , c'est de découper les mots clé de la recherche pour pouvoir faire ensuite mon Select.

    Je m'explique :

    Si qqun fait un recherche du genre : 75001, 75002, 75008, Suresnes , le résultat devra afficher la liste des membres habitant dans ces 3 départements et dans la ville de Suresnes.
    Pour ménager les ressources du serveur en ligne (il y a tout de même 65.000 membres, il faut que je cible les colonnes à rechercher), je préfère que les codes postaux soit uniquement recherché dans la colonne "Code Postal", idem pour les villes.

    Je pensais donc découper les mots recherchés avec mon explode (ca c'est bon), puis avec les regex identifier les mots qui sont des codes postaux des noms de ville (ca c'est bon aussi). Mon probleme est qu'il faudra ensuite compter ces codes postaux et ville et composer ma requete Select en conséquence et selon donc le nombre de codes postaux ou de villes choisis en recherche.

    Exemple : SELECT id, nom, prenom, etc FROM membres WHERE ville='%ville1%' OR ville='%ville2%' OR code_postal ='%code_postal1% OR code_postal ='%code_postal2% OR code_postal ='%code_postal3%;

    Est-ce que vous avez une idée de comment procéder s'il vous plait ?
    A moins que je fasse fausse route sur la construction en amont de la requête ?

    Merci pour votre aide, c'est vraiment sympa !

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Je ne suis vraiment pas un champion du php ni du SQL mais vu que tu n'as pas beaucoup de réponses je vais tenter de t'apporter une ébauche de solution.

    Si je comprends bien, ça y'est tu as un tableau contenant tes Villes, CP et Départements (que tu as obtenu à coup de explode. Donc maintenant ton problème se situe pour construire ta requête. Si je me trompe, pas la peine de lire le reste .

    Alors, comme ça, ce matin sans avoir fait de yoga et de préparation psychique voilà comment j'aurais procéder.

    1. Une fonction pour déterminer s'il s'agit d'un cp, dépt ou ville qui retourne 1,2,3 suivant le cas. On l'appelle getType($type = "");. A cette fonction tu peux lui passer un élément du tableau contenant [75][lyon]... correspondant à 75, lyon... Par exemple, c'est ici que tu as tes reg.

    2. Trois fonctions : une pour contruire le where des dept, le where des villes et le where des cp. Cette fonction prend un paramètre d'entrée et si par exemple il s'agit d'une ville, tu appelle addWhereVille($where) qui te retourne " OR ville like %$where%";. Dans cette fonction je prends soint de convertir les ville en majuscule/minuscule afin d'avoir la même casse des villes dans la table. Ha, n'oublie pas de mettre un espace avant le ' OR' pour ne pas avoir 'OR machin like %truc%OR bidule...'

    3. j'ai une boucle foreach qui va construire la requête SQL. Alors comme je suis une paresse, je vais initialiser la clause WHERE à $where = "1=1";. Les vrais programmeurs n'aiment pas ça mais ça va juste t'éviter de tester si un where est déjà existant auquel cas tu auras "WHERE 1=1 OR ville like %dsf%" et tu évites d'avoir "WHERE OR ville like..." Bref, c'est vraiment de la paresse.

    du coup, j'aurai un code similaire à ça
    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
    $string = "75, PARIS...";
    $tab = explode(",", $string); 
    $where = "1=1 ";
    foreach($tab as $value)
    {
      $type = $this->getType($value);
      switch($type) {
      case 1 : $where .= $this->addWhereCP($value);break;
      case 2 : $where .= $this->addWhereDept($value);break;
      case 3 : 
      default : $where .= $this->addWhereVille($value);
      }
    }
     
    //-- ca y'est, j'ai mon where, maintenant je construit le select
    $select = "SELECT id, nom, prenom, FROM table1,table2... WHERE $where ORDER...";
     
    //-- reste plus qu'à l'exécuter...
    J'aurai pu avoir une seule fonction addWhere($value, $champs_table) au lieu de 3. L'avantage est que par exemple pour les CP tu peux associer tout ce qui commence par 97 comme un dom-tom. Donc avoir une routine spécifique pour les départements : si ton gars rempli 97, tu as tous les départements d'outre-mer à rechercher.
    Bon ben si ça répond pas à ta question sorry.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Salut whitespirit, vraiment un gros merci à toi pour ton aide, c'est vraiment sympathique de ta part ! Je vais partir de ton code qui correspond bien à ce que je cherchais !

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

Discussions similaires

  1. recherche sur table mysql avec deux index
    Par Invité1 dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/05/2010, 11h41
  2. Erreur 145 sur table mysql
    Par ramses83 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2007, 21h09
  3. [WD11]Recherche sur table
    Par arnaud_verlaine dans le forum WinDev
    Réponses: 1
    Dernier message: 31/01/2007, 13h11
  4. Recherche dans table MYSQL
    Par cerede2000 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 18/01/2007, 13h31

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