与参数绑定/语句准备混合的htmlspecialchars函数导致/ r和/ n显示

时间:2018-04-18 23:18:21

标签: php mysqli

在我正在为PHP和Mysqli工作的项目中,我必须使用prepare和bind_param来处理我的mysqli语句。在这样做之前我写了这些陈述并且它们工作正常。这是在绑定和准备之前。

 $sql = "INSERT INTO comments (commentid, userid, comment, commentdate) 
    VALUES (NULL, '".$_SESSION["userid"]."', '" . htmlspecialchars($comment, ENT_QUOTES) . "', CURRENT_TIMESTAMP)";
      $conn->query($sql);

在我写评论的textarea中,如果我使用enter并移动到下一行,输出将是这样的: Old Line New Line

现在,当我开始绑定值并准备语句时,我的输出有点奇怪。这是代码:

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

由于某种原因,如果我在文本中创建了一个新行,这样做的输出将如下: Old Line / r / nNew Line

我有什么问题我可以解决,以便/ r / n不输出到页面?谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

我发现的问题的解决方案与绑定参数中的html特殊字符无关。事实上,我已经使用mysqli_real_escape_string来检索评论。如果你已经转义了你的字符串,那么就没有必要绑定它了,你也可以绑定它而不必转义!要么有效。

答案 1 :(得分:-1)

输入textarea输入字段的换行符由htmlspecialchars()函数转换为\r\n

首先,要删除\r\n,您可以使用str_replace()

$escape_comment     = htmlspecialchars( $comment, ENT_QUOTES );
$remove_line_breaks = str_replace( "\\r\\n", '', $escape_comment );

或者,为什么不使用strip_tags(),而不是使用htmlspecialchars(),那么您可以决定在注释中允许哪些标记。 注意:除非您知道评论内容的格式正确,否则您可能不想使用strip_tags()

$escape_comment = strip_tags ( $comment, '<a><p><i><strong><li>' );