Php htmlspecialchars函数与参数绑定/语句准备混合在一起会导致/r和/n显示

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

在我为PHP和Mysqli工作的项目中,我必须为Mysqli语句使用prepare和bind_param to。在这样做之前,我写了这些声明,它们工作得很好。这是在装订和准备之前

 $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>' );