Php nl2br()和mysqli_real_escape_string()一起工作时出现问题

Php nl2br()和mysqli_real_escape_string()一起工作时出现问题,php,Php,我正在尝试使用php nl2br()函数将电子邮件中的字符\r\n转换为标记。当我尝试将它与mysqli\u real\u escape\u string()一起使用时,似乎存在某种冲突。我可以分别验证mysqli_real_escape_string函数()是否提供了正确的输出,以及nl2br()函数是否正确地将适当的字符转换为标记,但它们不能一起工作。为什么 我可以确认nl2br工作: $message= "This\r\nis\n\ra\nstring\r"; $messa

我正在尝试使用php nl2br()函数将电子邮件中的字符\r\n转换为

标记。当我尝试将它与mysqli\u real\u escape\u string()一起使用时,似乎存在某种冲突。我可以分别验证mysqli_real_escape_string函数()是否提供了正确的输出,以及nl2br()函数是否正确地将适当的字符转换为

标记,但它们不能一起工作。为什么

我可以确认nl2br工作:

    $message= "This\r\nis\n\ra\nstring\r";
    $message= nl2br($message);
    echo($message);
输出:

“这是一个字符串”

我可以确认mysqli\u real\u escape\u string()是否有效:

输出:

This\r\nis\n\ra\nstring\r
当我一起使用它们时:

$message = nl2br(mysqli_real_escape_string($connection, $_POST['message'])); 
输出:

This\r\nis\r\na\r\nstring

mysqli\u real\u escape\u string
转义换行符,因此
nl2br
显然找不到它们

一个简单的脚本来演示这一点:

$ cat test.php
$c = mysqli_connect('192.168.33.10', 'root', '');
print("Hello\nWorld\n");
print(mysqli_real_escape_string($c, "Hello\nWorld"));

$ php test.php | hexdump -C  
00000000  48 65 6c 6c 6f 0a 57 6f  72 6c 64 0a 48 65 6c 6c  |Hello.World.Hell|
00000010  6f 5c 6e 57 6f 72 6c 64                           |o\nWorld|
如您所见,换行符(
0x0a
)已替换为字符串
\n
0x5c
0x6e

因此,请先调用
nl2br

$message = mysqli_real_escape_string(nl2br($_POST['message']), $connection);

为什么要对由
mysqli_real_escape_string
返回的字符串使用
nl2br
?转义应该是对字符串执行的最后一个操作。对转义字符串进行进一步的操作实际上可以撤消转义,并使您再次遭受sql注入攻击。这是成功的一半。现在它正在创建回车符,但它仍然在每行的开头保留/r/n。事实上,我算出来了。我在转义字符串:$message=str_replace('\r\n','$message)后执行了此函数;我遇到了麻烦。。。显然,在“\r\n”周围使用单引号和双引号是有区别的。“\r\n”不起作用。@user2755541是的,在PHP中,变量只解析双引号(
)和转义字符,单引号字符串(
)不解析;请参阅:
$message = mysqli_real_escape_string(nl2br($_POST['message']), $connection);