我有一个简单的CMS,允许管理员通过表单中的textarea字段更新文本。不幸的是,一旦将br标签引入文本字段,每次用户单击提交按钮时,会在每个现有标签旁边添加一个额外的br标签。我认为这是因为我的nl2br函数每次提交表单时都会创建一个重复的br标记。我试图修剪帖子数据,str_replace br与n linebreak,并设置包裹软和硬,都无济于事。包含或排除htmlentities没有任何效果。这是我尝试做的事情的本质:
<?php
function echo_homepage($name) {
global $connection;
$query = "SELECT info FROM homepage WHERE name = '{$name}'";
$result = mysqli_query($connection, $query);
confirm_query($result);
$data_array = mysqli_fetch_assoc($result);
$info = $data_array["info"];
$info = htmlentities($info);
echo nl2br($info);
}
if(isset($_POST["field1"]) || isset($_POST["field2"])) {
$field1 = mysqli_real_escape_string($connection, $field1);
$field2 = mysqli_real_escape_string($connection, $field2);
$query1 = "UPDATE homepage SET info='{$field1}' WHERE name='field1' LIMIT 1";
$query2 = "UPDATE homepage SET info='{$field2}' WHERE name='field2' LIMIT 1";
$result1 = mysqli_query($connection, $query1);
$result2 = mysqli_query($connection, $query2);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Form</title>
</head>
<body>
<form action="edit_homepage.php" method="post">
<fieldset id="" title="Left Column of Text">
<ol>
<li>
<textarea name="field1" id="info1" cols="50" rows="8" ><?php echo_homepage("field1"); ?></textarea>
</li>
</ol>
</fieldset>
<fieldset id="" title="Right Column of Text">
<ol>
<li>
<textarea name="field2" id="info1" cols="50" rows="8" ><?php echo_homepage("field2"); ?></textarea>
</li>
</ol>
<button type="submit">Update Text</button>
</fieldset>
</form>
表单使用mysql字段中已有的文本填充textarea。一切正常,直到有一个br标签(我想要)。一旦存在br标签,每次用户点击提交按钮时,在旧标签旁边放置一个额外的br标签。我需要用户能够点击输入并创建一个行空间,但是当我们点击表单的提交按钮时,我无法添加额外的br标记。
非常感谢阅读。
编辑 - 答案
好的,感谢@ eX0du5参考以下评论。注释中的大多数辅助函数都不起作用,但我终于找到了一个解决方案,通过在注释中包含此函数来重写输出文本的函数(在这种情况下唯一的函数): / p>
function nl2br2($string) {
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return $string;
}
我用这个替换了echo_homepage的最后一行:
echo br2nl($info);
我在大约七个帖子中发现了类似的问题,但都没有明确的答案,所以我希望有所帮助。欢呼声。
答案 0 :(得分:1)
为什么不在转义字符串并将其插入数据库之前删除<br>
?根据{{3}}(参见评论),您不会使用\n
丢失换行符nl2br()
。因此,再次摆脱<br>
就足够了。
我不确定您是否要允许HTML代码。如果没有,则应删除所有带有documentation的HTML标记。
这会使对您的网页进行XSS攻击变得更加困难。