php中不能替换回车和换行

2 人关注

我从前台得到一个字符串,其中有一个换行符。它被保存在一个数组中,看起来像这样。

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

然后我在把数组写入SQL数据库之前,在数组上使用json_encode()。

$string = json_encode( $string, JSON_UNESCAPED_UNICODE );

这就把数组变成了。

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

不幸的是,数据库不喜欢没有转义的 \r 或 \n,所以它摆脱了 \r 和 \n。

  • 因此,第一个问题是,是否有一个函数可以用来正确地转义字符串,以便它可以正确地写入DB而不丢失换行符?
  • 我没有找到任何相关的函数,所以我试着用str_replace来直接用\n替换\r\n。这个函数是
  • $string = str_replace(["\r\n","\r","\n"], "\\n", $string);

    然而这并不奏效。我不知道为什么。这个函数本身是有效的,因为我试着用 "bla "替换 "n",它也有效。然而,当我试图替换反斜杠的时候,它却找不到任何东西可以替换。我不知道这里是否使用了一些 "特殊 "的反斜杠字符,或者是其他什么原因。

    这让我发疯了,真的。所以我希望有人能帮助我。请提前感谢。

    4 个评论
    Dimi
    只要使用PDO就可以了,不用担心这些事情......说真的,这并不难。
    如果你使用 str_replace 来转义,你就做错 。使用适当的数据库转义函数。这取决于你使用的是哪种接口。至少要使用 $db->escape(...) 这样的函数。使用带有占位符值的准备语句会好得多。这些是有效的。你的代码不会。
    如果你使用的是WordPress,请参阅 WPDB文档 了解更多细节。
    你是如何将数据传递给数据库的?你能公布你的代码和执行代码后存储在数据库中的结果数据吗?
    php
    mysql
    sql
    json
    wordpress
    Chi
    Chi
    发布于 2017-02-10
    3 个回答
    Umair Shah Yousafzai
    Umair Shah Yousafzai
    发布于 2017-02-10
    已采纳
    0 人赞同
    你的 str_replace 不起作用,因为你使用的是 双引号

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

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

    额外有用的信息:对于更多的细节,你应该看一下,因为了解双引号单引号的区别是很有用的。

    在PHP中单引号和双引号字符串的区别是什么?

    Chi
    非常感谢你,这很有效。也感谢你提供的额外信息,我将会阅读它。但是,我必须使用3个反斜线才行:$string = str_replace([''r\n',''r',''\n'], '\\n', $string); 你有什么想法吗?
    我不明白你的意思,因为它只是简单地将字符串中的字符替换成另一个字符,你可能会得到任何你写在字符串中的东西?
    Alex Schenkel
    Alex Schenkel
    发布于 2017-02-10
    0 人赞同

    这取决于你如何将字符串插入到DB中。不管你怎么做,你都需要正确地转义它。

    如果你使用PDO,你可以这样实现。

    $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));
    

    希望这能发挥作用。

    symcbean
    symcbean
    发布于 2017-02-10
    0 人赞同

    直接在数据库中存储JSON?呀!

    然而,如果你真的必须这样做,那么你为什么觉得有必要改变数据的表现形式?当你通过JSON解码器运行时,你将会得到原始数据。问题只是如何把它变成一个安全的格式,以便插入到你的数据库中。

    你从一个PHP数组中创建了这个数据,这意味着你在保存数据之前没有检查数据的内容是没有任何借口的(并不是说直接从Javascript中写出的数据是有效的或可以原谅的)。