使用PHP/MYSQL转义电子邮件中的字符
当我使用PHP的使用PHP/MYSQL转义电子邮件中的字符,php,email,escaping,mysql-real-escape-string,Php,Email,Escaping,Mysql Real Escape String,当我使用PHP的mail()函数时,我很难理解字符转义背后的逻辑。我使用的是PHP5.2,开启magic_quotes_qpc,关闭runtime/sybase。问题出在这里 A有一个接受文本输入的表单,我使用mysqli\u real\u escape来转义特殊字符,以便在SQL语句中使用,例如: $text = mysqli_real_escape_string($dbc, $_GET['text']); 如果我在表单中键入以下注释“我不会吃那个!”我会在数据库中看到以下内容——“我不会
mail()
函数时,我很难理解字符转义背后的逻辑。我使用的是PHP5.2,开启magic_quotes_qpc,关闭runtime/sybase。问题出在这里
mysqli\u real\u escape
来转义特殊字符,以便在SQL语句中使用,例如:
$text = mysqli_real_escape_string($dbc, $_GET['text']);
邮件
功能发送邮件时(即邮件($to、$subject、$text、$headers)
),我在邮件正文中得到了类似这样的奇怪信息:
I wouldn\\\'t eat that\r\nI couldn\\\'t eat that
I wouldn't eat that
I couldn't eat that
我不知道为什么撇号之前有三个转义符,以及为什么\r\n会出现在我的电子邮件中。魔法引号不好。不要使用它们 如果您使用的是magic quote和mysqli_real_escape_字符串,那么这就解释了为什么字符串是双重转义的
$text = mysqli_real_escape_string($dbc, $_GET['text']); // $_GET['text'] is already escaped
...
mail($to, $subject, $text, $headers); // Now $text contains a doubly escaped string
关闭magic quotes(确保您的应用程序能够处理该问题),并且仅在插入数据库时进行转义(如果使用参数化查询,即PDO或mysqli,则无需转义)
最后,您可以尝试在字符串上使用。从MySQL数据库检索结果时,需要在输出上使用
stripslashes()
,否则出于某种原因,它们仍将包含转义的斜杠
编辑:
然后,您可以执行以下操作:“\\r\\n”、“\r\n”、$theOutput”代码>来修正换行符。不,你不需要。这是一种糟糕的做法,它源于同时使用魔法引号和真实转义的混乱。您需要准确地将数据插入到数据库中,而不是事后试图清理数据。正确插入的数据将按预期从数据库中返回。我没有打开magic quotes,我仍然需要执行此操作。然后,您的设置或数据库功能使用可能会出现其他问题。minitech和mario-感谢您的帮助。请看我的最新评论。Webbiedave-谢谢你的建议。我关闭了magic_quotes并确认它已与phpinfo关闭。我知道它关闭了,因为我现在尝试在表单中输入撇号而不使用mysqli\u real\u escape\u字符串时出错。我尝试再次打印邮件,但仍然看到转义撇号和换行符/回车符(正文电子邮件仍然是=“我不会吃那个\r\n\r\n我不能吃那个\r\n\r\n”)。我还需要在离开数据库时转换消息吗?您可以执行一个简单的
$output=str\u replace(“\\r\\n”、“\r\n”、$output”)代码>。虽然这可能不是最好的方法,但它会起作用。minitech-有趣的是,你提出了这个建议,因为我在网上的其他地方看到了类似的东西。我也试过了,效果不错。我的问题是你为什么要这么做?当命令通过邮件功能时,\r\n是否得到双重转义?我不清楚发生了什么事。