Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[PHP] SQL-Mapping per Reqular expression ?

Empfohlene Antworten

Veröffentlicht

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 B) or (c or d and e)

irgend eine idee ? , ein regulärer ausdruck vielleicht ?

danke

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 ?

hm, regexp ist sicher sinnvoll, vor allem was machst Du wenn jemand mit Nachnamen "Kname" heißt? :D

Andere Lösung wäre die Textstrings die Du ersetzen willst, immer in Sonderzeichen einzupacken wie z.B. %Name%

baba, ich ersetzte die Feldnamen im String.

vash....ja das wäre eine idee...mal grübeln

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 ? :rolleyes:

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.

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.

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.

^^ 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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.