Ein Kunde hatte das Problem, dass scheinbar falsche Symbole für Zeilenbrüche aus seiner Datenbank geliefert wurde. Er beklagte sich, der PHP-Befehl nl2br(string) würde nicht wie erwartet funktionieren.
Eine Nachschau der Daten ergab, dass nicht wie erwartet "\n" in der Datenbank stand sondern "\\n". Klar, da konnte nl2br() natürlich nicht sein Werk tun.
Das PHP-Skript, welches für den Eintrag der Daten in die Datenbank genutzt wurde, sah (stark verkürzt) wie folgt aus:
$value=mysql_real_escape_string($_REQUEST['value']); [...] $sql='SELECT `spalte` FROM `tabelle` WHERE `spalte`=="' . mysql_real_escape_string($value) .'"';
Das war genau einmal "mysql_real_escape_string()" zu viel. Vermutlich hatte der Programmierer zunächst am Beginn des Skriptes den Befehl verwendet um die Daten für MySql sicher zu machen und später ist ihm oder einem anderen aufgefallen, dass an der Stelle, wo die SQL-Anweisung zusammengebastelt wird, das Escapen nicht stattfindet. Er hat es mit dem Gedanken an ein vermutetes Sicherheitsproblem "rasch nachgetragen".
Vermutlich wollte der Programmierer ursprünglich das die Zeile, in welcher die SQL-Anweisung "gebaut" wird, nicht zu lang wird, denn auch diese habe ich Beispielcode stark verkürzt. Dabei ist es aber die bessere und einfachere Idee, genau diese "Befehlszeile" einfach auf mehrere Zeilen zu verteilen:
$sql=' SELECT `spalte` FROM `tabelle` WHERE `spalte` == "' . mysql_real_escape_string($_REQUEST['value']) .'"';
Das sieht gut aus, ist übersichtlich und es funktioniert auch. Das "mysql_real_escape_string()" gehört genau diese Stelle und nur dorthin - wenngleich es anderswo zunächst einmal funktioniert... Die endgültige Lösung ist also, sich einen guten Programmierstil anzugewöhnen.