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 :

Variable stockée dans MySQL


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut Variable stockée dans MySQL
    Bonjour,

    Je souhaites mettre en place un site multilingues. Dans une table MySQL, j'enregistre les traductions. J'aimerais savoir comment faire pour stocker et traiter des variables dans ces traductions.

    Par exemple:
    Vous avez 5 articles dans votre panier pour un montant de 30€.

    J'aimerais stocké dans ma table quelque chose comme:
    Vous avez $nbr_articles articles dans votre panier pour un montant de $montant_panier €.

    Je vous sollicite pour savoir si quelqu'un a déjà mis en place un truc semblable et comment faire pour stocker ça dans la base et l'exploiter derrière.

    En vous remerciant.

  2. #2
    Membre expérimenté Avatar de Korri
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 158
    Par défaut
    Ce que tu demande la c'est comment fonctionne MySql ? Je t'invite à aller jeter un coup d'oeuil ici : http://mysql.developpez.com/ puis ici pour vois comment t'en servir en php : http://php.developpez.com/

    Sinon pour le conseil en soit, je n'utiliserais pas mysql pour ce genre de choses, mais plutôt des sessions.

    Sinon le rapport avec la traduction j'ai pas bien compris.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Dans un table "Traductions" MySQL, je veux avoir une ligne pour chaque langue:
    FR: Vous avez 5 articles pour 30€
    EN: You have 5 items for 30€

    Mais le panier ne contiendra pas forcément 5 articles pour un montant de 30€.

    Je voudrais donc pouvoir stocker ces traductions avec quelque chose comme:
    FR: Vous avez {nbr_article} article(s) pour {montant}€
    EN: You have {nbr_article} item(s) for {montant}€

    Où après exportation des données de la base j'aurais une fonction qui me remplacerait les 2 variables {nbr_article} et {montant} par les valeurs réelles dans chaque cas

  4. #4
    Membre expérimenté Avatar de Korri
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 158
    Par défaut
    Hoooo autant pour moi je n'avais pas compris la question.

    Jète un oeuil du coté de sprintf

  5. #5
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    une façon simple de le faire c'est de te constituter une table atom qui contient l'id unique de chaque expression et un texte cours pour l'identifier plus facilement
    ensuite une table où tu as tes textes dans toutes les langues que tu veux:
    tu indexes au moins idatom voire tu peux faire un index double (idatom,idlang)
    le principe est simple

    si c'est toi qui peuple à la main alors la table atom te permet de te repérer facilement
    autrement la table atom tu peux t'en passer si tu fais une interface pour quelqu'un d'autre mais alors index seulement idatom et insert toujours max(idatom)+1 pour le nouveau texte... (ça optimise les opération de rechercher et d'insertion par rapport au double index qui ne boostera que la recherche et sera de plus en plus long à reconstruire à chaque nouvelle entrée)

    voilà une approche avec mysql

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Un sujet à lire traitant du même problème : http://www.developpez.net/forums/d90...ht=multilangue

    Perso je pense toujours que pour de la traduction d'interface la bdd n'est pas une bonne solution (lui préférer gettext ou xml)
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    l'i18n en mode xml est loin d'être simple ou est vite un peu lourde en terme de balises à mettre pour bien la gérer... ça convient surtout à des pages statiques

    et le suivi des différents fichiers de traduction en suite est lourde aussi...

    bref actuellement ça reste une chose qui est toujours en cours de développement et certaines solutions sont plus ou moins adaptées selon les applications qu'on a à faire

  8. #8
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Merci pour vos différentes réponses, mais la solution que propose Korri me parait plus adapté à ma demande.

    En effet, j'ai une table traduction du style

    ID NOM_FR NOM_EN
    1 Vous avez %1$d articles You have %1$d items

    Avec une fonction je récupère le champ en fonction de l'ID et de la langue. Et je souhaitais transformé le "x" par le nombre correspondant au panier du client.

    Ca va me permettre de gérer tout mon Front et mon Back dans plusieurs langues ça avoir à me prendre la tête de la position des chiffres pour chaque traduction, les utilisateurs auront juste à éviter de toucher au caractère %1$d dans le champ Vous avez %1$d articles.

  9. #9
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    ça ne change pas ce que je t'ai dit...
    l'interprétation de "variables" se fait coté php avec un simple str_replace

    là je t'avais juste parlé de la partie mysql...
    et il vaut mieux en effet utiliser des trucs style {bidule} ou [bidule] que <bidule> qui serait vu comme du xml par le dom...

    tu peux le faire aussi côté mysql mais il faut passé par de la procédure stockée...

  10. #10
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    ça ne change pas ce que je t'ai dit...
    l'interprétation de "variables" se fait coté php avec un simple str_replace
    Citation Envoyé par ericd69 Voir le message
    il vaut mieux en effet utiliser des trucs style {bidule} ou [bidule] que <bidule> qui serait vu comme du xml par le dom...
    Je ne vois pas comment remplacer tous les contenus {variable} par $variable du côté de PHP quand celui si est au milieu d'un texte. Si tu peux m'aiguiller... Je suis preneur.

  11. #11
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    je t'ai dis tu récupères ta traduction dans une variable

    et tu applique un str_replace ou preg_replace dessus pour changer les textes que tu recherches par leur valeur

    et ensuite tu peux faire un echo pour afficher la variable dans la pege...

  12. #12
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    J'ai essayé avec preg_replace().

    J'ai déclaré ma variable:
    $montant = 5;
    Lorsque je fais en PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo	preg_replace("`{(.*?)}`", "$1", "Votre panier est de ${montant}");
    j'obtiens bien:
    Votre panier est de 5

    Par contre lorsque je récupère l'information dans ma base de données via une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function traduction($id_traduction)
    {
    	global $tb_traductions, $langue_affichage;
    	$requete_traductions = "SELECT NOM_".$langue_affichage." FROM $tb_traductions WHERE $tb_traductions.ID = $id_traduction";
    	$resultat_traductions = mysql_query($requete_traductions) or die(mysql_error());
    	$ligne_traductions = mysql_fetch_assoc($resultat_traductions);
    	return utf8_encode($ligne_traductions["NOM_$langue_affichage"]);
    }
    $montant = 5;
    echo preg_replace("`{(.*?)}`", "$1", traduction(1));
    traduction(1) me renvoi bien:
    Votre panier est de ${montant}
    j'obtiens:
    Votre panier est de $montant

    Je ne vois donc pas comment mettre en place ce que tu proposes. Désolé si je passe à côté de quelque chose d'évident pour toi mais je sèche

  13. #13
    Membre expérimenté Avatar de Korri
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 158
    Par défaut
    Si tu veux utiliser un replace utilise plutôt str_replace, moins gourmand, et tu n'a pas besoin d'expression régulière ici, par exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $message = str_replace('${montant}', $montant, 'Total: ${montant} !');

    Mais je pense vraiment que sprintf est plus adapté dans ton cas, car avec str_replace ou preg_replace tu vadevoir le faire plusieurs fois, au cas par cas pour chaque message, alors que avec sprintf ou printf, tu n'a qu'a récupérer ton message, puis utiliser sprintf quand tu sait qu'il y à un variable (d’ailleurs la plupart des systèmes de traduction fonctionnent comme ça).

  14. #14
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Korri,

    Je pense que je vais abandonner les replace() pour ta méthode qui marche à merveille et qui est plus simple à mettre en place avec mes connaissances.

    Merci pour tout.

  15. #15
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    str_replace et preg_replace acceptent de passer un tableau pour les valeurs à chercher et de remplacement, ce qui évite de faire plusieurs appels


  16. #16
    Membre expérimenté Avatar de Korri
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 158
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    str_replace et preg_replace acceptent de passer un tableau pour les valeurs à chercher et de remplacement, ce qui évite de faire plusieurs appels

    Effectivement j'avais oublié cette possibilité, mais pour moi sprintr est la solution la plus adaptée...

  17. #17
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    traumatisé par le c...

    après c'est plus une question de syntaxe que de performance...

    si tu dois faire un nombre variable de changements sur un texte, la mienne devient la seule possible car tu changes juste les tableaux à passer sinon les 2 se valent...


  18. #18
    Membre expérimenté Avatar de Korri
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 158
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    traumatisé par le c...

    après c'est plus une question de syntaxe que de performance...

    si tu dois faire un nombre variable de changements sur un texte, la mienne devient la seule possible car tu changes juste les tableaux à passer sinon les 2 se valent...

    Non avec sprintf tu fait du cas par cas, donc pas besoin de s'adapter, par exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $message1 = 'Bonjour %s !';
    $message2 = 'Vous nous devez %d$ et %dcents !';
     
    echo sprintf($message1, 'Machin');
    echo "\n";
    echo sprintf($message2, 18, 25);

    Ce qui donne :
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bonjour Machin !
    Vous nous devez 18$ et 25cents

    Et en base de donné tu n'a besoin que de stoquer $message1 et $message2, avec une clef, ou une id pour les retrouver.

    J'utiliserais ta méthode si jamais il n'est pas possible de modifier les message ou alors dans certains cas très spécifiques, mais le reste du temps sprintf me semble plus approprié. D'autant qu'il à très bien sa place dans une vue contrairement à un méthode plus lourde.

    PS: Niveau performance aucune idée, bon biensur preg_replace on en parle pas, mais entre str_replace et sprintf, je ne sait pas.

  19. #19
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    disons que pour faire des remplacements de bbcodes (pour donner un exemple concret) dont la liste peut varier selon les besoins... preg_replace et str_replace évitent de faire de nombreux passages (surtout sur un texte long)... donc tu peux pondre un code plus générique pour se genre de truc (preg_replace pour les partie avant des balises avec options, str_replace pour les balises sans options et les fermetures de balises)

    sprintf est bien sur des remplacements figés (en terme nombre de valeurs)...

    sprintf et str_replace doivent se valoir en terme de performances vu qu'ils n'utilisent pas de regexp...


  20. #20
    Membre expérimenté Avatar de Korri
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 158
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    disons que pour faire des remplacements de bbcodes (pour donner un exemple concret) dont la liste peut varier selon les besoins... preg_replace et str_replace évitent de faire de nombreux passages (surtout sur un texte long)... donc tu peux pondre un code plus générique pour se genre de truc (preg_replace pour les partie avant des balises avec options, str_replace pour les balises sans options et les fermetures de balises)

    sprintf est bien sur des remplacements figés (en terme nombre de valeurs)...

    sprintf et str_replace doivent se valoir en terme de performances vu qu'ils n'utilisent pas de regexp...

    Ha oui effectivement il y à beaucoup de situations ou le preg_replace est beaucoup plus indiqué. Mais la je parlais dans le cadre de traduction

Discussions similaires

  1. Insérer une Variable javascript dans MySQL
    Par MacUser dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/08/2008, 18h09
  2. Réponses: 11
    Dernier message: 11/07/2008, 14h58
  3. [MySQL] Télécharger images stockées dans mysql
    Par else_if dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/05/2008, 05h53
  4. [MySQL] afficher image stockée dans mysql
    Par dino-info dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/05/2008, 01h10
  5. [MySQL] Afficher une image stockée dans MySql
    Par yanng dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/11/2007, 20h56

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