Page 1 sur 1

nom de table dynamique

Posté : 22 sept. 2008, 18:57
par nad21
Bonjour
voilà j'ai un pb tout simple mais je vois pas la solution
je m'explique je veux que le nom de ma table soit dynamique
$req=mysql_query("SELECT id,date,titre,texte,photo FROM $nom");
jusque là rien de transcendant sauf que je veus qu'une partie seulement soit dynamique
$lang='gb';
$req=mysql_query("SELECT id,date,titre,texte,photo FROM $langactualites");
la table s'appelle gbactualites ou fractualites
mais ca ne fonctionne pas
ca vient d'un probleme d'ecriture
si quelqu'un peut me dire ou je me trompe
merci
Nadege

Posté : 22 sept. 2008, 19:18
par albat
Voici la syntaxe pour résoudre ton problème imminent.
$lang = 'gb';
$req  = "SELECT id, date, titre, texte, photo FROM ".$lang."actualites"; 
$res  = mysql_query($req); 
Mais il n'en demeure pas moins un gros problème de modélisation... :evil:

Posté : 23 sept. 2008, 08:46
par nad21
merci
c'est quoi un probleme de modelisation??

Posté : 23 sept. 2008, 10:09
par albat
:afraid: :afraid: :afraid: :afraid: :afraid:

Bon, je ne vais pas te jeter la pierre
car on rencontre ce défaut tous les jours sur le forum.
Mais quand même... :evil:

L'utilisation d'une base de données ne se limite pas à l'exécution de 3 requêtes en SQL.
Il faut avant tout la modéliser, cad la structurer.

La modélisation en bases de données,
c'est un peu l'équivalent de l'algorithmique en programmation.

Pour faire vraiment très simple, il y a quelques principes fondamentaux à respecter.

Celui qui m'a fait dire qu'il y avait un défaut de modélisation dans ton schéma,
est la "non-redondance des informations"

Si j'ai bien compris, tu as une table gbactualites et une table fractualites
qui, toutes deux, contiennent des actualités ; la différence étant la langue.

Tu en conviendras, à part ce critère linguistique, ces deux tables sont identiques.
Alors, autant n'en faire qu'une !

Tu crées une table actualites et tu prévois un champ langue dans celle-ci.
Ainsi, toutes tes actualités seront stockées dans la même table
et il suffira de passer en paramètre la langue choisie pour filtrer.

Ta requête pourra alors prendre la forme suivante :
$lang = 'gb';
$req  = "SELECT id, date, titre, texte, photo FROM actualites WHERE langue='".$lang."'"; 
$res  = mysql_query($req);
On est encore loin de la solution optimale, mais c'est déjà beaucoup mieux !

:idea: Je t'invite à étudier la modélisation des BD pour apprendre à les construire.
Tu peux aussi faire une recherche sur le mot-clé MERISE, principale méthode utilisée... :pouce:

Posté : 23 sept. 2008, 13:33
par Nad21
effectivement c'est bien plus simple
je n'y avais pas pensé
c'est que la partie gb est arrivée apres
je vais tenter ca je pense .
si ya des methodes encore plus efficace n'hesite pas, je suis preneuse de toute information pouvant m'ameliorer
merci
Nadege

Posté : 23 sept. 2008, 13:47
par Nad21
je suis en train de reflechir sur cette nouvelle facon de faire ma BDD, si j'ai bien compris tous les enregistrements de la table actualites sont dupliqués avec 1 en version francaise et 1 en version anglaise??
c'est la methode habituelle?
parce que moi il n'y a que le champs texte qui changera en fait
je pensais donc renommer le champs texte par un champs 'fr' et le dupliquer en un champ 'gb' ou je mettrais les trad.
ca peut etre une bonne idée non?

Nadege

Posté : 23 sept. 2008, 14:11
par furiouslol
Si chacune de tes enregistrement est présent dans toutes les langues que tu traite, il te faudrait je pense séparer le texte de ton actualité
table "actualité"
 id_actualite //auto-increment
 auteur
 date
 etc ...

table "text"
  id_text //auto-increment
  id_actualité
  id_lang
  text // texte proprement dit dans la bonne langue

table "lang"
  id_lang //auto-increment
  label_lang // nom de la langue
Ainsi pour un seul enregistrement dans ta table "actualité", tu a X enregistrement qui correspondent dans la table "texte", autant que tu a mis de langues
De cette façon si tout a coup une nouvelle langue de traduction apparait, tu n'est pas embêtée

Bon c'est sur ça fait plus de code derrière, mais ca te permet d'anticiper correctement l'ajout de langue et puis conceptuellement ça doit plus plaire a Albat :)

Posté : 23 sept. 2008, 15:01
par Nad21
je dois t'avouer que j'ai un peu de mal a voir l'interet d'une telle methode

Posté : 23 sept. 2008, 16:11
par furiouslol
Ben l'éclatement des données en plusieurs tables te permet d'éviter au maximum la duplication d'information, et aussi de palier a toute éventualité de modification ultérieures . Ce modèle te permettrais au besoin d'ajouter une langue facilement (exemple l'allemand), en rajoutant simplement une ligne dans ta table langue, les impacts sur ton code php s'en trouverons également amoindrit puisque tu auras déjà un code capable de traiter X langues, et non pas seulement 2

Enfin y a un tas d'avantage, en général le fait de modéliser au départ t'évite de trop t'embêter par la suite, et puis la modélisation ca permet de parler tous le même langage également

Posté : 23 sept. 2008, 16:13
par furiouslol
Maintenant le modele d'albat est surement plus simple a mettre en place :p

Posté : 24 sept. 2008, 13:24
par nad21
merci pour vos reponses
je vais essayer cette methode mais je comprends pas la structure de la bdd

ds mon cas on part sur 2 langues (fr et gb) avec un champ titre et un champ texte qui varient en fonction des langues et un champ photos qui est tjrs le meme.

je fais donc un table actualite
id_actu | photo

une table texte
id_texte | id_actu | id_lang | texte | titre

c'est ca?
et la je mets mes 2 versions du meme article d'actualité dans cette table avec les 2 version gb et fr ??
c'est bien ca?
merci
Nadege

Posté : 24 sept. 2008, 13:52
par furiouslol
Effectivement, ta table actualité doit contenir toutes les informations qui sont indépendantes de la langue, exemple :
Actualité 
  id_actu // auto-increment
  photo
  auteur
  date de parution
  etc ...
Et toute ce qui a attrait a la langue apparaitre dans ta table de traduction, exemple :
ActuTrad
  id_trad // auto-increment
  id_actu // reference a l'actu
  id_lang // code lang, genre "fr", "en" si tu n'as pas envie de gérer une table des langues, voir le type ENUM pour ce champ
  text // le texte dans la langue spécifiée par le id_lang
  titre // le titre dans la langue spécifiée par le id_lang
  date de traduction // j'aime bien mettre des dates, ca peut servir et ca mange pas d'pain
  etc ...
De cette façon tu seras capable de ressortir le ou les textes qui vont bien pour ton actu, en fonction de la langue, et aucune donnée n'est dupliquée.
Ainsi pour chaque enregistrement dans la table "Actualite", tu auras 1 ou 2 enregistrement dans la table "ActuTrad"

Ensuite, une fois que c'est en place, si tu veux savoir quelles actus n'ont pas été traduite en anglais :
SELECT *
FROM actualite a
WHERE NOT EXISTS(SELECT * FROM ActuTrad b WHERE a.id_actu=b.id_actu AND b.id_lang="en")
Et ainsi de suite

[RESOLU]

Posté : 24 sept. 2008, 21:28
par Nad21
ok merci beaucoup