无法替换 php 中的回车符和换行符

Posted

技术标签:

【中文标题】无法替换 php 中的回车符和换行符【英文标题】:Cannot replace carriage return and new line in php 【发布时间】:2017-06-28 01:00:55 【问题描述】:

我从前端得到一个字符串,其中有一个换行符。它保存在一个数组中,如下所示:

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

然后我在将数组写入 SQL DB 之前对数组使用 json_encode():

$string = json_encode( $string, JSON_UNESCAPED_UNICODE );

这会将数组变成:

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

不幸的是,如果没有转义,DB 不喜欢 \r 或 \n,因此它摆脱了 \r 和 \n。

    所以第一个问题是,有没有一个函数可以用来正确地转义字符串,从而可以在不丢失换行符的情况下正确地写入数据库?

    我没有找到任何功能,所以我尝试使用 str_replace 将 \r\n 替换为 \\n。功能是:

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

但这不起作用。我不知道为什么。该函数本身有效,因为我尝试仅用“bla”替换“n”并且它有效。但是,当我尝试替换反斜杠时,它找不到任何要替换的东西。我不知道这里是否使用了一些“特殊”反斜杠字符,或者这里可能发生了什么。

这让我发疯了,说真的。所以我希望有人可以帮助我。提前致谢。

【问题讨论】:

使用 PDO 就可以了,不用担心这些事情……说真的……不难。 如果您使用str_replace 来逃避事情,那么您做错了。使用适当的数据库转义功能。这取决于您使用的接口。它绝对最少使用$db->escape(...) 之类的东西。使用带有占位符值的准备好的语句要好得多。这些工作。你的代码没有。 如果您使用的是 WordPress,请参阅WPDB documentation 了解更多详情。 如何将数据传递到数据库?你能把你的代码和执行代码后存储在数据库中的结果数据贴出来吗?? 【参考方案1】:

问题: 您的 str_replace 不起作用,因为您使用了双引号

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

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

额外有用的信息:您应该查看详细信息,因为了解双引号单引号 为:

What is the difference between single-quoted and double-quoted strings in php?

【讨论】:

非常感谢,这有效。还要感谢您提供的额外信息,我将阅读它。但是,我必须使用 3 个反斜杠才能使其工作: $string = str_replace(['\r\n','\r','\n'], '\\\n', $string);你知道为什么吗? 我不明白你的意思是什么,因为它只是用另一个字符替换字符串中的字符,你也可以得到你在字符串中输出的任何内容? 【参考方案2】:

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

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

您是从 PHP 数组创建的,这意味着您没有理由在保存数据之前不检查数据的内容(并不是说直接从 javascript 提供的写入数据在任何方面都是有效的或可以原谅的)。

有没有可以用来正确转义字符串的函数

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

除了 Alex 提到的 PDO 方法之外,您还可以在(已弃用的)mysql 扩展中使用 mysql_escape_string/mysql_real_escape_string 或在 mysqli 程序代码中使用 mysql_escape_string / mysqli_real_escape_string 或 msqli_prepare + mysqli_bind_param。 mysqli 函数也有面向对象的表示。

【讨论】:

【参考方案3】:

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

如果您使用的是 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));

希望有效。

【讨论】:

以上是关于无法替换 php 中的回车符和换行符的主要内容,如果未能解决你的问题,请参考以下文章

如何替换SQL字段中的换行符,回车符

Java字符代码中干掉制表符回车符和换行符

关于C语言中的换行符和回车符

删除带引号字符串中的回车符和换行符

在sql server 数据库字段中如何加入回车符和换行符?

Java 中的空格符、换行符等怎么表示