这很简单,我的网站上有一个文本区域帖子,如果我输入:
line 1
line 2
line 3
进入它,输出:
line 1nline 2nline 3
我的插入代码是:
$status = strip_tags(stripslashes(htmlentities(mysql_real_escape_string($_POST['status']))));
$uid = strip_tags(stripslashes(htmlentities(mysql_real_escape_string($_POST['uid']))));
//more stuff
$sid = rndTxt(16);
$status = nl2br($status);
if (!get_magic_quotes_gpc()) {
$status = addslashes($status);
}
$insert = mysql_query("INSERT INTO mingle_status (uid,sid,status,`timestamp`) VALUES ('$uid','$sid','$status',now())") or
print mysql_error();
和我的输出代码:
while($st = mysql_fetch_assoc($statussql)) {
$status = stripslashes($st['status']);
$sid = $st['sid'];
$td = $st['timestamp'];
?>
<div id="n">
<div id="statuses" class="<?php echo $sid; ?>">
<p><?php echo $status; ?></p>
<div id="statuscomadd" style="background:#E0E0E0;">
<a href="ld.php?uid=<?php $uid; ?>&pid=<?php echo $sid;?>&method=like">Like</a> <a href="ld.php?uid=<?php $uid; ?>&pid=<?php echo $sid;?>&method=dislike">Dislike</a><a href="#" id="time"><?php echo time_since($td) . " ago"; ?></a>
</div>
</div>
非常感谢任何帮助!:)
答案 0 :(得分:2)
你不需要在插入时使用nl2br()
,你必须在html中显示时使用它
并且必须在插入
之前删除stripslashes
答案 1 :(得分:1)
插入时只需对值mysql_real_escape_string()
执行操作。您只想更改数据(例如,当您要显示数据时使用htmlentities()
)。
还请考虑停止使用mysql_*
函数获取新代码。它们已不再维护,社区已开始deprecation process。请参阅red box?相反,您应该了解prepared statements并使用PDO或MySQLi。如果您无法决定,this article将有助于选择。如果您想学习,here is a good PDO tutorial。
另一件事:你真的需要htmlentities()
吗?因为imo更好的解决方案是使用htmlspecialchars()
。否则所有 html实体都将被替换。
此外,我认为您不需要使用strip_tags()
,因为您已经在使用htmlspecialchars()
来保护您免受XSS攻击。
现在问题是因为您正在使用stripslashes()
来打破\n
换行符。我想你可以放弃那些add/stripslashes
。
答案 2 :(得分:0)
您使用strip_tags(stripslashes(htmlentities(mysql_real_escape_string())));
删除\n
。
只需使用mysql_real_escape_string()
或htmlentities( ,ENT_QUOTES)
即可获得HTML。
此外,如果可以使用UTF-8编码而htmlspecialchars()
代替htmlentities()
。 htmlentities()
转换每个具有HTML表示的字符,而htmlspecialchars()
仅转换必要的字符。没有必要转换一切。请参阅:htmlentities vs htmlspecialchars