Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP/MYSQL转义电子邮件中的字符_Php_Email_Escaping_Mysql Real Escape String - Fatal编程技术网

使用PHP/MYSQL转义电子邮件中的字符

使用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']); 如果我在表单中键入以下注释“我不会吃那个!”我会在数据库中看到以下内容——“我不会

当我使用PHP的
mail()
函数时,我很难理解字符转义背后的逻辑。我使用的是PHP5.2,开启magic_quotes_qpc,关闭runtime/sybase。问题出在这里

  • A有一个接受文本输入的表单,我使用
    mysqli\u real\u escape
    来转义特殊字符,以便在SQL语句中使用,例如:

    $text = mysqli_real_escape_string($dbc, $_GET['text']);
    
  • 如果我在表单中键入以下注释“我不会吃那个!”我会在数据库中看到以下内容——“我不会吃那个!”,这是我所期望的。如果我添加回车符/换行符,我在phpMyAdmin的数据库字段中看到的所有内容都是回车符和换行符,没有特殊字符(即没有“\r\n”或类似字符)

  • 当我使用
    邮件
    功能发送邮件时(即
    邮件($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是否得到双重转义?我不清楚发生了什么事。