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 :

Concept d'un script pour chercher des villes ou des régions (A la Google Map) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Concept d'un script pour chercher des villes ou des régions (A la Google Map)
    Bonjour,

    pour les besoin d'un site je suis en train de réaliser un script AJAX qui fait la même chose ou presque que qu'on vous chercher une région ou une ville sur google map.

    Coté base de donné j'ai crée trois table

    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
    -- `location_country`
     
    CREATE TABLE `location_country` (
      `country_id` smallint(3) unsigned NOT NULL AUTO_INCREMENT,
      `country_en_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `country_local_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`country_id`),
      UNIQUE KEY `country_en_name` (`country_en_name`,`country_local_name`)
    )
     
    -- `location_region`
     
    CREATE TABLE `location_region` (
      `region_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `region_country_id` smallint(3) unsigned NOT NULL,
      `region_post_code` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `region_common_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `region_local_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`region_id`),
      KEY `region_country_id` (`region_country_id`,`region_common_name`,`region_local_name`),
      KEY `region_post_code` (`region_post_code`)
    )
     
    -- `location_location`
     
    CREATE TABLE `location_location` (
      `location_id` bigint(13) unsigned NOT NULL AUTO_INCREMENT,
      `location_country_id` smallint(3) unsigned NOT NULL,
      `location_region_id` int(10) unsigned NOT NULL,
      `location_post_code` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `location_en_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `location_local_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`location_id`),
      KEY `location_country_id` (`location_country_id`,`location_region_id`,`location_en_name`,`location_local_name`),
      KEY `location_post_code` (`location_post_code`)
    )
    coté PHP, j'ai du faire trois requêtes une requête pour chaque table, en gros je fait une recherche dans la premier table si rien n'est trouvé je cherche dans la deuxième table si rien ne correspond je passe a la troisième table
    voila les trois requête

    je commence par la table `location_location`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query('SELECT * FROM location_location,location_region,location_country WHERE (	(location_post_code LIKE \'%' . $location . '%\'  || location_common_name 	LIKE	\'%' . $location . '%\' || location_local_name LIKE \'%' . $location . '%\') && (location_region_id = region_id && region_country_id = country_id ))') or die (mysql_error());
    puis la deuxième `location_region`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query('SELECT * FROM location_region,location_country WHERE ((region_post_code LIKE \'%' . $location . '%\' || region_common_name LIKE	\'%' . $location . '%\' || region_local_name 	LIKE 	\'%' . $location . '%\') && (region_country_id = country_id))') or die (mysql_error());
    et la troisième table `location_country`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query('SELECT * FROM location_country WHERE country_en_name 	LIKE  	\'%' . $location . '%\' || country_local_name 	LIKE	\'%' . $location . '%\'') or die (mysql_error());
    ça marche très bien, sauf que je trouve que c'est un peu lourd "trois requête mysql" sur tous que le script est appelé via AJAX a chaque que l'utilisateur tape ou supprime une lettre sur le champ de recherche.

    voila je suis presque sur qu'il moyen de résumer c'est trois requête en une seul. en sachant qu'elle doit retourné

    1_ le pays et la région et la localisation si la correspondance est trouvé dans la table `location_location`
    2_le pays et la région si la correspondance est trouvé dans la table `location_region`
    3_ et puis seulement le pays si la correspondance est trouvé dans la table `location_country`

    de mon coté j'ai tous essayé (joint, union, in ...) je n'est eu que des 'mysql_error' comme résulta.

    si non si je doit revoir la structure de ma base de donné ou je m'y prend mal, je suis ouvert a toutes propositions.

    voila je m'en remet a vos main d'experts, et merci pour votre aide.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sql = "SELECT * FROM
       location_country
       LEFT JOIN location_region ON region_country_id = country_id
       LEFT JOIN location_location location_region_id = region_id
    WHERE 
       location_post_code LIKE '%$location%' 
    || location_common_name LIKE '%$location%'
    || location_local_name LIKE '%$location%'
    || region_post_code LIKE '%$location%'
    || region_common_name LIKE '%$location%'
    || region_local_name LIKE '%$location%'
    || country_en_name LIKE  '%$location%'
    || country_local_name LIKE '%$location%'";
    En écrivant ça je me demande si on peut faire une recherche FULLTEXT sur des jointures.

    Au passage n'hésite pas a bien présenter tes requêtes dans ton code.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ça marche très bien, je doit avoué que c'est impressionnent comme requête, sur tous que je m'attendais pas trop a avoir une réponse.

    enfin Merci boucau pour votre aide, on vois tous de suite qu'on a affaire a des pros.

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Si je peu me permettre de vous dérangé une dernier fois, je souhaite ajouter une derniers table a cette requête.

    La table 'location_unknown', je l'est mis pour pouvoir ajouter des adresse inclassable ou a classé plus tard, le problème avec cette table c'est qu'elle n'a aucune relation avec les autres table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE `location_unknown` (
      `unknown_id` int(9) unsigned NOT NULL AUTO_INCREMENT,
      `unknown_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`unknown_id`),
      UNIQUE KEY `unknown_name` (`unknown_name`)
    )
    J'ai essayé de bidouiller un peu votre requête, mais sans résulta concret, alors j'ai du faire en sorte que si la première requête renvois moins de 6 résulta, je passe la deuxième requête qui fait une recherche full text dans cette dernière table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sql = "SELECT * FROM 
         location_unknown 
         WHERE 
         unknown_name LIKE '%$location%'"
    Mais ce qui serai mieux, c'est de tous mettre en une seul requête, et la encore je m'en remet a vous

    Merci.

  5. #5
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Bien que je soies contre l'utilisation du sélecteur générique sur le principe, la requête de sabotage est très bien et tu n'auras pas mieux. Concernant ta nouvelle requête, comme tu l'as si bien fait remarquer elle n'a aucune relation avec les autres... et on ne peut relier une table avec d'autres si elles n'ont aucun point commun. Donc tu devras te contenter de deux requêtes...ou changer la structure de ta table.

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci "tse_jc" pour ta réponse au moins je suis fixé, et puis j'ai pas a me plaindre je suis passé de 3 voir 4 requêtes a 2.

    Il me reste plus qu'a ajouter un bon système de cache, pour compléter le script et enfin passé a autre chose.

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

Discussions similaires

  1. Base de données des pays et des villes
    Par sphinx007 dans le forum Autres
    Réponses: 7
    Dernier message: 11/05/2020, 13h49
  2. Réponses: 3
    Dernier message: 10/02/2012, 11h40
  3. Quel langage pour une application qui gère des contrats et des factures ?
    Par pigpen dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 12/02/2007, 19h06
  4. Script pour Modifier les metadonnées dans des TIFF
    Par Airmoi dans le forum Windows
    Réponses: 2
    Dernier message: 04/11/2006, 14h12
  5. [Java] Script pour formatter un textarea avec des icones
    Par odoobe dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/09/2006, 09h30

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