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 :

Liste dynamique multilingue [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut Liste dynamique multilingue
    Bonjour à tous.

    Après avoir terminé un site immobilier avec de moteur de recherche multicritères, je souhaite sur cette base le faire évoluer : le faire en 3 langues.

    Je me suis documenté, jusque-là tout fonctionne (coockies, session) mais j’ai besoin d’un conseil concernant une requête sur une liste déroulante alimentée par la base de données.

    J’aimerai que la requête se fasse sur la colonne estate_type_en si c’est l’anglais qui est sélectionné, etc. Car pour le moment, ce que j’ai fait fonctionne comme dans mon exemple mais je trouve cela assez lourd comme code...

    Je vous remercie d'avance.

    David

    Exemple de la structure type de bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE IF NOT EXISTS `estate_type` (
      `id_estate_type` int(10) unsigned NOT NULL auto_increment,
      `estate_type` varchar(45) NOT NULL,
      ` estate_type_en ` varchar(45) NOT NULL,
      `estate_type_nl` varchar(45) NOT NULL,
      PRIMARY KEY  (`id_estate_type`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=23 ;
    et ma liste déroulante:

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    <select name="country">
        <option value="">-----</option>	  
        <?php
        if ($_GET['lang']=='fr'){
            $sql_fr = "SELECT DISTINCT estate_type.estate_type, id_estate_type FROM estate_type  
                       INNER JOIN estate ON estate_type.id_estate_type=estate.estate_type
                       WHERE visible=1
                       ORDER BY id_estate_type ASC";
            $result = mysql_query($sql_fr);
     
            while($ln_estate_type = mysql_fetch_array($result)){
                if($ln_estate_type['estate_type']==$_REQUEST['estateType']){
                $selected="selected='selected'";
                } else {
                $selected="";
                }
                echo "<option value='".($ln_estate_type['id_estate_type'])."' $selected>".utf8_encode($ln_estate_type['estate_type']). "</option>";
            }
        }
        else if ($_GET['lang']=='en'){
            $sql_en = "SELECT DISTINCT estate_type_en, id_estate_type FROM estate_type  
                       ORDER BY id_estate_type ASC";
            $result = mysql_query($sql_en);
     
            while($ln_estate_type = mysql_fetch_array($result)){
                if($ln_estate_type['estate_type']==$_REQUEST['estateType']){
                $selected="selected='selected'";
                } else {
                $selected="";
                }
                echo "<option value='".($ln_estate_type['id_estate_type'])."' $selected>".utf8_encode($ln_estate_type['estate_type_en']). "</option>";
            }
        }
        else if ($_GET['lang']=='nl'){
            $sql_nl = "SELECT DISTINCT estate_type_nl, id_estate_type FROM estate_type  
                       ORDER BY id_estate_type ASC";
            $result = mysql_query($sql_nl);
     
            while($ln_estate_type = mysql_fetch_array($result)){
                if($ln_estate_type['estate_type']==$_REQUEST['estateType']){
                $selected="selected='selected'";
                } else {
                $selected="";
                }
                echo "<option value='".($ln_estate_type['id_estate_type'])."' $selected>".utf8_encode($ln_estate_type['estate_type_nl']). "</option>";
            }
        }	
        else{                       		
            $sql_fr = "SELECT DISTINCT estate_type.estate_type, id_estate_type FROM estate_type  
                       INNER JOIN estate ON estate_type.id_estate_type=estate.estate_type
                       WHERE visible=1
                       ORDER BY id_estate_type ASC";
            $result = mysql_query($sql_fr);
     
            if(!$result){
                echo "pas de resultats";
            }else{
                while($ln_estate_type = mysql_fetch_array($result)){
                    if($ln_estate_type['estate_type']==$_REQUEST['estateType']){
                    $selected="selected='selected'";
                    } else {
                    $selected="";
                    }
                    echo "<option value='".($ln_estate_type['id_estate_type'])."' $selected>".utf8_encode($ln_estate_type['estate_type']). "</option>";
                }
            }
        }									
        ?>	
    </select>

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Après avoir terminé un site immobilier avec de moteur de recherche multicritères, je souhaite sur cette base le faire évoluer : le faire en 3 langues.
    Humm, c'est le genre de truc qu'il aurait fallut prévoir avant même de commencer quoi que ce soit, car un site multilingue c'est particulier, ça débouche sur une conception parfois très différente.
    Des coups à reprogrammer pleins de truc.

    Au niveau de ta Bdd par exemple, normalement il ne faut pas rajouter autant de champs qu'il y a de langues, mais créer une nouvelle table si nécessaire qui va recevoir tous les contenu linguistiques cela par ligne.

    Exemple :
    (table) langues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    lang_id | code | nom |
    1       | fr   | français
    2       | en   | english
    3       | nl   | jensaisrien
    (table) estate_type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    id_estate_type | lang_id | contenu
    1              | 1       | truc français (1)
    1              | 2       | truuc anglais (1)
    1              | 3       | truuuc néerlandais (1)
    2              | 1       | muche français (2)
    2              | 2       | muuche anglais (2)
    2              | 3       | muuuche néerlandais (2)
    Autre exemple
    (table) articles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    art_id | cree_le | actif
    1     | 2010-07-25| 1
    2     | 2010-07-25| 0
    (table) articles_lang
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    art_id | lang_id | contenu
    1      | 1      | permier_article
    1      | 2      | first_article
    1      | 3      | jensaistoujoursrien
    2      | 1      | deuxième_article
    2      | 2      | second_article
    2      | 3      | maisquiparleleneerlandaisici?
    etc ...
    C'est ainsi que ça devrait être.

    Ensuite, suffit de passer l'ID de la langue en paramètre, vérifier que cette langue existe dans la Bdd, sinon, affecter une langue par défaut.

    Ensuite, il ne devrait plus être utile de ce préaucuper de la langue en faisant une succession de if/elseif, mais juste faire des jointures avec la langue.

    Exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT a.contenu, a.cree_le
    FROM articles a
    INNER JOIN arlicles_lang al ON al.art_id = a.art_id
    WHERE actif = 1
    AND al.lang_id = 2
    ORDER BY article_id ASC
    Ici, seuls les articles Anglais (2) seront récupérés.

  3. #3
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Merci de cette réponse. Je vais regarder cela maintenant.
    Je sais que j'aurais dû prévoir cela dès le départ mais ce n'était pas le but...
    C'est plus par satifaction personnelle que je désire le faire évoluer

    PS: En tant qu Belge, il existe une région appelée la "Flamandie" LOL où de drôles de personnes parlent encore le Néerlandais Donc en tant que langue officielle il serait mal venu de ne pas la mettre sur un site web Multilingue.

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Ok.

    Pense y aussi au charset, je conseil d'opter pour tu UTF-8, que de l'ISO. (avis totalement perso).
    Même si l'UTF-8 est un poil plus compliqué (quoi qu'il existe maintenant pleins de tutos qui expliquent ça bien).

    Dès fois que l'envie te prends de rajouter le Chinois dans 6 mois.
    Il y a des Chinois aussi en Belgique, non ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Pour l'UTF-8 pas de souci j'ai de bonnes sources pour celà. Quant aux langues asiatiques, je mets le Thaï Et ce n'est pas une blague

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    je mets le Thaï Et ce n'est pas une blague
    A ben là, l'UTF-8 s'impose presque.
    Mais j'ai jamais essayé ça dans des langues aussi spécifiques (j'allais dire bizarres, mais ils y en a qui risque de mal le prendre )

    Mais le plus important, c'est la conception de ta Bdd, et là, il y aura des remaniements.
    C'est la base (sans jeu d'mots), sinon -> galère, car ça débouche sur du code Php abracadabrantesque.

  7. #7
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Bon, j'avais déjà fait ceci dans ma base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id_action_type	action_type_fr	action_type_en	action_type_nl
    1	                 Vente	        Sale	                Verkoop
    2	                 Location	        Renting	        Verhuur
    3	               Location vac	Vacation Rentals	Appartementen
    Dans ma page où j'insère mon formulaire de recherche, je crée une session et un cookie. Si pas de langue sélectionnée, c'est le français par défaut.

    Mais je voudrais proposer au visiteur qu'il puisse changer de langue à n'importe quel moment de sa visite.

    Voilà pq je bloque sur cette requête tout en sachant que mes listes déroulantes sont alimentées via la bdd.

    Une petite piste? J'avais pensé à "SUBSTR" mais est ce que je peux faire ceci dans une requête?

    Merci d'avance

  8. #8
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Dans ma page où j'insère mon formulaire de recherche, je crée une session et un cookie. Si pas de langue sélectionnée, c'est le français par défaut.

    Mais je voudrais proposer au visiteur qu'il puisse changer de langue à n'importe quel moment de sa visite.
    Les sessions seraient mieux pour gérer la langue, car ça permettra de la conserver (la langue) tout au long de la navigation.

    Le choix d'une langue vient en 1er du navigateur, il doit avoir une langue de définie, car quand un utilisateur arrivera la 1ère fois sur le site, il n'a pas encore eu la possibilité d'en choisir une manuellement.
    Mais rien empêche de ne pas tenir compte celle du navigateur et en définir une par défaut à la 1ère arrivée.

    Après, faut créer des liens avec en paramètre chaque langue.

    Exemple avec les sessions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // On démarre la gestion des sessions
    session_start();
     
    if (isset($_GET['lang_id']) && !empty($_GET['lang_id'])) {
        $_SESSION['lang_id'] = (int)$_GET['lang_id'];
    }
    elseif (!isset($_SESSION['lang_id'])) {
        // La valeur correspondant à l'ID de la langue par défaut
        $_SESSION['lang_id'] = 1;
    }
    Pour pouvoir conserver la langue tout le long de la navigation, il faudra démarrer la session dans toute les pages.
    Et si on veut que la langue puisse être modifiée quelque soit la page, alors faudra que ce code ci-dessus y soit aussi.

    Ensuite, suffit d'exploiter cet ID de langue dans la session dans toutes les requêtes comportant une langue (une jointure de table si nécessaire).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $requete = 'SELECT a.contenu, a.cree_le
    FROM articles a
    INNER JOIN arlicles_lang al ON al.art_id = a.art_id
    WHERE actif = 1
    AND al.lang_id = '.(int)$_SESSION['lang_id'].'
    ORDER BY article_id ASC';
    Il te faut tout de même remanier cette table "estate_type" (et les autres s'il y en a) pour y rajouter un champ qui définira à quelle langue appartient tel contenu.
    Faire des "substr" relève de la bidouille, malheureusement.

  9. #9
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut Liste dynamique multilingue
    Bonjour à tous,

    Je reviens vers vous car je ne m'en sors pas du tout avec mes requêtes.
    Un exemple concret vaut mieux qu'une longue explication:

    La structure de ma table type de bien avec les traduction en fonction de la langue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    |id_estate_type|estate_type_fr|estate_type_en|estate_type_nl|
    |  1           |    maison    |   house      |     huizen   |
    |  2           |    terrain   |   plot       |   bouwgronden|
    Le code de ma requête initiale avant le choix de traduire le site en différents langues (voir premier post).

    Mon souci c'est que je ne suis pas assez expérimenté pour jongler avec PHP et je ne sais vraiment pas m'y prendre correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql_fr = 
    "SELECT DISTINCT estate_type.estate_type, id_estate_type FROM estate_type  
    INNER JOIN estate ON estate_type.id_estate_type=estate.estate_type
    WHERE visible=1 
    ORDER BY id_estate_type ASC";
    Ma question est la suivante: est ce que c'est jouable avec la structure que j'ai ou alors je dois repartir sur une autre structure? Si tel est le cas, est ce qu'il existe un exemple concret car là je ne sais pas pas quel bout commencer :s

    P.S: mes textes récurrents sont stockés dans des fichiers langues et fonctionne parfaitement et je fonctionne avec une session pour la naviguation de pages en pages.

    Merci d'avance de vos lumières.

    David

  10. #10
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Voilà,

    Après avoir réfléchi, j'ai refait le schéma de ma base de données (en pièce-jointe) et j'ai besoin de votre avis. Est ce que celui-ci tient la route?

    Merci d'avance.
    David
    Images attachées Images attachées  

  11. #11
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    La plupart des tables me semble correctes, mais il faut voir leur usages, et aussi leur impactent.

    Prenons le cas des 3 tables : country, states, city qui elles sont liées en cascades.
    Et bien 3 langues des plus va faire tripler ne nombre de donnée dans la table country.
    Puis autant de fois de states (de lignes) qu'il y aura de country (ce qui va faire monter la sauce).
    Et ensuite auant de fois de city qu'il y aura de state et de country.
    Là, ça va dégommer.
    Faut voir si ton serveur peu encaisser tout ça, le nombre de données, car ça risque d'être énorme.
    Par moment, et sur certaine table faut faire un compromis.


    La table member par exemple, tu l'a liée à la table language.
    Pourquoi pas, mais ça peu très bien ne pas être utile, voir même souhaitable.
    Un utilisateur peu très bien être bilingue, donc souhaiter voir les contenu en changeant de langue.
    Donc définir une langue / utilisateur peut être peu important.

    Je n'est pas vu de liaison entre la langue et la table estate alors qu'il y a un champ es_description.
    Je vois que tu as une table title_estate, faudrait peut être basculer le champ es_description dans cette table (il y a peut être d'autre champ linguistiques à faire de même).


    Je ne vois pas d'autres trucs, mais si tu as des doutes.

  12. #12
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Un grand merci J'ai juste suivi la structure de tes exemples. J'aurais peut-être besoin d'un coup de main pour les requêtes au niveau de la syntaxe.

    Concernant le champ description dans la table estate, je pensais faire une ligne par langue directement dans la table. Qu'en penses tu?

    Je sais que pour mes listes liées ville provinces pays cela va prendre beaucoup de place. Alors je me demande si je me vais pas les laisser dans une langue unique. Mais si ce site est amené à se développer davantage, je devrais traduire ses tables également...

    Merci d'avance

  13. #13
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je reviens sur ces 3 tables : country, states et city.

    Si tu conserve l'ID de l'angue dans la table country, théoriquement les tables states et city ne devraient pas avoir d'ID de langue (id_language) car à juste titre, elles sont liées en cascades.

    On peu faire autrement pour gagner un peu en performances, pour ça, on pourrait les diviser en 2.

    La table country
    (nouvelle table)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id_country | id_language | name_country
    Pour la table states :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id_state | id_country
    (nouvelle table) state_name
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id_state | id_language | name_state
    Même chose pour la table city.

  14. #14
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Oui effectivement, cela me parait judicieux Que penses tu pour les champs de la description?
    Mettre les description_fr, description_nl, description_en dans la table estate?

  15. #15
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Concernant le champ description dans la table estate, je pensais faire une ligne par langue directement dans la table. Qu'en penses tu?
    Non justement, et même surtout pas car il va avoir de la duplication/redondance.
    Tu as juste à déplacer ce champs (et les autre s'il y en a) dans cette table title_estate, elle est taillée pour ça.
    Peut être que c'est son nom qui te dérange, mais à mon avis, il doit avoir autant de titre qu'il y a de description pour 1 estate et cela pour chaque langue.


    Question comme ça, c'est quoi un estate, ça correspond à quoi ?
    J'ai même pas une idée de quel genre d'information qu'il y a dans cette table estate.

  16. #16
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Mettre les description_fr, description_nl, description_en dans la table estate?
    Et non, surtout pas.
    Mais c'est de ma faute, dans les exemples j'ai oublié l'essentielle, l'ID de la langue (id_language)

    Donc je réédite le post et je corrige.

  17. #17
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    J'ai fait comme cela pour la description:


    Pour répondre à ta question, la table estate, c'est la table du bien immobilier en lui même; j'aurais pu l'appeler property

    J'ai encore une dernière question:
    C'est au niveau des champs.

    Le champ 'id_estate_type' est répété 3 fois donc je ne peux pas le mettre en PK ni en AI on est d'accord? Mais c'est tout de même important d'avoir une clé primaire en AI non?

    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
     
    -- -----------------------------------------------------
     
    -- Table `real_estate`.`estate_type`
     
    -- -----------------------------------------------------
     
    CREATE  TABLE IF NOT EXISTS `real_estate`.`estate_type` (
      `id_general` INT NOT NULL AUTO_INCREMENT ,
      `id_estate_type` INT NOT NULL ,
      `et_name_estate` VARCHAR(60) NOT NULL ,
      `et_lang` INT NOT NULL ,
      INDEX `fk_estate_type_language1` (`et_lang` ASC) ,
      PRIMARY KEY (`id_general`) ,
    ENGINE = MyISAM
    DEFAULT CHARACTER SET = utf8;
    Images attachées Images attachées  

  18. #18
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Pour cette table estate_type il faudrait 2 tables (même principe que country, states et city).
    estate_type
    id_general | id_estate_type

    estate_type_lang (ou estate_type_name)
    id_general | id_language | t_name_estate

    Par contre, c'est "id_general" qui est la clé primaire, et non "id_estate_type".
    Du coup, je ne sais pas trop.
    Vu que le nom de cette est "estate_type", la logique voudrait que le nom de la clé soit id_estate_type.


    Le principe des langues est simple en fin de compte.
    Si une table comporte une clé et un contenu linguistique, et pas d'autres champs (pas de type, date, valide, visible, etc ...) alors on peu mettre l'ID de la langue directement.
    Mais à partir du moment ou dans cette table il y a d'autres données non linguistiques (même 1 seul), alors faut diviser la table en 2
    -> table principale (les données bruts)
    -> table langue liée (contenu linguistique)


    Pour le coté partique, je te conseille d'utiliser toujours le même nom que celui de la clé de la table language : id_language
    Et cela pour toutes les tables.
    Mettre des noms différents ça n'apporte rien, sinon de la confusion.
    A savoir qu'il est toujours possible de faire le distingo entre les noms des champs lorsqu'on faire des requêtes sur plusieurs tables ayant des noms identiques (et ce sera le cas ici).

  19. #19
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Je commence à saisir un site multilingue mais c'est pas mal de travail. Cependant si je suis ton exemple, cela va me faire 1 kilomètre de tables non? Par contre en relisant ton exemple sur les tables payes, villes,... je ne comprends pas trop. Je vais essayer de me pencher la dessus

  20. #20
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je commence à saisir un site multilingue mais c'est pas mal de travail. Cependant si je suis ton exemple, cela va me faire 1 kilomètre de tables non?
    Oui, si la majeurs partie de tes tables le réclame.
    Mais ce n'est pas grave, bien au contraire.
    Tu visualise pas bien encore l'intérêt de tout ça, mais en faisant autrement, tu vas perdre toutes les fonctionnalités qu'offres les jointures à ce niveau.
    Pourtant, les jointures sont à la bases de tout, et de la puissance des Bdd.


    Aussi, en regardant cette table estate, à mon avis il y a des truc qui devraient donnés lieu à des tables séparés, il y en a de trop.
    Un bien immobilier n'a pas forcément de piscine, de garage, de véranda, etc, etc, par exemple.

    D'ailleurs, il y a un champ "es_garage" et "es_garage_type", donc si un bien n'a pas de garage, alors il n'y aura pas de type de garage forcément.
    Du coup, ces 2 données sont trop liées pour être ensembles dans cette table.
    Leur valeurs peuvent déboucher sur des incohérences (1 garage mais pas de type ou inversement)

    Normalement, il faudrait une table "estate_garage" et une autre "estate_garage_type", donc rien sur ce point sur la table "estate".
    Ensuite, la table "estate_garage" contiendrait les trios id_state et id_state_garage et id_state_garage_type.
    Ce qui fait que seuls les bien immobilier ayant un garage se trouvera dans la table "estate_garage", avec son type.
    Ici, c'est la présence de la ligne qui défini s'il y a un garage.
    Pas de ligne, pas de garage, donc impossible d'avoir un type de garage.
    Il n'y a plus d'incohérence.


    Mais à coté de ça, il vrai que pour des raisons d'optimisation, on fait ce genre de trucs, mais il faut au moins le savoir, le faire volontairement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Javascript] Question pas difficile sur des listes dynamique...
    Par mulbek dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 10h55
  2. afficher les contenu d'une liste dynamiquement
    Par mzt.insat dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/04/2006, 19h02
  3. [PHP-JS] Liste dynamique
    Par SuperBn dans le forum Langage
    Réponses: 4
    Dernier message: 09/02/2006, 18h09
  4. Réponses: 1
    Dernier message: 16/01/2006, 18h36
  5. Rafraichissement liste dynamique
    Par Petitjean_85 dans le forum ASP
    Réponses: 5
    Dernier message: 14/06/2004, 11h21

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