Ankündigung

Einklappen
Keine Ankündigung bisher.

Variabeln in Datenbank speichern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Variabeln in Datenbank speichern

    Hallo,

    für eine multilinguale Webseite habe ich mit überlegt, die Sprach-Übersetzungen in einer MySQL Datenbank zu speichern.
    Bisher gab es für jede Sprache einfach eine php Datei, in der die Konstante und die Übersetzung enthalten war. Das ganze sah dann ungefähr so aus:

    german.php:
    PHP-Code:
    define("_USER","Benutzer");
    define("_CITY","Ort"); 
    english.php
    PHP-Code:
    define("_USER","User");
    define("_CITY","City"); 
    Nachdem ich die Sprachdateien in eine MySQL Datenbank portiert habe, sehen die Spachdateien nun so aus:

    german.php
    PHP-Code:
    $lang_result=mysql_query("SELECT constant, german FROM language"$db);
    while(list(
    $const$lang) = mysql_fetch_array($lang_result$dbi)) {

    define("$const","$lang");    

    Das ganze funktioniert wunderbar und ich glaube sogar etwas schneller. Leider gibt es ein kleines Problem: Einige Übersetzungen enthielten Variabeln wie z.B.:

    PHP-Code:
    define("_HELP","Für technische Hilfe kontaktieren Sie uns bitte unter $email"); 
    Seit der Umstellung auf eine datenbankgestützete Abfrage werden Variabeln wie hier das
    $email nicht mehr ersetzt.

    Ich habe dann bei meiner Recherche im Internet die Möglichkeit gefunden, das Problem mit eval() zu lösen:

    PHP-Code:
    $lang_result=mysql_query("SELECT constant, german FROM language"$db);
    while(list(
    $const$lang) = mysql_fetch_array($lang_result$dbi)) {

    eval (
    "\$lang = \"$lang\";");
    define("$const","$lang");    

    An sich scheint das so zu funktionieren. Die Übersetzungen sehen nun richtig aus und die Variabeln sind ersetzt. Dummerweise gibt es aber trotzdem eine Fehlermeldung:


    Code:
    <b>Parse error</b>:  syntax error, unexpected '>' in <b>/path/german.php(36) : eval()'d code</b> on line <b>1</b><br />
    <br />
    <b>Parse error</b>:  syntax error, unexpected T_VARIABLE in <b>/path/german.php(36) : eval()'d code</b> on line <b>1</b><br />
    Nun die Fragen:
    1.) Wo liegt der Fehler?
    2.) Ich lese immer wieder, dass die Funktion eval() (wie der Name schon sagt ) böse ist... Da ausser mir aber niemand Einträge in diese Tabelle machen kann, muss ich mir da aber nicht so viele Sorgen machen, oder?
    3.) Kostet mich das eval() unnötig rechenzeit? Immerhin wird das bei allen Übersetzungen angewand, egal ob eine Variable enthalten ist oder nicht.
    4.) Gibt es eine bessere Lösung?

    Danke & Grüsse
    Florian

  • #2
    define("$const","$lang");
    Mal gegengefragt:
    1/ Warum willst Du einen dynamischen Wert unbedingt in eine Konstante schreiben? Was spricht gegen eine Variable?

    Kommentar


    • #3
      Weil ich dann über 100.000 Zeilen Quellcode korrigieren müsste...

      Kommentar


      • #4
        zu 2.): Das wie zu sagen, dass Autofahren mit Gurt nie tödlich sein kann!

        Kommentar


        • #5
          OK, ich würde mich über ein paar qualifizierte Tipps freuen.

          Antworten wie die von PTC sind wenig hilfreich. Eine ordentliche Einschätzung der Risiken wäre hilfreicher. Alles ist eine Risiko - Nutzen Abschätzung.

          Wenn ich, um mein Ziel zu erreichen, entweder den kompletten Quellcode ändern muss oder alternativ mit Funktionen wie eval() nur dann Sicherheitsprobleme bekommen, wenn es jemand bereits geschafft hat, sich als Admin in das Webinterface einzuloggen, dann ist das Risiko von eval() wohl geringer, als der Aufwand das mit einer kompletten Quellcodeänderung zu lösen!

          Grüsse
          Florian

          Kommentar


          • #6
            define("_HELP","Für technische Hilfe kontaktieren Sie uns bitte unter $email");
            Solche Konstrukte finde ich unsinnig. Auf der einen Seite machst Du alles statisch durch die Verwendung von Konstanten, auf der anderen Seite setzt der verwendende Kontext zwingend die lokale Variable $email voraus. Viel sinnvoller wäre gewesen, wenn diese CONST gewesen wäre.

            Kommentar


            • #7
              OK, aber lass uns doch mal über eine Lösung meines Problems reden und nicht über Möglichkeiten, alles anders zu machen.

              Als Schüler, Student oder Arbeitsloser, würde ich so einiges an unserem Portal ändern, die Zeit habe ich nicht mehr...
              Ich muss daher schrittweise Änderungen und Verbesserungen zwischendurch machen.

              Kommentar


              • #8
                Zitat von Floezen Beitrag anzeigen
                1.) Wo liegt der Fehler?
                Lass dir mal den Code, den du versuchst per eval auszuführen, vorher ausgeben. (und poste den, der den Fehler verursacht hier)

                2.) Ich lese immer wieder, dass die Funktion eval() (wie der Name schon sagt ) böse ist... Da ausser mir aber niemand Einträge in diese Tabelle machen kann, muss ich mir da aber nicht so viele Sorgen machen, oder?
                Dass die Lösung hässlich ist und nur Probleme verursacht hast du ja jetzt schon am eigenen Leib erfahren

                3.) Kostet mich das eval() unnötig rechenzeit? Immerhin wird das bei allen Übersetzungen angewand, egal ob eine Variable enthalten ist oder nicht.
                4.) Gibt es eine bessere Lösung?
                Ja. Verwende echte Platzhalter statt den "Variablennamen". Die Platzhalter kannst du dann mit printf()/sprintf() bei der Ausgabe ersetzen...(fürs nächstemal )

                Einen Versuch wäre vielleicht auch eine Lösung mit preg_replace / preg_replace_callback wert...

                Kommentar


                • #9
                  Ehrlich gesagt, ich verstehe auch nicht, wie das vorher funktioniert hat. Da hast Du auch Konstanten verwendet? Dann muß doch $email auch im Kontext gültig gewesen sein, wo die "Meldung" definiert wurde.
                  Wenn dem so ist verstehe ich nicht, wieso es da zigtausende Quellcodezeilen zu korrigieren gäbe. Da eine Konstante nur einmal definierbar ist, wird das ja auch vorher irgendwo zentral passiert sein?

                  Kommentar


                  • #10
                    Der Vorschlag war doch alles über Variabeln zu machen, d.h. alle Konstanten in Variabeln ändern...

                    Aber ich habe mittlerweile auch den Fehler bei eval() gefunden... aus irgendwelchen Gründen ist auch \" überall nurnoch " geworden. Das macht natürlich Problem.

                    Insofern mein Dank an agrajag, der hat mich auf die Idee gebracht einfach mal nur die Ausgabe nach eval() zu betrachten - ohne Webseite ringsherum. Dabei habe ich dann tatsächlich die fehlerhaften Stellen gefunden.

                    Kommentar


                    • #11
                      Was immer Du machst...

                      Kommentar

                      Lädt...
                      X