无法在php中替换回车符和新行

无法在php中替换回车符和新行,php,mysql,sql,json,wordpress,Php,Mysql,Sql,Json,Wordpress,我从前端得到一根线,它有一个断线。它保存在一个数组中,如下所示: [address] => Array ( [0] => Foo Bar ) $conn = new PDO(.....); $sql_str = $conn->quote($string); $conn->exec("INSERT INTO table (str_value) {$sql_str}"); 然后在将数组写入SQL DB之前,我在数组上使用json_encode() $string

我从前端得到一根线,它有一个断线。它保存在一个数组中,如下所示:

[address] => Array (
    [0] => Foo
Bar
)
$conn = new PDO(.....);
$sql_str = $conn->quote($string);
$conn->exec("INSERT INTO table (str_value) {$sql_str}");
然后在将数组写入SQL DB之前,我在数组上使用json_encode()

$string = json_encode( $string, JSON_UNESCAPED_UNICODE );
这会将阵列转换为:

{"address":["Foo\r\nBar"]}
不幸的是,DB不喜欢\r或\n if not escape,因此它会删除\r和\n

  • 第一个问题是,有没有一个函数可以用来正确地转义字符串,这样就可以在不丢失换行符的情况下将其正确地写入DB

  • 我没有找到任何函数,所以我尝试使用str\u replace将\r\n替换为\\n。功能是:
  • $string=str\u replace([“\r\n”、“\r”、“\n”]、“\\n”、$string)

    然而,这是行不通的。我不知道为什么。函数本身是有效的,因为我试图用“bla”替换“n”,结果它成功了。然而,当我试图替换反斜杠时,它没有找到任何可替换的内容。我不知道这里是否使用了一些“特殊”的反斜杠字符,或者这里可能会发生什么


    说真的,我快发疯了。所以我希望有人能帮我。提前感谢。

    这取决于如何将字符串插入数据库。不管你怎么做,你都需要正确地逃避它

    如果您使用PDO,您可以这样实现:

    [address] => Array (
        [0] => Foo
    Bar
    )
    
    $conn = new PDO(.....);
    $sql_str = $conn->quote($string);
    $conn->exec("INSERT INTO table (str_value) {$sql_str}");
    
    或者,最好使用事先准备好的声明:

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

    问题: 您的
    str\u replace
    无效,因为您使用的是双引号

    解决方案: 你应该用单引号替换你的双引号,然后神奇的事情就会发生:D

    $string = str_replace(['\r\n','\r','\n'], '\\n', $string);
    
    额外有用信息:有关更多信息,您应该查看详细信息,因为了解双引号和单引号之间的区别非常有用,如下所示:


    直接在数据库中存储JSON?耶

    然而,如果您真的必须这样做,那么为什么您觉得需要更改数据的表示形式呢?当您通过JSON解码器运行它时,您将获得原始数据。问题只是如何将其转换为安全的格式,以便插入到数据库中

    您从PHP数组创建了它,这意味着您没有理由在保存数据之前不检查数据的内容(并不是说直接从Javascript编写数据是有效的或可以原谅的)

    是否有一个函数可以用来正确地转义字符串

    是的,有几种,但您没有告诉我们您使用的是哪种API。这并不是解决您当前遇到的问题的神奇诀窍——正确地转义写入数据库的任何数据对于防止SQL注入至关重要


    除了Alex提到的PDO方法外,您还可以在(不推荐使用的)mysql扩展中使用/或在mysqli过程代码中使用/或+。mysqli函数也有面向对象的表示。

    只需使用PDO,不必担心这些事情。。。认真地这并不难。如果你用
    str\u replace
    来逃避你做错了的事情。使用适当的数据库转义函数。这取决于您使用的接口。它绝对不会使用像
    $db->escape(…)
    这样的东西。将准备好的语句与占位符值一起使用要好得多。这些工作。您的代码没有。如果您使用的是WordPress,请参阅以了解更多详细信息。您如何将数据传递到数据库?你能在执行代码后发布你的代码和存储在数据库中的结果数据吗?非常感谢,这很有效。也谢谢你提供的额外信息,我将阅读它。但是,我甚至必须使用3个反斜杠才能工作:$string=str\u replace(['\r\n','\r','\n'],'\\\n',$string);你知道为什么吗?我不明白你这么说是什么意思,因为它只是简单地用另一个字符替换字符串中的字符,你也可以得到你在那里写的任何东西,然后输出到字符串中?