php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.10.2008, 12:43  
Benutzer
 
Registriert seit: 26.09.2006
Beiträge: 31
Floezen
Standard 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
Floezen ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.10.2008, 13:22  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
define("$const","$lang");
Mal gegengefragt:
1/ Warum willst Du einen dynamischen Wert unbedingt in eine Konstante schreiben? Was spricht gegen eine Variable?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 04.10.2008, 14:49  
Benutzer
 
Registriert seit: 26.09.2006
Beiträge: 31
Floezen
Standard

Weil ich dann über 100.000 Zeilen Quellcode korrigieren müsste...
Floezen ist offline  
Alt 04.10.2008, 16:05  
PTC
Erfahrener Benutzer
 
Benutzerbild von PTC
 
Registriert seit: 27.10.2007
Beiträge: 1.708
PHP-Kenntnisse:
Anfänger
PTC ist einfach richtig nettPTC ist einfach richtig nettPTC ist einfach richtig nettPTC ist einfach richtig nett
Standard

zu 2.): Das wie zu sagen, dass Autofahren mit Gurt nie tödlich sein kann!
PTC ist offline  
Alt 04.10.2008, 16:42  
Benutzer
 
Registriert seit: 26.09.2006
Beiträge: 31
Floezen
Standard

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
Floezen ist offline  
Alt 04.10.2008, 17:07  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
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.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 04.10.2008, 17:17  
Benutzer
 
Registriert seit: 26.09.2006
Beiträge: 31
Floezen
Standard

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.
Floezen ist offline  
Alt 04.10.2008, 17:18  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
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)

Zitat:
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

Zitat:
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...
__________________
Today you...Tomorrow me.

Geändert von agrajag (04.10.2008 um 17:23 Uhr).
agrajag ist offline  
Alt 04.10.2008, 17:34  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

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?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 04.10.2008, 17:58  
Benutzer
 
Registriert seit: 26.09.2006
Beiträge: 31
Floezen
Standard

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.
Floezen ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Russische Namen in Datenbank speichern. HSFighter Datenbanken 2 27.05.2008 21:29
Variablen in Datenbank speichern und auslesen freehawk PHP-Fortgeschrittene 4 16.03.2008 17:22
Mit php dynamisch Namen von Bildnamen sowie Pfad in mysql Datenbank speichern mallmis PHP Tipps 2008 1 19.11.2007 23:04
Inhalte in Datenbank speichern Maxi Datenbanken 31 14.09.2007 18:56
Speichern einer Telefonliste mit PHP in einer Datenbank timo_81 PHP Tipps 2008 30 07.09.2007 17:52
Inhalte in einer Datenbank speichern Maxi Datenbanken 5 02.09.2007 21:37
Daten aus Datenbank sinnvoll speichern PHP Tipps 2006 15 02.02.2006 19:54
[Erledigt] Auswahlmenü in einer Datenbank speichern Datenbanken 3 03.11.2005 17:26
[Erledigt] Datensätze aus Datenbank speichern und zuweisen PHP Tipps 2005-2 6 11.09.2005 15:38
PHP in eine Datenbank speichern. PHP Tipps 2005 17 03.05.2005 21:13
htmlcode in datenbank speichern PHP Tipps 2005 38 09.04.2005 20:58
Formulardaten in eine Datenbank speichern und abfragen DarkThunder PHP Tipps 2005 3 08.04.2005 21:33
Probleme beim speichern in die Datenbank Jojo1 PHP Tipps 2005 14 03.02.2005 14:50
Formular in Mysql Datenbank speichern Anuschka Datenbanken 1 15.08.2004 02:55
Bilder in Datenbank speichern PHP Tipps 2004 11 05.08.2004 10:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php datenbankabfrage variablen while list, variablen in datenbank speichern, php const problem db, eval datenbank, php sprachversion name variable in datenbank speichern, php variable in datenbank speichern, konstante in datenbank speichern, eval code in datenbank speichern

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:04 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum