PHP mysqli_real_escape_string()在函数内部不起作用

PHP mysqli_real_escape_string()在函数内部不起作用,php,mysql,mysqli,Php,Mysql,Mysqli,我有一个函数,可将日志条目添加到我的数据库中,如下所示: function doLog($conn, $category, $result, $details){ $category = mysqli_real_escape_string($conn, $category); $result = mysqli_real_escape_string($conn, $result); $details = mysqli_real_escape_string($conn, $d

我有一个函数,可将日志条目添加到我的数据库中,如下所示:

function doLog($conn, $category, $result, $details){
    $category = mysqli_real_escape_string($conn, $category);
    $result = mysqli_real_escape_string($conn, $result);
    $details = mysqli_real_escape_string($conn, $details);

    mysqli_query($conn, "INSERT INTO log (category, result, details) VALUES('$category', '$result', '$details')");
    return $details; //for debug
}

echo doLog2($conn, "Test", "Test", "A 'test' entry"); //echo is for debug
“test”条目作为“test”条目返回/回显,但不带斜杠插入到我的数据库中


这是怎么回事?

这工作正常。反斜杠用于转义SQL查询中的引号,以便逐字插入引号字符。它不应该同时插入转义字符\

如果应用了两次转义,则最终会出现转义反斜杠,后跟转义引号,如下所示:

A \\\'test\\\' entry
数据库中存储的内容将是:

A \'test\' entry
如果使用参数化语句,所有这些都会简单得多。你不能引用或逃避

function doLog($conn, $category, $result, $details){
    $sql = "INSERT INTO log (category, result, details) VALUES (?, ?, ?)";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "sss", $category, $result, $details);
    mysqli_stmt_execute($stmt);

    return $details; //for debug
}

您的代码易受SQL注入攻击。请学会使用。警告:在使用mysqli时,您应该使用和来将用户数据添加到查询中。不要使用手动转义和字符串插值或串联来完成此操作,因为这样会创建严重的错误。意外未扫描的数据是一个严重的风险。使用绑定参数不那么冗长,也更容易检查是否正确。有趣的是,在你说这句话之前几分钟,我刚刚读到了准备好的语句。。谢谢你。这里没有任何类型的交互,因此没有漏洞,但我肯定会调查用户可以与db交互的站点的其他部分。如果你阅读,它会告诉你这一点。正如已经指出的,预先准备好的语句取代了这个函数。。也许我做了一些不同的事情?我过去总是使用相同的代码,并且总是对数据库中的字符进行转义。但不管怎样,如果它在数据库中也像“不应该”一样回响?@ShaneT它在查询中的转义方式和它在数据库中的存储方式是两件不同的事情。这与HTML中的方式相同;在源代码中,或在常规字符串中,当字符串本身有双引号时,如何显示\。