使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)