使用mysql_real_escape_string存储后保留textarea输入格式

时间:2011-05-11 17:29:10

标签: php mysql escaping textarea

我使用的是php5.3.6和mysql 5.1.56以及CodeIgniter。这就是我所做的。

  1. 在textarea中输入一些文字,如下所示:


    这是什么?

    我是鲍勃。


  2. $ string = $ _POST ['name'];

  3. $ insertdata = mysql_real_escape_string($ string);

  4. 将$ insertdata插入数据库。 它显示“这是什么?\ n \ n \ n我是bob。”(不带双引号)。

  5. 查询存储在数据库中的数据,在其上使用stripslashes然后将其放回textarea。 它在textarea中显示“这是什么?nnnI'm bob。”(没有双引号)。

  6. 我的问题是:

    • 在第4步中,不应该是“这是什么?\ n \ n \ n我是鲍勃。”存储在表中? 我检查了php手册。它说:
      

    mysql_real_escape_string()调用   MySQL的库函数   mysql_real_escape_string,其中   在下面添加反斜杠   字符:\ x00,\ n,\ r,\,',“和   \ X1A。

    • 使用mysql_real_escape_string()之后我应该如何保留textarea输入格式?

    • 无论如何选择哪条斜线去掉哪条斜线?

    注意:

    • 魔术引号选项已关闭
    • 之前我没有使用stripslashes() 使用mysql_real_escape_string()
    • 如果我使用addslashes()而不是 mysql_escape_string()和 一切正常。
    • 我不想使用addslashes() 它不如安全 mysql_real_escape_string(),至于 我知道。

    谢谢, 米洛

5 个答案:

答案 0 :(得分:1)

在将数据插入数据库之前必须转义数据,以确保不会产生损坏的查询并避免SQL注入。 但是,当您通过SELECT检索该数据时,您将收到未转义的数据,可以使用。

答案 1 :(得分:1)

这确实感觉很像magic_quotes_gpc = On。你在php.ini或运行时禁用它吗?它必须是前者,否则它将继续存在。

http://www.php.net/manual/en/security.magicquotes.disabling.php

The magic_quotes_gpc directive may only be disabled at the system level, and not at runtime. In otherwords, use of ini_set() is not an option.

答案 2 :(得分:0)

MySQL转义字符串,但在向您显示结果时,它会给出与未转义相同的结果。

答案 3 :(得分:0)

简答:

// double quotes are *very* important, or chars are not interpreted
$text_from_db=str_replace("\\r","\r",str_replace("\\n","\n",$text_from_db));

答案很长

非常简单但很棘手。 你编写你的textarea并点击“返回”键,有一个\ r \ n(在Windows系统上)带有斜线,它们可以转义“r”和“n”字母,它们提升了回车和换行符的特殊含义。 你实际上看不到它们,因为它们是“不可打印”的字符。 斜线字符本身(0x1B)是不可见的,即单个斜杠是一个“不可打印”的字符,为了使其可见,您必须在可打印的斜杠字符(0x5C)中“转换”它并实现您必须加倍它“\\”。 现在回到问题:如果你能读到斜杠,可能是因为斜杠不是0x1B而是0x5C,所以“n”和“r”失去了它们的特殊含义,你将它们视为纯粹的字符串。 我发布的代码执行此转换,将“[0x5C] n”字符串转换为“[0x1B]”字符。

备注

希望这会有所帮助,它对我有用。 重要提示:如果已正确存储,则来自数据库的文本存在此问题是不正常的。我的建议是三重检查插入和检索,因为(从问题给出)你可以在某处应用引用两次。

答案 4 :(得分:0)

最佳解决方案..

$insertdata = mysql_real_escape_string($string);(如果需要,可以将其插入数据库中)

echo stripslashes(str_replace('\r\n',PHP_EOL,$insertdata));(输出完全与您的输入相同)