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. #21
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    @ Toufik83 : faut dormir la nuit

    @ jreaux62 : j'ai crié victoire hier ; il y a certes du mieux, mais je ne récupère pas encore le nom des catégories. J'ai bien relu tes explications supplémentaires. Notamment, ta requête est un peu différente de la mienne. Le print_r du fetch de la mienne donne :
    Array ( [id_categorie] => 1 [id_lang] => 1 [name] => fr )
    Donc j'ai pas l'information souhaitée. La tienne, je ne peux pas l'utiliser simplement car $id_categorie n'existe pas. Certes je peux interroger la bdd pour les récupérer (de la table categories_lang), mais est-ce la bonne méthode ?

  2. #22
    Invité
    Invité(e)
    Par défaut
    1- J'hésite entre :
    • être désespéré
    • ou être inquiet pour toi...

    Si tu ne sais même plus faire la différence entre "sélectionner TOUTES les catégories" et "sélectionner LA catégorie dont l'id est..."...

    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $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);
     
    echo($_SESSION['lang']);
    var_dump($AllCategories);
    exit();
    Ça donne quoi ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fr
     
    C:\wamp64\www\mvc_udemy\views\home_view.php:28:
    array (size=2)
      0 => 
        array (size=3)
          'id_categorie' => int 1
          'id_lang' => int 1
          'name' => string 'fr' (length=2)
      1 => 
        array (size=3)
          'id_categorie' => int 2
          'id_lang' => int 1
          'name' => string 'fr' (length=2)

  4. #24
    Invité
    Invité(e)
    Par défaut
    OK.

    C'est normal, puisque tu as des colonnes qui ont le même nom ("name"), dans plusieurs tables.
    "name" est donc ambigu dans la requête.


    1- Il faut dont les différencier au niveau de la requête, et, tant qu'à faire, NE sélectionner QUE les colonnes nécessaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT C.id_categorie, CL.name
    	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 = ?";
    A ta place, je remplacerais "name" par "lg_name" dans la table langs.
    Ça évitera cette confusion.


    2- OU ALORS, tu suis MON CONSEIL, et tu crées une variable $_SESSION['id_lang'] :
    La requête devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = "SELECT C.id_categorie, CL.name
    	FROM categories C
    	INNER JOIN categories_lang CL
    	   ON C.id_categorie = CL.id_categorie
    	WHERE CL.id_lang = ?";
    Mais bon.....
    Je ne voudrais pas que tu te fasses des nœuds au cerveau...

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Merci de te préoccuper de mon cerveau et de me proposer la solution. J'avais bien compris que c'était cette requête-là qu'il fallait faire (cf la requête que je donnais au post #18) mais j'avais déjà rencontré l'ambiguïté des 2 "name", mais pas pensé à en renommer un des 2.
    Sinon, je ne comprends pas l'utilité de la colonne C.id_categorie car avec la requête
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT CL.name 
            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.lg_name = ?";
    j'obtiens l'information recherchée.

    Autre point que je n'ai pas compris : ce que retourne les requêtes avec jointure. Si je cherche des renseignements avec Google, je trouve N fois comment faire ce type de requêtes mais jamais ce qu'elles retournent.

    Prenons un exemple de requête :
    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
            INNER JOIN langs LG
              ON CL.id_lang = LG.id_lang
            WHERE LG.lg_name = ?";
    Le from de la requête porte sur la table categories qui comporte une seule colonne mais le fetchAll de la requête retourne un tableau qui en contient 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    array (size=2)
      0 => 
        array (size=4)
          'id_categorie' => int 1
          'id_lang' => int 1
          'name' => string 'documentaire' (length=12)
          'lg_name' => string 'fr' (length=2)
      1 => 
        array (size=4)
          'id_categorie' => int 2
          'id_lang' => int 1
          'name' => string 'essai politique' (length=15)
          'lg_name' => string 'fr' (length=2)
    Ca semble être le mix des 3 tables categories, categories_lang et langs. C'est bien ça ?

  6. #26
    Invité
    Invité(e)
    Par défaut
    1- Oui.

    • SQL INNER JOIN



    2- Pour que tu comprennes (??) l'intérêt de la table "categories" :

    • Ajoute une colonne "publier" TINYINT(2) à la table "categories"

    • Si "publier" vaut 1 : la catégorie sera publiée ("affichée")
    • Si "publier" vaut 0 : la catégorie NE sera PAS publiée ("pas affichée")


    Exercice : ECRIS la requête "sélectionner toutes les catégories publiées"

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    merci pour le lien qui a rejoint mes favoris (je crois que je l'avais déjà vu, mais lu trop vite).

    Pour l'exercice, y a sûrement plus simple, mais voilà :

    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
    $sql = "SELECT CL.name  
          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.lg_name = ? AND C.publier=1";
          $reqCategory = $db->prepare($sql);
          $reqCategory->execute([$_SESSION['lang']]);  
          $AllCategories = $reqCategory->fetchAll(PDO::FETCH_ASSOC);
          $nb_lignes=sizeof($AllCategories);
          $cat=[];$i=0;
          for ($j=0;$j<$nb_lignes;$j++)
            $cat[$i++]=$AllCategories[$j]['name'];
     
        foreach ($cat as $Category=>$index) 
            echo $index."<br/>";
          ?>

  8. #28
    Invité
    Invité(e)
    Par défaut
    Je suis épaté par ta capacité à... TOUJOURS, SYSTÉMATIQUEMENT, TOUT COMPLIQUER...

    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql = "SELECT CL.name  
          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.lg_name = ? AND C.publier=1";
          $reqCategory = $db->prepare($sql);
          $reqCategory->execute([$_SESSION['lang']]);  
          $AllCategories = $reqCategory->fetchAll(PDO::FETCH_ASSOC);
    Ça, C'est OK !!

    2- Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          $nb_lignes=sizeof($AllCategories);
          $cat=[];$i=0;
          for ($j=0;$j<$nb_lignes;$j++)
            $cat[$i++]=$AllCategories[$j]['name'];
     
        foreach ($cat as $Category=>$index) 
            echo $index."<br/>";
          ?>
    C'est N'IMPORTE QUOI.

    $AllCategories est DÉJÀ un array, contenant toutes les données nécessaires !!!
    DONC, pour afficher les lignes, il suffit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
        foreach ($AllCategories as $data) 
        {
            echo $data['name']."<br/>";
        }
    ?>
    ET C'EST TOUT !

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    C'était simplement la confirmation de mes lacunes en PHP ; je croyais que cette écriture (foreach ($cat as $Category=>$index)) pour foreach était la seule...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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