将textarea保存到MySQL并保留换行符

时间:2010-08-14 09:19:51

标签: php mysql html sql-injection

想象一下博客或cms系统(PHP和MySQL)。我想让用户在textarea中输入一些文本并将其保存到数据库中。数据库中字段的类型是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 个答案:

答案 0 :(得分:9)

mysql_real_escape_string没有删除换行符,转义它们。

在存储字符串时应该可以正常转义字符串,并在数据输出时应用nl2br(可能与htmlspecialchars()结合使用以防止用户输入原始HTML) STRONG>。这是最好的方式。

答案 1 :(得分:1)

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 :(得分:-2)

  

如果我在它上面使用mysql_real_escape_string,它就不再显示换行符了。

你不是看到"\n"文字代替换行符吗? 如果是这样,你的代码做了一些讨厌的事情,很可能你两次逃避你的数据 或者,从数据库获取数据后,你不做mysql_real_escape_string()吗?

无论如何,你必须做一些调试 - 调查,看看每个阶段的数据会发生什么。只需打印$ _POST ['textarea_name'],SQL查询等。
看看你失去休息时间并找出罪犯的那一刻

注意:
mysql_real_escape_string不保护任何攻击。它逃脱了分界线 nl2br不保留任何东西。它为换行符添加了一个HTML标记。