Php htmlspecialchars函数与参数绑定/语句准备混合在一起会导致/r和/n显示
在我为PHP和Mysqli工作的项目中,我必须为Mysqli语句使用prepare和bind_param to。在这样做之前,我写了这些声明,它们工作得很好。这是在装订和准备之前Php htmlspecialchars函数与参数绑定/语句准备混合在一起会导致/r和/n显示,php,mysqli,Php,Mysqli,在我为PHP和Mysqli工作的项目中,我必须为Mysqli语句使用prepare和bind_param to。在这样做之前,我写了这些声明,它们工作得很好。这是在装订和准备之前 $sql = "INSERT INTO comments (commentid, userid, comment, commentdate) VALUES (NULL, '".$_SESSION["userid"]."', '" . htmlspecialchars($comment, ENT_QUOTES
$sql = "INSERT INTO comments (commentid, userid, comment, commentdate)
VALUES (NULL, '".$_SESSION["userid"]."', '" . htmlspecialchars($comment, ENT_QUOTES) . "', CURRENT_TIMESTAMP)";
$conn->query($sql);
在我写评论的文本区域中,如果我使用enter键并移动到下一行,输出如下:
老线新线
现在,当我开始绑定值并准备语句时,我的输出有点奇怪。以下是代码:
$userid = $_SESSION['userid'];
$stmt = $conn->prepare("INSERT INTO comments (commentid, userid, comment, commentdate)
VALUES (NULL, ?,?, CURRENT_TIMESTAMP)");
$stmt->bind_param("is", $userid, htmlspecialchars($comment, ENT_QUOTES));
$stmt->execute();
出于某种原因,在这样做之后,如果我在文本中创建了一个新行,那么输出将如下所示:
旧线/右线/新线
是否有一些我做错了的事情可以修复,以便不将/r/n输出到页面?谢谢你的帮助 输入文本区域输入字段的那些换行符由
htmlspecialchars()
函数转换为\r\n
首先,要删除\r\n
,可以使用str\u replace()
或者,与其使用htmlspecialchars(),不如使用strip_tags(),然后您可以决定允许在注释中使用哪些标记注意:除非您知道注释内容的格式正确,否则您可能不想使用strip\u tags()
$escape\u comment=strip\u标记($comment,);
我发现的问题的解决方案与bind参数中的html特殊字符无关。事实上,我已经在使用mysqli\u real\u escape\u字符串来检索注释。如果你已经转义了你的字符串,那么就没有必要绑定它,但是你也可以绑定它而不转义!两种方法都有效 你的意思是\n\r
对吗?旧的一行\r\n新的一行我刚刚测试了它,以确保我可以在必要时添加一个屏幕截图。如果我现在添加了“”,它将类似于\“\”\”\“由于输出听起来像2个问题,addslashes被启用,加上您以单引号输出行:我如何才能禁用addslashes,因为在我看来它不像是以单引号输出!谢谢你的回答,我对PHPI还是相当陌生的。如果我不想使用strip标签,因为我应该没有办法在我的页面上输出任何html。我想htmlspecialchars会帮我处理的。另外,我还不完全理解您的preg_替换代码。另一件事是为什么我展示的第一个示例中不会发生同样的事情?使用htmlspecailchars()将在页面上显示html元素,除非您处理好它。preg_replace()-请注意,\r\n
是元字符,它们将匹配换行符,但由于它已被htmlspecialchars
函数转换为字符串,因此我转义了\r\n
。另外,``在正则表达式中是一个元字符,我必须在使用它之前对其进行转义,否则它的含义将完全不同。htmlspecialchars不会影响新行,也不会转换新行,并且strip_标记不会防止XSS,除非您删除所有内容。strip_标记()甚至是处理XSS的最佳方法。它将从你的文本中删除所有html标记,这不是你最初想要的吗?没有htmlentities是用来停止XSS的,strip_标记不是,strip标记是用来剥离标记的,我想我刚刚在链接中证明了这一点:这是另一个
$escape_comment = htmlspecialchars( $comment, ENT_QUOTES );
$remove_line_breaks = str_replace( "\\r\\n", '', $escape_comment );
$escape_comment = strip_tags ( $comment, '<a><p><i><strong><li>' );