将文本区域保存到MySQL并保留换行符

4

想象一个博客或CMS系统(PHP和MySQL)。我想让用户在文本区域中输入一些文本并将其保存到数据库中。数据库中的字段类型为TEXT。

我想保留换行符并稍后打印它们。我知道可以使用PHP的nl2br函数来实现这一点,但是如何保护该字符串免受SQL注入攻击(假设我不能使用预处理语句)?如果我在其上使用mysql_real_escape_string,则不再显示换行符。

$text = 'one line
another line';
$text = mysql_real_escape_string($text);
/* save to db, fetch it some time later */
echo nl2br($text); /* output: one line\r\nanotherline */
3个回答

9

mysql_real_escape_string 不会 删除 换行符,而是会对它们进行转义。

在存储字符串时进行转义,然后在输出数据时应用 nl2br(可能与 htmlspecialchars() 结合使用以防止用户输入原始 HTML),这是最好的方法。


0

mysqli_real_escape_string 会将你的回车替换为 \r\n,因此你需要使用 str_replace() 将其还原。然而,在浏览器/电子邮件客户端中仍然看不到它。这就是 nl2br() 发挥作用的地方:

$text = 'one line
another line';
echo nl2br(str_replace("\\r\\n","
", mysqli_real_escape_string($dbc, $text )));

代码已经测试,您可以使用它。

-2
如果我在它上面使用mysql_real_escape_string,它就不再显示换行符了。
你没有看到换行符的<"\n">字面值吗?如果是这样,你的代码可能做了一些讨厌的事情,很可能你的数据被转义了两次。或者,在从数据库获取数据后,你没有使用mysql_real_escape_string()?
无论如何,你必须进行一些调试-调查,以查看你的数据在每个阶段发生了什么。只需打印出$_POST['textarea_name']、SQL查询等即可。找出你失去换行符的时刻和罪犯。
注意: mysql_real_escape_string不能保护任何攻击。它只是转义分隔符。 nl2br不能保留任何东西。它只是为换行符添加一个HTML标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接