【问题标题】:keep textarea input format after using mysql_real_escape_string to store使用 mysql_real_escape_string 存储后保持 textarea 输入格式
【发布时间】:2011-08-23 12:24:18
【问题描述】:

我正在使用 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\nI\'m bob.”(不带双引号)。

  5. 查询存储在数据库中的数据,在其上使用stripslashes,然后将其放回textarea。 它在文本区域中显示“这是什么?nnn我是鲍勃。”(不带双引号)。

我的问题是:

  • 在第 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()
  • 如果我使用 addlashes() 而不是 mysql_real_escape_string(), 一切正常。
  • 我不想使用addlashes(),因为 它不如安全 mysql_real_escape_string(),就 我知道。

谢谢, 米洛

【问题讨论】:

  • 当您从数据库中检索文本时,您是否尝试过使用nl2br? ($textToShow = nl2br($textFromDatabase);)
  • @DavidThomas 是的。不知何故,nl2br() 对 mysql_real_escape_string() 处理的字符串不起作用
  • nl2br() 不应在此处使用 - 您希望在文本区域中使用真正的换行符,而不是 <br /> 标记(这是无效的 HTML)。
  • @CVM 是的。你说的对。另一个与此主题无关​​的问题。知道为什么 nl2br() 对 mysql_real_escape_string() 处理过的字符串没有影响吗?

标签: php mysql escaping textarea


【解决方案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.

【讨论】:

  • 我仔细检查了一遍。所有有关 magic_quotes 的选项都已关闭。我认为它们在 php 5.3 中默认为“关闭”。我真的不知道出了什么问题。
  • 嗯,在这种情况下,您是否有可能在同一个字符串上多次应用mysql_real_escape_string()?这将说明\n 在从数据库检索的值中可见。
【解决方案2】:

简答:

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

长答案

非常简单但很棘手。 你写你的文本区域并点击“return”键,放置一个 \r\n (在 Windows 系统上),斜线可以避开“r”和“n”字母,提升它们的回车和换行的特殊含义。 您实际上看不到它们,因为它们是“不可打印”的字符。 斜杠字符本身(0x1B)是不可见的,即单个斜杠是“不可打印”的字符,要使其可见,您必须将其“转换”为可打印的斜杠字符(0x5C)并实现这一点,您必须加倍它 ”\\”。 现在回到问题:如果你能读懂斜线,那可能是因为斜线不是 0x1B 而是 0x5C,所以“n”和“r”失去了它们的特殊含义,你把它们当作字符串。 我发布的代码进行了这种转换,将“[0x5C]n”字符串转换为“[0x1B]”字符。

注意事项

希望这会有所帮助,它对我有用。 重要提示:如果存储正确,来自 db 的文本出现此问题是不正常的。我的建议是对插入和检索进行三重检查,因为(根据问题)您可能会在某处应用两次引用。

【讨论】:

    【解决方案3】:

    最佳解决方案..

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 那么当输出到textarea时,我怎样才能把格式放回去呢?我尝试不在选择结果上使用 stripslashes(),它只会用“\n”而不是换行来显示内容。
      • 这是一个完全不同的论点,取决于您尝试在文本区域中插入该值的方式
      【解决方案5】:

      MySQL 对字符串进行转义,但是当将结果显示给您时,它会给您与未转义相同的结果。

      【讨论】:

      • 那么在输出到textarea的时候怎么把格式放回去呢?如果我不使用 stripslashes(),它只会用“\n”而不是换行来显示内容。
      猜你喜欢
      • 2014-12-22
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2015-02-14
      • 2021-07-06
      • 2012-07-24
      • 1970-01-01
      相关资源
      最近更新 更多