Hallo,
entwickle momentan eine webbasierte medizinische Datenbank.
Als Datenbank-Abstraktions-Layer kommt Propel zum Einsatz, zur Darstellung der Daten im Browser setze ich auf extjs.
Zum Abwickeln der Datenbankanfragen von extjs an Propel entwickle ich gerade einen 'dataproxy', der die POST-Daten von extjs auswertet, dementsprechend eine DB-Anfrage an Propel stellt und die Daten in entsprechender Form aufbereitet wieder zurücksendet.
Spezifisch auf einen speziellen Fall bezogen, funktioniert das soweit auch wunderbar, nun will ich aber diesen Dataproxy soweit abstrahieren, dass ich nicht für jede mögliche Anfrage- und Sortiermöglichkeit das entsprechende Gegenstück abbilden muss, sondern dieses durch eine entsprechende Generalisierung selbst geschieht.
Konkret bedeutet das: Fallspezifisch habe ich beispielsweise folgenden Code in meinem Dataproxy:
Code:
if(!is_null($_POST['dir'])){
if($_POST['dir']=="ASC"){
$crit->addAscendingOrderByColumn(PatientenPeer::VORNAME);
}
else {
$crit->addDescendingOrderByColumn(PatientenPeer::VORNAME);
}
}
Dieses Vorgehen würde bedeuten, ich muss für jede Spalte und jede Sortierrichtung alle Fälle abdecken und ein gewaltiges Konstrukt bauen, dass alle diese Fälle abdeckt.
Meine Idee war es nun, VORNAME durch das entsprechende POST-Feld (ich weiß, ich sollte an dieser Stelle auf SQL-Injection-Probleme achten...) zu ersetzen, so dass z.B.:
Code:
$crit->addDescendingOrderByColumn(PatientenPeer::strtoupper($_POST['sort']));
aufgerufen wird und ich obiges Konstrukt in wenigen Zeilen für alle vorhandenen Tabellen anwenden kann.
Da bei dieser Schreibweise aber $_POST als String-Konstante ausgewertet wird, musste ich hier einen kleinen Umweg über Variablen-Funktionen gehen:
Code:
$tmpvar=strtoupper($_POST['sort']);
$crit->addDescendingOrderByColumn(PatientenPeer::$tmpvar());
Theoretisch funktioniert dieser Weg auch, dummerweise scheint PHP aus dem eigentlich kompletten UPPERCASE-String einen kompletten lowercase-String zu machen:
Code:
Call to undefined method PatientenPeer::vorname()
Folgendes hart kodiertes Beispiel verdeutlicht das:
Code:
$tmpvar="VORNAME";
$crit->addAscendingOrderByColumn(PatientenPeer::$tmpvar());
Auch hier sieht das Ergebnis wieder so aus:
Code:
Call to undefined method PatientenPeer::vorname()
Mit folgendem kurzem Codebeispiel konnte ich das Verhalten nicht reproduzieren:
Code:
<?php
class TestClass{
public function TEST(){
echo "Hallo Welt";
}
}
$tmpvar="TEST";
TestClass::$tmpvar();
?>
Weiß jemand, was hier schief läuft? Hat jemand andere Ansätze zu dem Problem oder eine Lösung, warum der Uppercase-String zu Lowercase umgewandelt wird?
Vielen Dank & Gruß,
Elias P.
Lesezeichen