Veröffentlicht 28. März 200619 j hi, folgendes: in einem meiner Scripte entsteht halb-dynamisch ein SQL-Statement also select feld from table where ... bevor es jedoch an die Datenbank geht, muss das, was die Anwendung generiert gemappt werden. es kann z.B. sein, das da steht: select * from mitarbeiter where Name = 'Mustermann' dann muss es gemappt werden zu: select * from mitarbeiter where m_Nachname = 'Mustermann' ich habe dazu ein Mapping, z.b. als Array "Name" => "m_Nachname" ... etz. nun habe ich bisher ein einfaches Str_replace benutzt...problem: wenn ich: "Vorname" => "m_Vorname" "Name" => "m_Nachname" select * from mitarbeiter where Vorname = 'Mustermann' könnte theoretisch auch select * from mitarbeiter where m_Vorm_Nachname = 'Mustermann' rauskommen, da er das bereits ersetzte nochmal findet. ein split() geht nicht, da das where ja auch komplizierter sein kann, (a and or (c or d and e) irgend eine idee ? , ein regulärer ausdruck vielleicht ? danke
28. März 200619 j select * from mitarbeiter where Name = 'Mustermann' wie kann das passieren, wenn du das select * from mitarbeiter where m_Nachname = 'Mustermann' haben willst ? Kannst du mir bitte das erklären ?
28. März 200619 j hm, regexp ist sicher sinnvoll, vor allem was machst Du wenn jemand mit Nachnamen "Kname" heißt? Andere Lösung wäre die Textstrings die Du ersetzen willst, immer in Sonderzeichen einzupacken wie z.B. %Name%
28. März 200619 j baba, ich ersetzte die Feldnamen im String. vash....ja das wäre eine idee...mal grübeln
28. März 200619 j ja und ? ersetze doch was du willst, deine Vorgabe im Skript ist m_Nachname und fertig. wie kommt man da auf Name ? oder darf der benutzer selber eintragen wie die Spalten zu heissen haben in deiner DB ?
28. März 200619 j Ansonsten würde in PHP wohl sowas gehen... <? $Query = "SELECT * FROM table WHERE field1 = 4 AND field7 LIKE '%foo%'"; list($Select, $Where) = split("WHERE",$Query); $Pattern = "/(\w+)(\s*(=|LIKE)\s*)([^ ]+)/"; $Replace = "m_$1$2$4"; $NewWhere = preg_replace($Pattern, $Replace, $Where); echo $Select."WHERE".$NewWhere."\n"; ?> [/php] [code] > php5 -q regex.php SELECT * FROM table WHERE m_field1 = 4 AND m_field7 LIKE '%foo%' [/code] \w+ Muß natürlich für die Feldbezeichner angepasst werden. Ich gehe hier nur von Worten aus. Ich berücksichtige nur "=" und "LIKE" Operationen. Außerdem gehen nur gleichförmige Umwandlungen (FELDBEZEICHNER -> m_FELDBEZEICHNER), nicht mal so und mal anders.
28. März 200619 j es geht um eine Anwendung die aus mehreren Schichten besteht. Der Programmierer der an der einen Schicht arbeitet (darstellungsschicht) hat keine Ahnung wie die Felder in der Datenbank heißen, er weis nur wie die Attribute im Entity-Relationship-Diagramm aussehen. Da es sein kann das mehrere Anwendungen auf die gleichen tabellen zugreifen, aber je nach Entwicklungsstand und anwendungsgebiet die Entitäten anders definiert haben, gibts da schonmal abweichungen. daher trifft auch nur "m_" nicht zu. Es gibt jeweils ein "code" => "Datenbank" für jedes Attribut.
29. März 200619 j Dafür wird es kein Regex geben. Die Interfaces zwischen den Programmierern der einzelnen Schichten hätten bereits vor dem Projekt geklärt werden müssen.
29. März 200619 j ^^ es geht um eine ständige Weiterentwicklung, nicht um die Verwendung in einem speziellen Projekt. Ich habe schon zuvor mal ein ähnliches Regexp für ein Template-System gesehen, das werde ich mir wohl nochmal ansehen.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.