PHP / MySql et les tables
Utilisateur anonyme
-
PhP Messages postés 1774 Statut Membre -
PhP Messages postés 1774 Statut Membre -
Bonjour,
Je commence le php (depuis le temps que je le dis, je vais bientot y arriver) :))
Je voudrais faire un site en Anglais, Français et Espagnol et pouvoir ajouter de nouvelle langue plus tard.
Je ne sais pas si je dois creer un champ dans ma table qui indique la langue ou si je dois creer autant de table que de langue ??
P.S.: je tiens absoluement a traduire moi-même mes pages (sans utiliser les traducteurs automatiques).
Merci d'avances pour vos avis et conseils :))
ZIG1
Je commence le php (depuis le temps que je le dis, je vais bientot y arriver) :))
Je voudrais faire un site en Anglais, Français et Espagnol et pouvoir ajouter de nouvelle langue plus tard.
Je ne sais pas si je dois creer un champ dans ma table qui indique la langue ou si je dois creer autant de table que de langue ??
P.S.: je tiens absoluement a traduire moi-même mes pages (sans utiliser les traducteurs automatiques).
Merci d'avances pour vos avis et conseils :))
ZIG1
A voir également:
- PHP / MySql et les tables
- Tables des matières word - Guide
- Easy php - Télécharger - Divers Web & Internet
- Mysql community server - Télécharger - Bases de données
- Expert php pinterest - Télécharger - Langages
- Mysql error 2002 ✓ - Forum Linux / Unix
5 réponses
c'est un peu complexe
il faudrait etudier le pb sur le papier
un option un table de pointage qui definit la langue et la page et qui pointe sur une autre table pour affichier la bonne page avec ses traductions
un peu complexe a mettre en oeuvre
ca te permettra d'avoir des pages dynamiques
salut
il faudrait etudier le pb sur le papier
un option un table de pointage qui definit la langue et la page et qui pointe sur une autre table pour affichier la bonne page avec ses traductions
un peu complexe a mettre en oeuvre
ca te permettra d'avoir des pages dynamiques
salut
Bien entendu, les deux choix sont possibles et discutables... Pour ma part, et par simplicité et clarté, j'opterais pour faire une table par langue. Ceci sera avantageux si tu n'as pas besoin de faire sans cesse des relations entre les langues. Sinon tu pourras toujours faire des jointures...
-= Bobinours =-
-= Bobinours =-
j'ai 19 table, si je fais une table par langue, j'obtiendrais 19*nb table.
je n'ai strictement aucune idée de la faisabilité ou des moyen a mettre en oeuvre ...
au mieux vaux PHP3 ou PHP4 ??
je n'ai strictement aucune idée de la faisabilité ou des moyen a mettre en oeuvre ...
au mieux vaux PHP3 ou PHP4 ??
Dans ce cas, je ferais carrement 1 base de données par Pays :
FR:
- table 1
- table 2
...
- table 19
UK:
- table 1
- table 2
...
- table 19
...
PHP4 est mieux que PHP3, plus rapide et de nouvelles fonctionnalités ont été ajoutées (comme les sessions). Mais pour ton cas je ne sais pas si ça a une importance...
-= Bobinours =-
-= Bobinours =-
FR:
- table 1
- table 2
...
- table 19
UK:
- table 1
- table 2
...
- table 19
...
PHP4 est mieux que PHP3, plus rapide et de nouvelles fonctionnalités ont été ajoutées (comme les sessions). Mais pour ton cas je ne sais pas si ça a une importance...
-= Bobinours =-
-= Bobinours =-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut ZIG1
Pour ce qui est des tables PHP n'intervient pas : alors PHP3 ou PHP4 c'est juste une question de provider. Renseigne toi auprès de
lui pour savoir quelle version il supporte.
Quant aux différences entres les 2 versions ... aucune idée mais je suppose que pour les
cdes liées à MySql il n'y a rien de bien nouveau.
Par contre le module MySql livré avec la version PHP4 est peu être plus évolué.
Pour la structure même de ta base c'est à toi de bien penser la chose...
Chaque élément à traduire ne doit figurer que sous la forme d'une clé (ID_LANGUE pa ex) et ce dans tous les champs de ttes tes tables que tu en ais 1 ou 19 peu importe. Du moins c'est comme çà
que je procéderais.
Voici un ex : la gestion d'un petit menu FRANCAIS ou ANGLAIS
Tu noteras que le table MENU ne comporte aucun libellé "en clair" !
Juste une clé vers la ou les tables des langues.
1) Cas avec une seule table pour toutes les langues
Table : MENU
+-----------------+
|ID_MENU|ID_LANGUE|
+-------+---------+
| 0001 | 00001 |
| 0001 | 00003 |
| 0001 | 00005 |
| 0001 | 00002 |
| 0001 | 00004 |
+-----------------+
Table : LANGUE
+---------------------------------+
|ID_LANGUE|TXT_GB |TXT_FR |
+---------+-----------+-----------+
| 00001 |OPEN |OUVRIR |
| 00002 |CLOSE |FERMER |
| 00003 |SEARCH |RECHERCHER |
| 00004 |QUIT |QUITTER |
| 00005 |FILE |FICHIER |
+---------------------------------+
SQL pour menu en FRANCAIS :
select MENU.*, LANGUE.TXT_FR as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OUVRIR |
| 0001 | 00003 |RECHERCHER|
| 0001 | 00005 |FICHIER |
| 0001 | 00002 |FERMER |
| 0001 | 00004 |QUITTER |
+----------------------------+
SQL pour menu en ANGLAIS :
select MENU.*, LANGUE.TXT_GB as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OPEN |
| 0001 | 00003 |SEARCH |
| 0001 | 00005 |FILE |
| 0001 | 00002 |CLOSE |
| 0001 | 00004 |QUIT |
+----------------------------+
L'utilisation de l'alias 'LIBELLE' pour le texte au lieu du nom du champ te permet
de toujours faire référence dans ton code PHP à la même variable LIBELLE et ce qlque soit
la langue.
Tu noteras que les 2 tables résultantes des jointures ont bien la même structure !
En plus si tu donnes un nom bien précis au champ de chaque langue comme ici "TXT_"+Code_pays
alors tu peux n'avoir qu'une seule requête grâce à PHP
Ex de code PHP :
$code_pays="FR";
$sql="select MENU.*, LANGUE.TXT_".$code_pays." as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE";
etc ...
1-1) Variante du cas 1 : une seule table des langues :
Table : LANGUE
+-----------------------------+
|ID_LANGUE|ID_PAYS|TXT |
+---------+-------+-----------+
| 00001 | FR |OUVRIR |
| 00002 | FR |FERMER |
| 00003 | FR |RECHERCHER |
| 00004 | FR |QUITTER |
| 00005 | FR |FICHIER |
| 00001 | GB |OPEN |
| 00002 | GB |CLOSE |
| 00003 | GB |SEARCH |
| 00004 | GB |QUIT |
| 00005 | GB |FILE |
+-----------------------------+
ou encore ...
Table : LANGUE
+----------------------+
|ID_LANGUE |TXT |
+----------+-----------+
| 00001FR |OUVRIR |
| 00002FR |FERMER |
| 00003FR |RECHERCHER |
| 00004FR |QUITTER |
| 00005FR |FICHIER |
| 00001GB |OPEN |
| 00002GB |CLOSE |
| 00003GB |SEARCH |
| 00004GB |QUIT |
| 00005GB |FILE |
+----------------------+
Mais dans ce cas un nbr de ligne est plus important est testé lors des jointures.
2) Cas avec une table par langue :
Table : MENU
+-----------------+
|ID_MENU|ID_LANGUE|
+-------+---------+
| 0001 | 00001 |
| 0001 | 00003 |
| 0001 | 00005 |
| 0001 | 00002 |
| 0001 | 00004 |
+-----------------+
Table : LANGUE_GB
+---------------------+
|ID_LANGUE|TXT |
+---------+-----------+
| 00001 |OPEN |
| 00001 |CLOSE |
| 00001 |SEARCH |
| 00001 |QUIT |
| 00001 |FILE |
+---------------------+
Table : LANGUE_FR
+---------------------+
|ID_LANGUE|TXT |
+---------+-----------+
| 00001 |OUVRIR |
| 00001 |FERMER |
| 00001 |RECHERCHER |
| 00001 |QUITTER |
| 00001 |FICHIER |
+---------------------+
SQL pour menu en FRANCAIS :
select MENU.*, LANGUE_FR.TXT as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE_FR.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OUVRIR |
| 0001 | 00003 |RECHERCHER|
| 0001 | 00005 |FICHIER |
| 0001 | 00002 |FERMER |
| 0001 | 00004 |QUITTER |
+----------------------------+
SQL pour menu en ANGLAIS :
select MENU.*, LANGUE_GB.TXT as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OPEN |
| 0001 | 00003 |SEARCH |
| 0001 | 00005 |FILE |
| 0001 | 00002 |CLOSE |
| 0001 | 00004 |QUIT |
+----------------------------+
Ex de code PHP générique :
$code_pays="FR";
$sql="select MENU.*, LANGUE_".$code_pays.".TXT as LIBELLE
from MENU inner join LANGUE_".$code_pays." on MENU.ID_LANGUE=LANGUE_".$code_pays.".ID_LANGUE";
Dans un cas c'est le nom du champ qui est variable, dans l'autre le nom de la table.
Cas n° 1 : une table des langues
Avantages :
- on ne met à jour qu'un seul enregistrement pour toutes les langues.
- on peut comparer facilement les traductions (de moins tq le texte à traduire est court !)
dans toutes les langues en utilisant simplement PhpMyAdmin
- pas de risque d'oublier une langue : au pire le champ est à blanc
- 1 seule table à gérer
- le code PHP est un peu plus simple
Inconvenients :
- la taille de la table peut augmenter très vite
Cas n°2 : une table par langue
Avantages :
- peut-être une meilleur visibilité
- tables "réduites"
Inconvénients :
- il faut penser à mettre à jour chaque table en même temps.
- il faut que les clés (ici ID_LANGUE) coïncident entres les tables.
Personnellement je pencherais volontier pour le cas n°1 du début. :)
@+
Philippe
PS : fait un copier-coller du msg dans notepad pour avoir un alignement correct
Pour ce qui est des tables PHP n'intervient pas : alors PHP3 ou PHP4 c'est juste une question de provider. Renseigne toi auprès de
lui pour savoir quelle version il supporte.
Quant aux différences entres les 2 versions ... aucune idée mais je suppose que pour les
cdes liées à MySql il n'y a rien de bien nouveau.
Par contre le module MySql livré avec la version PHP4 est peu être plus évolué.
Pour la structure même de ta base c'est à toi de bien penser la chose...
Chaque élément à traduire ne doit figurer que sous la forme d'une clé (ID_LANGUE pa ex) et ce dans tous les champs de ttes tes tables que tu en ais 1 ou 19 peu importe. Du moins c'est comme çà
que je procéderais.
Voici un ex : la gestion d'un petit menu FRANCAIS ou ANGLAIS
Tu noteras que le table MENU ne comporte aucun libellé "en clair" !
Juste une clé vers la ou les tables des langues.
1) Cas avec une seule table pour toutes les langues
Table : MENU
+-----------------+
|ID_MENU|ID_LANGUE|
+-------+---------+
| 0001 | 00001 |
| 0001 | 00003 |
| 0001 | 00005 |
| 0001 | 00002 |
| 0001 | 00004 |
+-----------------+
Table : LANGUE
+---------------------------------+
|ID_LANGUE|TXT_GB |TXT_FR |
+---------+-----------+-----------+
| 00001 |OPEN |OUVRIR |
| 00002 |CLOSE |FERMER |
| 00003 |SEARCH |RECHERCHER |
| 00004 |QUIT |QUITTER |
| 00005 |FILE |FICHIER |
+---------------------------------+
SQL pour menu en FRANCAIS :
select MENU.*, LANGUE.TXT_FR as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OUVRIR |
| 0001 | 00003 |RECHERCHER|
| 0001 | 00005 |FICHIER |
| 0001 | 00002 |FERMER |
| 0001 | 00004 |QUITTER |
+----------------------------+
SQL pour menu en ANGLAIS :
select MENU.*, LANGUE.TXT_GB as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OPEN |
| 0001 | 00003 |SEARCH |
| 0001 | 00005 |FILE |
| 0001 | 00002 |CLOSE |
| 0001 | 00004 |QUIT |
+----------------------------+
L'utilisation de l'alias 'LIBELLE' pour le texte au lieu du nom du champ te permet
de toujours faire référence dans ton code PHP à la même variable LIBELLE et ce qlque soit
la langue.
Tu noteras que les 2 tables résultantes des jointures ont bien la même structure !
En plus si tu donnes un nom bien précis au champ de chaque langue comme ici "TXT_"+Code_pays
alors tu peux n'avoir qu'une seule requête grâce à PHP
Ex de code PHP :
$code_pays="FR";
$sql="select MENU.*, LANGUE.TXT_".$code_pays." as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE";
etc ...
1-1) Variante du cas 1 : une seule table des langues :
Table : LANGUE
+-----------------------------+
|ID_LANGUE|ID_PAYS|TXT |
+---------+-------+-----------+
| 00001 | FR |OUVRIR |
| 00002 | FR |FERMER |
| 00003 | FR |RECHERCHER |
| 00004 | FR |QUITTER |
| 00005 | FR |FICHIER |
| 00001 | GB |OPEN |
| 00002 | GB |CLOSE |
| 00003 | GB |SEARCH |
| 00004 | GB |QUIT |
| 00005 | GB |FILE |
+-----------------------------+
ou encore ...
Table : LANGUE
+----------------------+
|ID_LANGUE |TXT |
+----------+-----------+
| 00001FR |OUVRIR |
| 00002FR |FERMER |
| 00003FR |RECHERCHER |
| 00004FR |QUITTER |
| 00005FR |FICHIER |
| 00001GB |OPEN |
| 00002GB |CLOSE |
| 00003GB |SEARCH |
| 00004GB |QUIT |
| 00005GB |FILE |
+----------------------+
Mais dans ce cas un nbr de ligne est plus important est testé lors des jointures.
2) Cas avec une table par langue :
Table : MENU
+-----------------+
|ID_MENU|ID_LANGUE|
+-------+---------+
| 0001 | 00001 |
| 0001 | 00003 |
| 0001 | 00005 |
| 0001 | 00002 |
| 0001 | 00004 |
+-----------------+
Table : LANGUE_GB
+---------------------+
|ID_LANGUE|TXT |
+---------+-----------+
| 00001 |OPEN |
| 00001 |CLOSE |
| 00001 |SEARCH |
| 00001 |QUIT |
| 00001 |FILE |
+---------------------+
Table : LANGUE_FR
+---------------------+
|ID_LANGUE|TXT |
+---------+-----------+
| 00001 |OUVRIR |
| 00001 |FERMER |
| 00001 |RECHERCHER |
| 00001 |QUITTER |
| 00001 |FICHIER |
+---------------------+
SQL pour menu en FRANCAIS :
select MENU.*, LANGUE_FR.TXT as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE_FR.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OUVRIR |
| 0001 | 00003 |RECHERCHER|
| 0001 | 00005 |FICHIER |
| 0001 | 00002 |FERMER |
| 0001 | 00004 |QUITTER |
+----------------------------+
SQL pour menu en ANGLAIS :
select MENU.*, LANGUE_GB.TXT as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE
Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OPEN |
| 0001 | 00003 |SEARCH |
| 0001 | 00005 |FILE |
| 0001 | 00002 |CLOSE |
| 0001 | 00004 |QUIT |
+----------------------------+
Ex de code PHP générique :
$code_pays="FR";
$sql="select MENU.*, LANGUE_".$code_pays.".TXT as LIBELLE
from MENU inner join LANGUE_".$code_pays." on MENU.ID_LANGUE=LANGUE_".$code_pays.".ID_LANGUE";
Dans un cas c'est le nom du champ qui est variable, dans l'autre le nom de la table.
Cas n° 1 : une table des langues
Avantages :
- on ne met à jour qu'un seul enregistrement pour toutes les langues.
- on peut comparer facilement les traductions (de moins tq le texte à traduire est court !)
dans toutes les langues en utilisant simplement PhpMyAdmin
- pas de risque d'oublier une langue : au pire le champ est à blanc
- 1 seule table à gérer
- le code PHP est un peu plus simple
Inconvenients :
- la taille de la table peut augmenter très vite
Cas n°2 : une table par langue
Avantages :
- peut-être une meilleur visibilité
- tables "réduites"
Inconvénients :
- il faut penser à mettre à jour chaque table en même temps.
- il faut que les clés (ici ID_LANGUE) coïncident entres les tables.
Personnellement je pencherais volontier pour le cas n°1 du début. :)
@+
Philippe
PS : fait un copier-coller du msg dans notepad pour avoir un alignement correct