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

Posted

技术标签:

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

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

    在 textarea 中输入一些文本,如下所示:


    这是什么?

    我是鲍勃。


    $string = $_POST['name'];

    $insertdata = mysql_real_escape_string($string);

    将 $insertdata 插入数据库。 它在表格中显示“这是什么?\n\n\nI\'m bob.”(不带双引号)。

    查询存储在数据库中的数据,在其上使用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() 处理过的字符串没有影响吗? Preserve Line Breaks From TextArea When Writing To MySQL的可能重复 【参考方案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”而不是换行来显示内容。

以上是关于使用 mysql_real_escape_string 存储后保持 textarea 输入格式的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)