dedlfix: WHERE in PHP

Beitrag lesen

Tach!

Ich habe Telefonnummern die unterschiedlich eingetragen wurden:
Gibt es eine PHP Funktion wo ich diese Daten bei der suche in ein Format bringen kann um den Eintrag zu finden, egal wie er geschrieben ist?

Nein. PHP kann ja nicht hellsehen, in welchem Format die Daten im DBMS stehen. Schon gar nicht, wenn jeder Datensatz unterschiedlich formatiert ist. Das Problem ist nicht mit PHP lösbar (jedenfalls nicht gescheit). Du solltest die Lösung im DBMS suchen, wie schon mehrfach empfohlen. Mit PHP musst du lediglich die Nutzereingaben aus dem Such-Feld gleichermaßen normalisieren, also beispielsweise für die erste der gleich folgenden Variante ebenfalls alle Nicht-Ziffern entfernen.

Eine Variante wäre, mit REPLACE() die Leerzeichen zu entfernen. Das muss gegebenenfalls auch noch mit anderen Zeichen geschehen.

WHERE REPLACE(REPLACE(telNummer, ' ', ''), '-', '') = '08154711'

Sieht umständlich aus, ist es auch - besonders wenn noch weitere Zeichen hinzukommen. MySQL kennt kein Ersetzen mit regulären Ausdrücken, das würde die Sache vereinfachen.

De nächste Variante wurde schon vorgeschlagen: LIKE. Wobei wohl RLIKE besser wäre. Zwischen jede Ziffer (auch vorn und hinten) müsste ein Jokerzeichen stehen, das beliebige Nicht-Ziffern zulässt (oder alternativ eine ausgewählte Anzahl Sonderzeichen "-+() "). Auch diese Variante ist nicht sehr toll. PHP kann dir lediglich beim Zusamenstückeln des Suchausdrucks helfen.

Beide Varianten haben aber den Nachteil, dass ein Index nicht mehr zur Suche verwendet werden kann. Gut, das wird bei der anzunehmenden Anzahl der Datensätze nicht ins Gewicht fallen, aber ich wollte es nur mal erwähnt haben.

Die beste Variante wäre, ein weiteres Feld einzufügen, das die Nummer im normalisierten Format aufnimmt, also nur die Ziffern. Dann ist diese Information zwar redundant, aber manchmal muss das so sein, damit man sich das Leben erleichtern kann.

Die Abfrage ist dann ganz einfach. Aber wie bekommt man die Nummer normalisiert? Nun, für die bestehenden Daten einmal UPDATE drüberlaufen lassen, mit dem REPLACE() die Nicht-Ziffern rauswerfen. Wenn neue Daten hinzugefügt werden, dann kann das INSERT ein weiteres Feld mit der normalisierten Form einfügen. Die kann/muss dann von PHP erzeugt werden. Kommen die Daten auf anderem Wege in das DBMS, dann ist es günstiger, dass sich ein Insert-Trigger um das Zweitfeld kümmert. Gegebenenfalls muss auch noch einer für Updates hinzugefügt werden.

dedlfix.