Portal > Foren > PHP > PHP-Programmierung > Sprachvariablen aus der Datenbank ersetzen
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 19.06.2006, 01:23 Nach oben    #1
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Sprachvariablen aus der Datenbank ersetzen

Gute Nacht ,
nun, mein Problem stellt sich zurzeit meiner View-Komponente. Mein Projekt soll (längerfristig) mehrsprächigkeit unterstützen, somit habe ich mich für Sprachvariablen aus der Datenbank entschieden. Nun habe ich allerdings ein Problem beim auslesen.

Rein logisch hab ich die Abfolge so geplant:
Sprachvariablen werden speziell gekennzeichnet und mittels Regex aus dem aktuellen Template geholt, diese Variablen werden nun aus der Datenbank geholt und anschließend zugewiesen. Ansich ja logisch. Mein erster Versuch hat so ausgesehen (ziemlich umständilich, zugegeben
PHP-Code:
<?php
// Etwas aus dem Zusammenhang gerissen, und auch aus einer Methode entnommen
$aMatch = array();
$aRegexArray = array();
$aLangvarIdentifier = array();
$iCounter 0;

// Firstly we search for language dummys
preg_match_all('#' $this -> sLeftDelimiter $this -> sLeftLanguageDelimiter '(.*)' $this -> sRightLanguageDelimiter $this -> sRightDelimiter '#isU'$this -> sCurrentTemplate$aMatch);

// For security reasons we escape the given values
foreach($aMatch[1] AS $sKey => $sValue) {
        
$aLangvarIdentifier[$iCounter] = mysql_real_escape_string($sValue);
        
$iCounter ++;
}

// Alphabetical sort because of mysql sort (ascending)
sort($aLangvarIdentifier);

$sNeededRows implode("' OR identifier = '"$aMatch[1]) . "'";
printArray($sNeededRows);
$this -> oModel -> query("SELECT
                                 text
                         FROM
                                 " 
DBPREFIX "language_" $this -> sLanguage "
                         WHERE
                                 identifier = '" 
$sNeededRows "
                         ORDER BY
                                 identifier ASC"
);

$iCounter 0;
while(
$this -> oModel -> fetch()) {
        
// No we build up several arrays so we are able to replace all in one step
        
echo $aLangvarIdentifier[$iCounter] . '<br />';
        echo 
$this -> oModel -> oResult -> text '<br /><br />';

        
$this -> aLanguageVariables[($aLangvarIdentifier[$iCounter])] = $this -> oModel -> oResult -> text;
        
sRegexp '#' $this -> sLeftDelimiter $this -> sLeftLanguageDelimiter $aLangvarIdentifier[$iCounter] . $this -> sRightLanguageDelimiter $this -> sRightDelimiter '#isU';
        
$aRegexArray[] = $sRegexp;
        
$iCounter ++;
}

// Replace given database result
$this -> sCurrentTemplate preg_replace($aRegexArray$this -> aLanguageVariables$this -> sCurrentTemplate);
return 
$this -> sCurrentTemplate

?>
Mein Ziel war es, dass ich nicht alle einzeln, sondern mit einem Rutsch aus der DB holen kann - ist mir aber ziemlich misslungen. Beispieloutput (hier mit print_r) :
aus dem regexp:
Code:
Array
(
    [0] => welcometext
    [1] => login
    [2] => username
    [3] => password
    [4] => loginbutton
    [5] => register
    [6] => simpleregisterusername
    [7] => simpleregisterbutton
    [8] => onlineuser
)
schließlich aus der Datenbank:
Code:
Array
(
    [login] => Anmelden
    [loginbutton] => Einloggen
    [onlineuser] => Passwort
    [password] => Registrieren
    [register] => Weiter zum nächsten Schritt
    [simpleregisterbutton] => Dein gewünschter Username
    [simpleregisterusername] => Username
    [username] => Herzlich Willkommen im eXtended PHP-Chat Version 1.0!
)
Hierbei ist schon zu sehen, dass die Ergebnisse durcheinandergewürfelt wurden - und zwar, weil onlineuser (noch) nicht in der DB ist - kommt normalerweise nicht vor, kann aber mal (wie gerade bei mir beim testen), und dann gibts ein riesen durcheinander ..

Darum such ich ne andere, bessere Methode.
Versucht habe ich es auch so:
PHP-Code:
<?php
foreach($aMatch[1] AS $sRow) {
        
$sRow $this -> oModel -> escape($sRow);
        
$this -> oModel -> fetch("SELECT
                                                     text
                                           FROM
                                                      " 
DBPREFIX "language_" $this -> sLanguage "
                                           WHERE
                                                      identifier = '$sRow'
                                           "
);
?>
Allerdings hat mir das dann bei meinen Performancerechungen gleich mai 0.015 Sekunden mehr gebrahct - bei mehreren Sprachvariablen sicher fatal. Alle Variablen gleichzeitig aus der DB holen wäre auch eine Möglihckiet - aber bei vielen Sprachvariablen wohl auch zu Zeitintensiv..

Ich hoffe ihr könnt mir helfen
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 03:19 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Hallo,
also ich habe eigentlich nicht wirklich verstanden, was du da gemacht hast .. aber nunja.

Warum ist denn bei dir die Sortierung wichtig? Das verstehe ich nicht. Es sollte doch letztlich völlig schnuppe sein, solange die Variablen richtig ersetzt werden.

Ich weiß .. auch bei mir ist es schon spät .. vielleicht hab ich auch einfach nur nicht genau genug gelesen (obwohl ich das zweimal gemacht habe ), aber faktisch verstehe ich den Sinn deines Codes gar nicht.

Wäre nett, wenn du das noch etwas erläutern könntest.
Danke.

Grüße, Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 06:41 Nach oben    #3
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
ist mir aber ziemlich misslungen.
Wie ich selber sagte
Nun hier eine kleine Erläuterung:
PHP-Code:
<?php
// Die Ergebnisse aus preg_match_all
$aMatch = array();

// Ein Array, dass für jeden Dummy (z.B. {§welcometext§}) im Template
// das benötigte Regex bereithält
$aRegexArray = array();

// Dieses Array beinhlatet die Identifier, also z.B. welcometext, login,
// username ... (die Keys der Phrasen)
$aLangvarIdentifier = array();
$iCounter 0;
?>
Zuerst wende ich preg_match_all auf die LanguageVariablen bzw das Template an - diese ordne ich dann in $aLangvarIdentifier[] neu an und sortiere sie von A nach Z (welcometext steht dann z.B. an letzter stelle, während username weiter oben kommt).

Nun hol ich mir die benötigten Texte aus der Datenbank, wobei ich mir meine WHERE-Clause mit implode() zusammenbauen lasse, und bilde das Array $this -> aLanguageVariables, was nun eine Struktur hat wie
[username] => 'Username',
[welcometext] => 'Herzlich Willkommen....'
, da ich dies ja durch $aLangvarIdentifier (da sind ja jetzt die Dummys aus den Templates drin) ersetze:
PHP-Code:
<?php
$this 
-> aLanguageVariables[($aLangvarIdentifier[$iCounter])] = $this -> oModel -> oResult -> text
?>
Gleichzeitig füll ich das Array für die Regex - für jeden Dummy eins - sodass ich dann bei preg_replace() zwei Arrays habe (einmal ein SuchArray, und einmal ein Replace-Array
PHP-Code:
<?php
$this 
-> sCurrentTemplate preg_replace($aRegexArray$this -> aLanguageVariables$this -> sCurrentTemplate);
?>
Hoffe das is jetz verständlich? Is aber nicht sehr gut, die Methode..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 11:00 Nach oben    #4
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Ist zwar keine Lösung für konkret dieses Problem, ich biete sie aber trotzdem feil (schaden kanns nie
Wie wärs, wenn du einzelne Sprachen in Dateien speicherst und dann als ini einliest?
Dann hast du
a) das Problem nicht und
b) den Vorteil, dass du komfortabel komplette Sprachen hinzufügen kannst, ohne jeden Wert einzeln in MySQL zu geben (selbst ein selbstgebasteltes Frontend ist hier imho aufwändiger zu bedienen, als einfach ein Texteditor)

Ich mein, Labels sind ja nun keine Sicherhietsrelevanten Daten...

Vielleicht findest du ja Gefallen an der Idee, man weiß nie... (Vielleicht hast du auch schon darüber nachgedacht und hast es aus irgendeinem Grund verworfen)

Grüße,
Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 14:06 Nach oben    #5
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Über eine dateibasierte Version hab ich natürlich auch schon nachgedacht.
Ich wollte aber lieber die datenbankbasierende, weil die für mich attraitktiver und für den End-User (das können auch totale Laien sein, werden es auch wohl größten Teils). Hat denn niemand einen LÖsungsvorschlag für mein Problem?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 15:36 Nach oben    #6
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Also ich hab immer noch nicht verstanden, was du da machst .. mich verwirren auch diese Variablenbezeichnungen ($sDingens is ein String etc. *wirr*).

Nuja.
Also es gibt eine Methode, das ganze über Phrasen zu lösen.
Due hast also eine Tabelle "languages", in der du einträgst, welche Sprachen alle verfügbar sein sollen.
SQL Code:
  1. CREATE TABLE `language` (
  2.   `languageid` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   `title` varchar(50) NOT NULL DEFAULT '',
  4.   `languagecode` varchar(12) NOT NULL DEFAULT '',
  5.   `charset` varchar(15) NOT NULL DEFAULT '',
  6.   `separator_decimal` char(1) NOT NULL DEFAULT '.',
  7.   `separator_thousand` char(1) NOT NULL DEFAULT ',',
  8.   PRIMARY KEY  (`languageid`)
  9. ) TYPE=MyISAM;

Nur mal als Beispiel. Kann man natürlich noch andere Sachen als Eigenschaft setzen oder auch einiges weglassen.

Dann gibt es eine Tabelle "phrases" oder so.
SQL Code:
  1. CREATE TABLE `phrase` (
  2.   `phraseid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   `languageid` smallint(6) NOT NULL DEFAULT '0',
  4.   `varname` varchar(250) BINARY NOT NULL DEFAULT '',
  5.   `text` mediumtext NOT NULL,
  6.   PRIMARY KEY  (`phraseid`),
  7.   UNIQUE KEY `name_lang_type` (`varname`,`languageid`),
  8. ) TYPE=MyISAM;
Diese Phrasen könnten Wörter, aber auch ganze Textabschnitte sein, welche du dann im Template einfach setzen kannst.
Das Tolle daran ist, dass du im Template einfach stehen hast

HTML-Code:
<p>{phrase['this_is_a_sample_phrase']}</p> 
oder so (wie auch immer du deine Variablen im Template kennzeichnest) und dann wird anhand der aktuell verwendeten Sprache die Phrase ausgelesen und ins Template geparsed.

Überschneidet sich jetzt etwas mit deinem Problem? Keine Ahnung, weil ich deine Beschreibung nicht verstehe!
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 15:42 Nach oben    #7
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
mich verwirren auch diese Variablenbezeichnungen ($sDingens is ein String etc. *wirr*).
Ich find des schön und übersichltihc, so hab ich immer meine Variablentypen im Auge (bei PHP zwar nicht so ausschlaggebend, dennoch, s = string, o = object, i = int usw..)
Zitat:
und dann wird anhand der aktuell verwendeten Sprache die Phrase ausgelesen und ins Template geparsed.
Genau das ist ja was ich suche! Wie wird das mit PHP realisiert? Das ist mein Problem
Und zwar deswegen:
Zitat:
Zitat von Chr!s
[php]<?php
Darum such ich ne andere, bessere Methode.
Versucht habe ich es auch so:
PHP-Code:
<?php
foreach($aMatch[1] AS $sRow) {
        
$sRow $this -> oModel -> escape($sRow);
        
$this -> oModel -> fetch("SELECT
                                                     text
                                           FROM
                                                      " 
DBPREFIX "language_" $this -> sLanguage "
                                           WHERE
                                                      identifier = '$sRow'
                                           "
);
?>
Allerdings hat mir das dann bei meinen Performancerechungen gleich mai 0.015 Sekunden mehr gebrahct - bei mehreren Sprachvariablen sicher fatal. Alle Variablen gleichzeitig aus der DB holen wäre auch eine Möglihckiet - aber bei vielen Sprachvariablen wohl auch zu Zeitintensiv..
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (19.06.2006 um 15:44 Uhr)
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 15:50 Nach oben    #8
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Aha. Sag das doch. Dein etwas bescheuert formatierter Code hat mich verwirrt.
Joa, weiß ich jetzt auch nicht. Hahaha ..
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 15:53 Nach oben    #9
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Dein etwas bescheuert formatierter Code hat mich verwirrt.
Wieso bescheuert formatiert?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 15:55 Nach oben    #10
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Ist an dieser Stelle irrelevant.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 16:16 Nach oben    #11
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Gut dann kehr ich mal zur Relevanz zurück und sag, dass ich immer noch einen Lösungsansatz suche, wär echt nett wenn da jemand was für mich hätte.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 19:08 Nach oben    #12
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Hi Chr!s, ich würde bei deiner DB Anfrage nicht nur den "text", sondern auch den "identifier" mit abfragen. Daraus dann den Array bauen mit welchem du die Platzhalter ersetzts.

Dann währe auch die sort() Funktion überflüssig, denn wirklich helfen tut sie dir ja gerade nicht und du kannst ja nicht davon ausgehen, dass die Sprachvariablen in der DB sortiert gespeichert sind. (Wenn ich den Sinn natürlich richtig verstanden habe.)
dago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 19:21 Nach oben    #13
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
ausgehen, dass die Sprachvariablen in der DB sortiert gespeichert sind.
Naja ich hol sie aber mit ORDER BY text ASC raus - insofern also schon.

Zitat:
ich würde bei deiner DB Anfrage nicht nur den "text", sondern auch den "identifier" mit abfragen. Daraus dann den Array bauen mit welchem du die Platzhalter ersetzts.
Wie meinst du das genau? Ich hab das Gefühl, dass ich es mir hier viel zu umständlich mach und gerade so ein bisschen am Schlauch steh..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 19:25 Nach oben    #14
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Ich weiß auch gar nicht genau, warum du da rumsortierst. Was bringt dir das denn?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 19:30 Nach oben    #15
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Ach herrje.
Ja ich hab den Code irgendwann nachts um 3 geschrieben, daher mein sinvolles variablen-geschubse. Danke @dago für deinen Tipp, so hab ichs gelöst und so gehts auch. Keine Ahnung, warum ich das nicht in erwägung gezogen habe..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 19:36 Nach oben    #16
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Ich meinde die Abfrage so ergänzen:
PHP-Code:
$this -> oModel -> query("SELECT
                                 identifier, text
                         FROM
                                 " 
DBPREFIX "language_" $this -> sLanguage "
                         WHERE
                                 identifier = '" 
$sNeededRows "
                         ORDER BY
                                 identifier ASC"
); 
Damit lässt sich nämlich leicht ein Array zusammen bauen, da der Array Key bei beiden der gleiche ist.

Inhalt des "identifier" Array's
Code:
Array
(
    ...
    [4] => loginbutton
    ...
)
Inhalt des "text" Array's
Code:
Array
(
    ...
    [4] => Einloggen
    ...
)
Dein Platzhalter Text hat somit die gleiche ID wie der einzufügene Text.

Jetzt klarer?

EDIT: Ok, dann hat es sich erledigt.

Geändert von dago (19.06.2006 um 19:39 Uhr)
dago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 20:22 Nach oben    #17
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Okay sehr schön das mit der Performance klappt auch. Für den kompletten Seitenaufbau über mein MVCModel bis hin zum kompletten geparsten View mit mehrern MySQLAbfragen brauch ich grad mal ~0.033 Sekunden .. Danke für eure Hilfe
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen