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 :

gestion multi-langue et tables [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut gestion multi-langue et tables
    Bonjour,

    on m'a proposé un système multi-langue qui utilise json ; il convient pour traduire plusieurs mots par contre je ne vois pas comment l'adapter pour traduire des tables si les données à traduire appartiennent à des tables (MySql).
    Voici le système :
    On a cette fonction
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function getPageLanguage($lang,$pages) {
        $dataPage=[];
        foreach($pages as $p){
            $jsonString=file_get_contents('_lang/'.$lang.'/'.$p.'.json');
            $json=json_decode($jsonString);
            $dataPage[$p]=$json;
        };
        return (object) $dataPage;
    }
    qu retourne un objet dont chaque propriété contient les traductions d'une page (sous forme d'un objet qui lui-même contient toutes les traductions de la page)

    Initialement, les traductions d'une page sont contenues dans un fichier json dont voici un petit exemple :
    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
        "home":"Accueil",
        "var1":"test_fr"
    }

    Donc si la page ne contient que des mots (statiques) à traduire, c'est clair pour moi. Voici comment accéder à l'un d'eux, une fois appelée la fonction ci-dessus : $lang->home->var1 (pour la page nommée "home").
    Là où je ne vois pas comment faire, c'est si on veut afficher des données contenues dans une table. Ce que je suppose, c'est qu'on a une table par langue et que selon la langue demandée par l'utilisateur, on va chercher la bonne table. C'est bien ça ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Laurent,

    comme tu l'as constaté, il y a 2 types de textes.

    1- les textes "statiques"
    Là, en effet, des fichiers json peuvent convenir. (il existe d'autres moyens, mais simplifions...)

    2- les textes "dynamiques" (contenu d'articles,... générés dynamiquement via des formulaires, et enregistrés en BDD)
    Là, c'est au rédacteur/administrateur de rédiger les traductions dans les différentes langues.

    2a- La SOLUTION 1 est d'avoir, dans la table "t_articles", des colonnes différentes pour CHAQUE TRADUCTION :
    • titre_fr
    • titre_en
    • ...
    • contenu_fr
    • contenu_en
    • ...
    • date_creation
    • date_update
    • publier (1/0)

    Puis, en fonction de la langue du site, on affiche les colonnes concernées.

    Un inconvénient est de devoir définir des nouvelles colonnes pour chaque nouvelle langue...
    Mais quand on n'a que 2 ou 3 langues à gérer, ça peut être une solution simple à mettre en oeuvre.


    2b- La SOLUTION 2 (utilisée notamment par Prestashop), est d'avoir une 2ème table "t_articles_lang", pour les colonnes nécessitant des TRADUCTIONS.

    On aura "t_articles" :
    • id_article (index auto-incrémenté)
    • date_creation
    • date_update
    • publier (1/0)
    • ... (BREF : TOUT ce qui NE dépend PAS de la langues)

    On aura "t_articles_lang" :
    • id_article
    • id_lang (il existe une table "ts_lang" *)
    • titre
    • contenu
    • ... (TOUT ce qui dépend de la langues)

    Via une requête avec JOINTURE, on peut donc afficher la ligne/traduction concernée, en fonction de la langue du site

    L'intérêt est de pouvoir définir AUTANT de nouvelles langues qu'on veut, sans changer la structure des tables !


    * Exemple de table "ts_lang" (ici, Prestashop) :
    Code SQL : 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
    --
    -- Structure de la table `ps_lang`
    --
     
    CREATE TABLE `ps_lang` (
      `id_lang` int(11) NOT NULL,
      `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `active` tinyint(1) NOT NULL,
      `iso_code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
      `language_code` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
      `locale` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
      `date_format_lite` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `date_format_full` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `is_rtl` tinyint(1) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Contenu de la table `ps_lang`
    --
     
    INSERT INTO `ps_lang` (`id_lang`, `name`, `active`, `iso_code`, `language_code`, `locale`, `date_format_lite`, `date_format_full`, `is_rtl`) VALUES
    (1, 'Français (French)', 1, 'fr', 'fr', 'fr-FR', 'd/m/Y', 'd/m/Y H:i:s', 0);
    Dernière modification par Invité ; 13/07/2019 à 08h48.

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse Jérôme.
    Je teste la méthode 2-b et en rendrai compte.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    langue au chat ; je vois pas comment faire. Pour simplifier, je prend la table "categories" (car bien sûr il faut aussi traduire les catégories). Le but est donc d'afficher le nom dans la bonne langue.

    Voici le code (j'ai rajouté dans la table une colonne "id_lang", mais je sais pas comment récupérer le nom dans la bonne langue, donc la table a la nouvelle structure mais le code PHP est celui qui fonctionnait avec une seule langue (c'est de la poo, désolé)).

    la table :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE IF NOT EXISTS `categories` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
     
    INSERT INTO `categories` (`id`, `id_lang`, `name`) VALUES
    (1, 0, 'documentaire'),
    (2, 0, 'essai politique'),
    (3, 1, 'documentary'),
    (4, 1, 'political essay');
    COMMIT;

    Code php : 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
    function __construct($id) {
        global $db;
     
        $sql="SELECT * from categories where id=?";
        $reqCategory=$db->prepare($sql);
        $reqCategory=execute([$id]);
        $data=$reqCategory->fetch();
     
        $this->id=$id;
        $this->name=$data['name'];
    }
     
    -----------------
    static function getAllCategories() {
        global $db;
     
        $sql="SELECT * from categories";
        $reqCategory=$db->prepare($sql);
        $reqCategory->execute([]);
        return($reqCategory->FetchAll());
    }
     
    -----------------
    $AllCategories=Categories::getAllCategories();
     
    -----------------
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    <?=$Category['name'] ?>
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Invité
    Invité(e)
    Par défaut
    Laurent,
    tu n'as pas compris le principe...

    A-
    • Il faut DEUX tables "categories" et "categories_lang"
    • + la table "langs"


    1- table "langs" (simplifiée) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE `langs` (
      `id_lang` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `active` tinyint(1) NOT NULL,
      `iso_code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `langs` (`id_lang`, `name`, `active`, `iso_code`) VALUES
    (1, 'Français (French)', 1, 'fr'),
    (2, 'Anglais (English)', 1, 'en');

    2- table "categories" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `categories` (
      `id_categorie` int(11) NOT NULL AUTO_INCREMENT,
     
    -- ICI, on peut/va ajouter toutes les colonnes, qui N'ont PAS de rapport avec la langue (date, publier,....)
     
      PRIMARY KEY (`id_categorie`)
    ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories` (`id`) VALUES
    (1),
    (2);

    3- table "categories_lang" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE TABLE IF NOT EXISTS `categories_lang` (
      `id_categorie` int(11) NOT NULL,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL,
     
    -- ICI, on peut/va ajouter toutes les colonnes, qui ONT un rapport avec la langue -> traductions (contenu, title,....)
     
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories_lang` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay');


    B- ENSUITE, il faut une requête avec JOINTURE, pour récupérer la(les) catégorie(s), avec les bonnes traductions :

    1- SI la langue du site est enregistrée dans une variable $_SESSION['id_lang'], et vaut "1" (fr) ou "2" (en) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "SELECT * FROM categories C
       INNER JOIN categories_lang CL
          ON C.id_categorie = CL.id_categorie
       WHERE CL.id_lang = ?
       AND C.id_categorie = ?
    ";
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $reqCategory = $db->prepare($sql);
        $reqCategory = execute([$_SESSION['id_lang'], $id_categorie]);

    2- SI la langue du site est enregistrée dans une variable $_SESSION['lang'], et vaut "fr" ou "en", il faut AJOUTER LA JOINTURE avec la table langs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "SELECT * FROM categories C
       INNER JOIN categories_lang CL
          ON C.id_categorie = CL.id_categorie
       INNER JOIN langs LG
          ON CL.id_lang = LG.id_lang
       WHERE LG.lang = ?
       AND C.id_categorie = ?
    ";
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $reqCategory = $db->prepare($sql);
        $reqCategory = execute([$_SESSION['lang'], $id_categorie]);
    Dernière modification par Invité ; 13/07/2019 à 08h47.

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    J'en suis qu'au SQL,

    mais
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE IF NOT EXISTS `categories_lang` (
      `id_categorie` int(11) NOT NULL,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id_categorie`)
    ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay');

    donne
    INSERT INTO `categories` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay')



    MySQL a répondu : Documentation
    #1054 - Champ 'id_categorie' inconnu dans field list
    ???
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #7
    Invité
    Invité(e)
    Par défaut
    J'avais fait des copier-coller.... "rapidement".


    1- Supprime PRIMARY KEY (`id_categorie`) pour la table categories_lang.

    2- et c'est INSERT INTO `categories_lang`....


    Fais des efforts pour comprendre.... et corriger toi-même.

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonjour Jérôme,

    comme hier soir, j'y arrivais pas, j'ai décidé de laisser passer la nuit en me disant que je serai plus en forme le matin...mais je n'y arrive toujours pas

    Il y a quand même 2 trucs qui me gênent dans ce que tu me proposes :
    • dans le post #5, tu parles d'une table langs, mais celle-ci n'est jamais utilisée
    • dans ce même post, tu mets dans la requête SQL la clause WHERE C.id_categorie = ? alors que le but est de trouver toutes les catégories ; donc je pense qu'il faut retirer cette clause (d'ailleurs des essais dans phpMyadmin semblent le confirmer)


    Que penses-tu de tout ça ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour Laurent,

    1- Si tu ne vois pas l'utilité d'une table "langs", alors laisse tomber...
    Utilise TA PROPRE façon de gérer les langues.

    2- Quant à la requête... tu fais comme tu veux.
    Je t'ai indiqué un principe. C'est tout


    Je vais te laisser réfléchir encore un peu...

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    J'ai un peu cherché ; j'ai changé ma méthode, mais je suis bloqué.

    Voici mon idée :

    2 tables :
    langs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `langs` (
      `id_lang` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id_lang`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `langs` (`id_lang`, `name`) VALUES
    (1, 'fr'),
    (2, 'en');
    COMMIT;

    categories_lang :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE IF NOT EXISTS `categories_lang` (
      `id_categorie` int(11) NOT NULL,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL
    ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories_lang` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay');
    COMMIT;

    Le code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $sql = "CL.name categories_lang CL
              INNER JOIN Langs L
                 ON CL.id_lang = L.id_lang
              WHERE CL.id_lang=?";   
              $reqCategory=$db->prepare($sql); 
              $reqCategory->execute([$_SESSION['lang']]);
              $AllCategories= $reqCategory->fetchAll(PDO::FETCH_ASSOC);var_dump($AllCategories[0]);exit();

    souci : Le var_dump retourne null et d'ailleurs la requête testée dans phpMyAdmin retourne rien. Qu'est-ce qui va pas ? (la variable de session existe).
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  11. #11
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Tu as oublié "select" et "from" :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sql = "select CL.name from categories_lang CL
              INNER JOIN Langs L
                 ON CL.id_lang = L.id_lang
              WHERE CL.id_lang=?";

  12. #12
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour ta remarque, mais ce n'est qu'une faute de frappe. En réalité, je ne les ai pas oubliés.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "SELECT CL.name FROM categories_lang CL
              INNER JOIN Langs L
                 ON CL.id_lang = L.id_lang
              WHERE CL.name=?";
    mais le problème est réel et avec cette requête-là...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  13. #13
    Invité
    Invité(e)
    Par défaut
    Laurent,

    1- Tu fais n'importe quoi...

    Tu n'as toujours RIEN compris au principe.
    RELIS très attentivement ce que j'ai écrit.


    2- pour la requête... Pffffffffffff...

    Vas prendre l'air.
    Ça te fera du bien.

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je reconnais que j'ai pas du tout compris pourquoi y avait les 2 tables (categories et categories_lang). Peux-tu m'en dire plus ?

    prendre l'air ? Impossible : je suis pour quelques semaines en fauteuil roulant ; pas le droit de marcher et je peux même pas aller tout seul sur la terrasse car y a des rebords...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  15. #15
    Invité
    Invité(e)
    Par défaut
    1- Je t'ai donné un exemple avec "articles".

    Cet exemple explique l'intérêt des 2 tables.



    2- Et tout ce qu'il faut pour "catégories" : structures des tables sql + requête à faire.
    Il suffisait de les reprendre.

    Mais toi, comme d'habitude, tu préfères faire tes "bricolages"...
    C'est fatigant.
    Dernière modification par Invité ; 13/07/2019 à 08h24.

  16. #16
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Désolé de te fatiguer. Tu m'avais dit de réfléchir ; c'est ce que j'ai fait, mais visiblement, pas comme il faut...

    Bon, c'est vrai que je ne comprends pas ta proposition ; mais si je la prends :
    le SQL (avec tes corrections) :
    table categories :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE IF NOT EXISTS `categories` (
      `id_categorie` int(11) NOT NULL
    ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories` (`id_categorie`) VALUES
    (1),
    (2);
    COMMIT;

    table categories_lang :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE IF NOT EXISTS `categories_lang` (
      `id_categorie` int(11) NOT NULL,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories_lang` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay');
    COMMIT;

    code PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $sql = "SELECT * FROM categories C
              INNER JOIN categories_lang CL
                 ON C.id_categorie = CL.id_categorie
              WHERE CL.id_lang = ?";
              $reqCategory = $db->prepare($sql);
              $reqCategory->execute([$_SESSION['lang']]);  
              $AllCategories= $reqCategory->fetchAll(PDO::FETCH_ASSOC);var_dump($AllCategories[0]);exit();
    mais avec ça, le var_dump est null (note que j'ai supprimé dans la requête la clause AND C.id_categorie = ?). Donc y a encore un problème....
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  17. #17
    Invité
    Invité(e)
    Par défaut
    Laurent,

    1- Dans ta gestion de langue, $_SESSION['lang'] contient "fr", ou "en".
    Or, id_lang vaut 1 ou 2 !

    Ce qui explique le résultat nul.

    2- Il te suffit de créer une autre variable $_SESSION['id_lang'], qui contiendra "1", ou "2".

    3- Ou alors, ajouter une jointure avec la table langs.
    Voilà à quoi sert la table langs.
    Dernière modification par Invité ; 13/07/2019 à 12h30.

  18. #18
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je suis content car cette fois, j'ai réfléchi correctement :

    table langs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `langs` (
      `id_lang` int(11) NOT NULL,
      `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `langs` (`id_lang`, `name`) VALUES
    (1, 'fr'),
    (2, 'en');
    COMMIT;

    code PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = "SELECT * FROM categories C
              INNER JOIN categories_lang CL
                 ON C.id_categorie = CL.id_categorie
              INNER JOIN langs LG
                ON CL.id_lang = LG.id_lang
              WHERE LG.name = ?";
               $reqCategory = $db->prepare($sql);
               $reqCategory->execute([$_SESSION['lang']]);  
              $AllCategories= $reqCategory->fetchAll(PDO::FETCH_ASSOC);print_r($AllCategories[0]);exit();
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  19. #19
    Invité
    Invité(e)
    Par défaut


    [EDIT] J'ai ajouté des explications dans mes messages précédents :

    Je t'invite à les RELIRE attentivement.
    Dernière modification par Invité ; 13/07/2019 à 08h54.

  20. #20
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    jreaux62

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

Discussions similaires

  1. MySQL gestion & multi-tables
    Par Belenos dans le forum MySQL
    Réponses: 2
    Dernier message: 06/07/2009, 13h50
  2. gestion de langue dans les tables
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/10/2007, 15h45
  3. Réponses: 5
    Dernier message: 22/04/2007, 01h11
  4. [PHP 5] Gestion multi langues
    Par lenoil dans le forum Langage
    Réponses: 4
    Dernier message: 29/03/2007, 16h55
  5. Gestion multi-langues et JMenuItem
    Par TheReturnOfMuton dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 19/06/2006, 15h08

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