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

时间:2017-02-09 20:44:51

标签: php mysql sql json wordpress

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

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

然后我在数组上使用json_encode(),然后将其写入SQL DB:

$string = json_encode( $string, JSON_UNESCAPED_UNICODE );

这会将数组转换为:

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

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

  1. 所以第一个问题是,是否有一个函数可以用来正确地转义字符串,所以它可以正确地写入数据库而不会丢失换行符?
    1. 我没有找到任何功能,所以我尝试使用str_replace只用\\ n替换\ r \ n。功能是:
    2. $string = str_replace(["\r\n","\r","\n"], "\\n", $string);

      然而,这不起作用。我不知道为什么。功能本身有效,因为我试图仅替换" n"与" bla"它起作用了。但是,当我尝试更换反斜杠时,它没有找到任何要替换的东西。我不知道是否有些特殊的"这里使用反斜杠字符,或者在这里可能会发生什么。

      这让我疯狂,认真。所以我希望有人可以帮助我。提前谢谢。

3 个答案:

答案 0 :(得分:2)

问题: 由于您使用的是双引号,因此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?

答案 1 :(得分:0)

这取决于您如何将字符串插入数据库。无论如何,你需要正确地逃避它。

如果你正在使用PDO,你可以这样做:

.box { 
  border: 1px solid red;
  width: 20px;
  height: 20px;

  margin: 40px auto;
}

.box .first-wrap {
  display: block;
  width: 0px;
  margin: 0 auto;
  border: 1px solid blue;
}

.box .first-wrap .second-wrap {
  display: inline-block;
  white-space: nowrap;
  width: auto;
  border: 1px solid green;
}

.box .first-wrap .second-wrap .third-wrap {
  position: relative;
  left: -50%;
  border: 1px solid black;
}

或者,更好地使用准备好的声明:

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

希望有效。

答案 2 :(得分:0)

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

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

你是从PHP数组创建的,这意味着在保存数据之前没有检查数据内容是没有的(不是直接从Javascript提供的写入数据是有效或可原谅的)。< / p>

  

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

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

除了Alex提到的PDO方法之外,你可以使用mysql_escape_string / mysql_real_escape_string在(不推荐使用的)mysql扩展中或使用mysql_escape_string / {{的mysqli过程代码中执行此操作。 3}}或mysqli_real_escape_string + msqli_prepare。 mysqli函数也有面向对象的表示。