撤消mysql_real_escape_string

时间:2013-08-02 16:55:37

标签: mysql line-breaks

我在每个php页面的顶部都有以下代码:

<?php

    function name_format($str)
    {
        return trim(mysql_real_escape_string(htmlspecialchars($str, ENT_QUOTES)));
    }
?>

foreach ($_POST as $key => $value) {
        if (!is_array($value))
        {
            $_POST[$key] = name_format($value);
        }
    } 

直到现在这还非常有用。我经历过,如果我想在将文本写入数据库之前显示来自<textarea>的文本,那么它会显示“\ r \ n”而不是正常的换行符。 即使我尝试执行以下操作,也不起作用:

$str = str_replace("\r\n", "<br>", $str);

1 个答案:

答案 0 :(得分:0)

你在这里犯的错误是用你希望所有上下文适合的字符串版本覆盖$_POST(使用mysqli_real_escape_string和同时htmlspecialchars

您应该保持原始值不变,并且使用适用于该上下文的函数将其转义到使用它的位置。 (这就是为什么早期版本的PHP的“魔术引号”功能被普遍认为是一个坏主意的一个原因。)

因此,在您的数据库代码中,您将准备一个用于SQL(特别是MySQL)的变量:

$comment = mysqli_real_escape_string(trim($_POST['comment']));

在您的模板中,您将准备一个用于HTML的变量:

$comment = htmlspecialchars(trim($_POST['comment']));

根据需要,可以在HTML上下文中添加对nl2br()的调用。