MYSQLi真正的转义函数显示新行和回车

时间:2013-02-09 08:18:37

标签: php mysqli

我有一个文本区域,当我尝试通过MYSQLi的real_escape函数和nl2br进行转义和清理时,只需输出就会给我带来奇怪的结果。

我的PHP代码:

 <?php
 $db = new mysqli('localhost', 'user', 'pass', 'demo');

 if($db->connect_errno > 0){
 die('Unable to connect to database [' . $db->connect_error . ']');
 }

 $postText = nl2br($db->escape_string($_POST['posting']));
  ?>

奇数输出为:

 i love this\r\n\r\nand this is gonna be funn.,

奇怪的是,当我只使用nl2br而没有real_escape时,输出正常,显然无法继续前进,因为我无法信任用户的输入。

请帮忙...

2 个答案:

答案 0 :(得分:2)

当输出将用于SQL查询时,您应该只应用SQL转义。

  • 如果您需要将值输出到网页上,请使用htmlspecialchars()htmlentities()

  • 如果要在JavaScript文字中使用,请使用json_encode()

简而言之,每个环境都有自己的逃避;不要混淆它们。

此外,将nl2br()写入数据库时​​请勿使用{{1}};相反,在从数据库中获取它之后应用它。

答案 1 :(得分:0)

是的,确实如此 此功能的输出不打算打印出来。但是只格式化SQL字符串文字 请注意,此功能不打算“清理”任何输入。请refer here for the details

所以,你永远不应该同时使用这两个功能。

  • 使用escape_string格式化您要动态查询的SQL字符串。
  • 仅在将文本打印到HTML页面时使用nl2br

根据你在评论中提出的问题,当你必须立即打印字符串时,不应该出现这种情况 因为在每次POST请求之后,您的PHP都应该使用Location:标头响应,以告知浏览器重新加载页面。重新加载后,您可以从数据库中读取数据并将其打印出来。