我在每个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);
答案 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()
的调用。