0

我在每个 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>我经历过,如果我想在将文本写入数据库之前显示来自 a 的文本,那么它会显示“\r\n”而不是正常的换行符。即使我尝试执行以下操作,它也不起作用:

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

1 回答 1

0

您在这里犯的错误是$_POST用您希望适用于所有上下文(同时使用mysqli_real_escape_stringhtmlspecialchars)的字符串版本覆盖。

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

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

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

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

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

nl2br()可能根据需要在 HTML 上下文中添加调用。

于 2013-08-02T17:03:08.607 回答