PHP mysqli_real_escape_string()在函数

时间:2017-06-07 20:14:26

标签: 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, $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

A'测试'输入作为 A \' test \'返回/回显条目,但插入到我的数据库中,没有斜杠。

这怎么可能?

1 个答案:

答案 0 :(得分:2)

这是正常的。反斜杠用于转义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
}