Wagenrücklauf und neue Zeile in PHP können nicht ersetzt werden

Lesezeit: 4 Minuten

Ich bekomme eine Zeichenfolge vom Frontend, die einen Zeilenumbruch enthält. Es wird in einem Array gespeichert, das so aussieht:

[address] => Array (
    [0] => Foo
Bar
)

Ich verwende dann json_encode() für das Array, bevor ich es in die SQL-DB schreibe:

$string = json_encode( $string, JSON_UNESCAPED_UNICODE );

Dadurch wird das Array zu:

{"address":["Foo\r\nBar"]}

Leider mag die Datenbank \r oder \n nicht, wenn sie nicht maskiert sind, also wird sie \r und \n los.

  1. Die erste Frage ist also, gibt es eine Funktion, mit der ich den String richtig maskieren kann, damit er richtig in die DB geschrieben werden kann, ohne den Zeilenumbruch zu verlieren?

  1. Ich habe keine Funktion dafür gefunden, also habe ich versucht, str_replace zu verwenden, um einfach das \r\n durch \\n zu ersetzen. Die Funktion ist:

$string = str_replace(["\r\n","\r","\n"], "\\n", $string);

Dies funktioniert jedoch nicht. Ich weiß nicht warum. Die Funktion selbst funktioniert, da ich versucht habe, nur “n” durch “bla” zu ersetzen, und es funktioniert hat. In dem Moment, in dem ich jedoch versuche, den Backslash zu ersetzen, wird nichts zum Ersetzen gefunden. Ich weiß nicht, ob hier ein “spezielles” Backslash-Zeichen verwendet wird oder was hier sonst noch los sein könnte.

Das macht mich wahnsinnig, ernsthaft. Daher hoffe ich, dass mir jemand weiterhelfen kann. Danke im Voraus.

  • Verwenden Sie einfach PDO und machen Sie sich keine Gedanken über all diese Dinge … im Ernst … es ist nicht schwer.

    – Dimi

    9. Februar 2017 um 20:47 Uhr

  • Wenn Sie verwenden str_replace Dinge zu entkommen, die Sie sind ES FALSCH MACHEN. Verwenden Sie eine geeignete Datenbank-Escape-Funktion. Dies hängt davon ab, welche Schnittstelle Sie verwenden. Es ist die absolut am wenigsten verwenden so etwas wie $db->escape(...). Es ist wesentlich besser, vorbereitete Anweisungen mit Platzhalterwerten zu verwenden. Diese funktionieren. Dein Code nicht.

    – Tadman

    9. Februar 2017 um 20:50 Uhr

  • Wenn Sie WordPress verwenden, lesen Sie die WPDB-Dokumentation für mehr Details.

    – Tadman

    9. Februar 2017 um 20:51 Uhr

  • Wie übergibst du die Daten an die Datenbank? Können Sie Ihren Code und die Ergebnisdaten posten, die nach der Ausführung Ihres Codes in der Datenbank gespeichert sind?

    – Umair Shah Yousafzai

    9. Februar 2017 um 21:23 Uhr

Benutzeravatar von Umair Shah Yousafzai
Umair Shah Yousafzai

Problem :
Dein str_replace funktioniert nicht, weil Sie verwenden Anführungszeichen.

Lösung :
Sie sollten Ihre ersetzen Anführungszeichen mit Einzelzitate und dann passiert die magie 😀

$string = str_replace(['\r\n','\r','\n'], '\\n', $string);

ZUSÄTZLICHE NÜTZLICHE INFORMATIONEN: Für mehr sollten Sie einen Blick auf die Details werfen, da es nützlich ist, den Unterschied zwischen kennen zu lernen Anführungszeichen und Einzelzitate wie:

Was ist der Unterschied zwischen Zeichenfolgen in einfachen und doppelten Anführungszeichen in PHP?

  • Vielen Dank, das hat funktioniert. Danke auch für die zusätzlichen Informationen, ich werde es lesen. Allerdings musste ich sogar 3 Backslashes verwenden, damit es funktionierte: $string = str_replace([‘\r\n’,’\r’,’\n’], ‘\\\n’, $string); Hast du eine Ahnung warum?

    – Chi

    9. Februar 2017 um 21:24 Uhr


  • Ich verstehe nicht, was Sie damit meinen, da es einfach nur das Ersetzen der Zeichen in der Zeichenfolge durch nur andere Zeichen ist, können Sie genauso gut alles bekommen, was Sie dort in die Zeichenfolge schreiben?

    – Umair Shah Yousafzai

    9. Februar 2017 um 21:27 Uhr


Es hängt davon ab, wie Sie den String in den DB einfügen. Wie auch immer Sie es tun, Sie müssen ihm richtig entkommen.

Wenn Sie PDO verwenden, können Sie dies folgendermaßen erreichen:

$conn = new PDO(.....);
$sql_str = $conn->quote($string);
$conn->exec("INSERT INTO table (str_value) {$sql_str}");

Oder verwenden Sie besser eine vorbereitete Anweisung:

$conn = new PDO(.....);
$stm = $conn->prepare("INSERT INTO table (str_value) :value");
$stm->execute(array(':value' => $string));

Hoffe das funktioniert.

JSON direkt in einer Datenbank speichern? Yeuch!

Aber wenn Sie es wirklich tun müssen, warum haben Sie dann das Bedürfnis, die Darstellung der Daten zu ändern? Wenn Sie es durch einen JSON-Decoder zurückführen, erhalten Sie die ursprünglichen Daten zurück. Das Problem besteht nur darin, wie Sie es in ein sicheres Format bringen, um es in Ihre Datenbank einzufügen.

Dass Sie dies aus einem PHP-Array erstellt haben, impliziert, dass Sie KEINE ENTSCHULDIGUNG dafür haben, den Inhalt der Daten vor dem Speichern nicht zu überprüfen (nicht, dass das Schreiben von Daten, die direkt von Javascript geliefert werden, in irgendeiner Weise gültig oder verzeihlich ist).

Gibt es eine Funktion, die ich verwenden kann, um die Zeichenfolge richtig zu entkommen

Ja, es gibt mehrere – aber Sie haben uns nicht mitgeteilt, welche API Sie verwenden. Dies ist kein magischer Trick, um das Problem zu lösen, in dem Sie sich derzeit befinden – das ordnungsgemäße Escapen aller Daten, die Sie in Ihre Datenbank schreiben, ist unerlässlich, um eine SQL-Injektion zu verhindern.

Zusätzlich zu den von Alex erwähnten PDO-Methoden können Sie dies in der (veralteten) mysql-Erweiterung mit tun mysql_escape_string/mysql_real_escape_string oder im mysqli-Prozedurcode mit mysql_escape_string / mysqli_real_escape_string oder msqli_prepare + mysqli_bind_param. Die mysqli-Funktionen haben auch objektorientierte Darstellungen.

1427200cookie-checkWagenrücklauf und neue Zeile in PHP können nicht ersetzt werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy