SQL Replace nur am Anfang anwenden

CoverUnder

Mitglied
Hallo,

ich habe Telefonnummern in einer MySQL Datenbank gespeichert. Da möchte ich nun die Vorwahl in Klammer setzen.

Zum Beispiel steht da aktuell:
"1234 5678912"
Dann soll da nun "(1234) 5678912" stehen.

Da es aber sein kann, dass eine Telefonnummer durch Zufall die Vorwahl auch in der Mitte enthält, also zb so aussieht: "1234 4612345", möchte ich die Klammer wirklich nur am Anfang setzen.

Sonst hätte ich es nämlich so gelöst (direkt über PHPMyAdmin):
PHP:
UPDATE tabelle SET nummer = REPLACE(nummer,' 1234','(1234)')

Leider hänge ich da nun... hat jemand eine Idee, wie das möglichst einfach zu lösen ist?

Lässt sich das vielleicht irgendwie mittels Platzhalter lösen? Ich kann bei PHPMyAdmin in der Suche ja auch nach 1234% suchen und er spuckt mir alle Nummern aus, die den Wert am Anfang enthalten... lässt sich das irgendwie auf Replace umlegen?

Vielen Dank schonmal!
 
Also erstmal, wie kann etwas durch Zufall in der Datenbank sein? Beim Validieren der Eingaben geschlampt?

Dann wäre die Frage, sind die Daten bereits in der Datenbank so oder geht es dir darum, das in Zukunft durch PHP besser zu lösen?

Problematisch ist, das es Vorwahlen mit unterschiedlicher Länge gibt. Woher soll SQL wissen, was denn nun zur Vorwahl gehört und was nicht?

Meiner Meinung nach kannst du das eigentlich nur so lösen: Besorge dir eine Vorwahlendatenbank und klopfe sie in deine Datenbank. Schreibe dir eine Stored Procedure, die alle Vorwahlen auf deine Telefonnummer anwendet (oder umgekehrt ist evtl. sinnvoller).

Dabei kann dir eine UDF von Hartmut Holzgräfe helfen: https://launchpad.net/mysql-udf-regexp
 
Also erstmal, wie kann etwas durch Zufall in der Datenbank sein? Beim Validieren der Eingaben geschlampt?
Nein du verstehst mich glaube ich falsch. Eine Telefonnummer kann ja auch zufällig die Zahlen einer Vorwahl enthalten. Beispiel die Vorwahl 0664 -> es gibt sicher Telefonnummern, die das auch in der Mitte enthalten. Und da soll ja dann keine Klammer rum, sondern nur um die wirkliche Vorwahl, die am Anfang steht.

Problematisch ist, das es Vorwahlen mit unterschiedlicher Länge gibt. Woher soll SQL wissen, was denn nun zur Vorwahl gehört und was nicht?
In dem ich die Vorwahl angebe, wie zb bei "UPDATE tabelle SET nummer = REPLACE(nummer,' 1234','(1234)')" - mein Problem liegt nur darin, dass die Klammern nur am Anfang dazu kommen sollen und nicht in der Mitte... Replace ersetzt aber einfach alles, egal wo die Zahlen stehen. Da käme dann (1234) 4853300 genauso raus wie (1234) 832(1234)42
 
In dem ich die Vorwahl angebe, wie zb bei "UPDATE tabelle SET nummer = REPLACE(nummer,' 1234','(1234)')" - mein Problem liegt nur darin, dass die Klammern nur am Anfang dazu kommen sollen und nicht in der Mitte... Replace ersetzt aber einfach alles, egal wo die Zahlen stehen. Da käme dann (1234) 4853300 genauso raus wie (1234) 832(1234)42

Nun denn, dann helfen dir Reguläre Ausdrücke. Entweder du löst das in PHP, dann müsstest du alle Telefonnummern und IDs (du hast doch IDs in der Tabelle?) selektieren, mit PHP preg_replace() ersetzen und dann zurück schreiben.

Oder du verwendest die vorgeschlagenen UDF.

Mit PHP gehts wahrscheinlich problemloser und schneller zu coden als die UDF zu bauen und zu intergrieren. Dafür wirds in PHP aber langsamer sein. Was ist dir lieber?

Ich würde für diese einmalige Sache PHP verwenden.

Hast du PDO? Kannst du die Tabellenstruktur posten?
 
Ich glaube ich löse es wie du vorschlägst mittels PHP und habe mir jetzt diesen Ansatz überlegt:

Ich habe alle Vorwahlen, um die es hier geht, in einem String, den ich mittels explode in ein Array umwandeln möchte. Also so:
PHP:
$vorwahlen = "0123,0234,0345,0456,0567";
$vorwahlen = explode (","$vorwahlen);

Die Telefonnummer sind in der Datenbank aktuell in diesem Format gespeichert:
+49 012345678
Und so sollen sie anschließend aussehen:
+49 (0123) 45678

Damit die Vorwahl wirklich nur zu Beginn mit Klammern versehen wird, dachte ich daran, nach "+49 Vorwahl" zu suchen und durch "+49 (Vorwahl)" zu ersetzen. +49 ist immerhin eindeutig, kommt nur einmal in jeder Telefonnummer am Anfang vor und ist mittels einem Leerzeichen vom Rest der Nummer getrennt. So kann es nicht passieren, dass am Ende eine Telefonnnummer so aussieht: +49 (0123)3(0123)5

Um das umzusetzen dachte ich an str_replace, ich glaube das sollte reichen. Oder brauche ich dafür schon preg_replace? Ich glaube nicht...

PHP:
Datenbankabfrage SQL SELECT mit While Schleife {

$telefon = $row['telefon'];

$telefon=str_replace("+49 $vorwahlen","+49 ($vorwahlen)",$telefon);

SQL INSERT telefon = $telefon WHERE id = $id

}

Soviel zur Theorie. Klingt das plausibel?
Um ehrlich zu sein zweifel ich schon an wenig, ob diese Zeile:

PHP:
$telefon=str_replace("+49".$vorwahlen","+49 ($vorwahlen)",$telefon);

wirklich funktioniert. Wird dann wirklich immer die richtige Vorwahl mit Klammer eingesetzt? Ich glaube nicht? Ich befürchte eher, dass dann immer die erste Vorwahl im Array mit Klammern eingesetzt wird. Muss ich dann das Array irgendwie näher definieren?

Vielen Dank schon mal!
 
Zurück