我从前端得到一个包含换行符的字符串。它保存在一个如下所示的数组中:
[address] => Array (
[0] => Foo
Bar
)
然后我在数组上使用json_encode(),然后将其写入SQL DB:
$string = json_encode( $string, JSON_UNESCAPED_UNICODE );
这会将数组转换为:
{"address":["Foo\r\nBar"]}
不幸的是,如果没有转义,数据库不喜欢\ r或\ n,所以它摆脱了\ r和\ n。
$string = str_replace(["\r\n","\r","\n"], "\\n", $string);
然而,这不起作用。我不知道为什么。功能本身有效,因为我试图仅替换" n"与" bla"它起作用了。但是,当我尝试更换反斜杠时,它没有找到任何要替换的东西。我不知道是否有些特殊的"这里使用反斜杠字符,或者在这里可能会发生什么。
这让我疯狂,认真。所以我希望有人可以帮助我。提前谢谢。
答案 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函数也有面向对象的表示。