1

mail()当我将函数用于 PHP时,我无法弄清楚字符如何被转义的逻辑。我使用的是 PHP 5.2,magic_quotes_qpc 为 ON,runtime/sybase 为 OFF。这就是问题所在。

  1. A 有一个接受文本输入的表单,我用它mysqli_real_escape来转义特殊字符,以便在 SQL 语句中使用,如下所示:

    $text = mysqli_real_escape_string($dbc, $_GET['text']);
    
  2. 如果我输入以下评论“我不会吃那个!” 进入表格,我在数据库中看到以下内容 - “我不会吃那个!”,这是我所期望的。如果我添加回车/换行,我在 phpMyAdmin 的数据库字段中看到的只是回车和没有特殊字符的换行(即没有“\r\n”或类似的东西)。

  3. 当我使用该mail功能发送消息(即mail($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 出现在我的电子邮件中。

4

2 回答 2

2

魔术语录很糟糕。不要使用它们。

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

如果您使用魔术引号mysqli_real_escape_string,那么这就解释了为什么字符串被双重转义。

$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

关闭魔术引号(确保您的应用程序可以处理)并且仅在插入数据库时​​转义(如果使用参数化查询,即 PDO 或 mysqli,则无需转义!)。

作为最后的手段,您可以尝试在字符串上使用带斜杠。

于 2011-04-18T22:53:06.973 回答
0

从 MySQL 数据库中检索结果时,您需要stripslashes()在输出中使用,否则出于某种原因,它们仍将包含转义斜杠。

编辑:

然后,您可以$theOutput = str_replace("\\r\\n", "\r\n", $theOutput);修复换行符。

于 2011-04-18T22:56:48.657 回答