3

我有一个文本区域,当我尝试通过 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.,

奇怪的是,当我只使用nl2brwithout时real_escape,输出很好,显然无法继续前进,因为我无法信任用户的输入。

请帮忙解决这个..

4

2 回答 2

2

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

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

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

  • 等等。

简而言之,每个上下文都有自己的转义;不要把它们混在一起。

nl2br()另外,写入数据库时​​不要使用;而是在从数据库中获取它之后应用它。

于 2013-02-09T08:26:19.450 回答
0

是的,它确实。
此函数的输出不打算打印出来。但仅格式化 SQL 字符串文字。
请注意,此功能也不打算“清理”任何输入。详情请参考这里

所以,你不应该同时使用这两个函数。

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

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

于 2013-02-09T08:21:22.867 回答