htmlspecialchars ENT_NOQUOTES不起作用?

时间:2018-08-01 15:41:18

标签: php htmlspecialchars

如果用户未正确输入表单中的所有数据,我将尝试以表单形式输出项目名称,即“ David's Project”,以免用户不得不再次输入名称。

如果我var_dump $ name我看到了大卫的项目。但是,如果我回显$ name,我会看到David“&#39”项目。我意识到'(单引号)变为“&#039”;但我曾尝试使用ENT_NOQUOTES和ENT_COMPAT来避免对单引号进行编码,但两者均无效。

$name = trim(filter_input(INPUT_POST, 'name0', FILTER_SANITIZE_STRING));

<form method="post" class="form" />
Title: <input type="text" name="name0" value="<?php echo 
htmlspecialchars($name, ENT_NOQUOTES); ?>">

我做错什么了吗?还是ENT_NOQUOTES应该起作用?我尝试使用str_replace替换为'带\',但这也不起作用。

我发现的唯一方法就是使用它:

htmlspecialchars_decode(htmlspecialchars($name, ENT_NOQUOTES));

可以接受吗?

对不起,我意识到这可能是一个非常愚蠢的问题,但是我无法解决这个问题。

感谢您的答复。

1 个答案:

答案 0 :(得分:2)

如果它可以解决您的问题,您可以接受一个简单的答案,但您应该真正了解,您所研究的问题是您或其他人为您创造的更大的问题。

  1. 数据库不应包含HTML编码的字符,除非它们专门用于存储HTML。我非常怀疑这种情况,因为这种情况很少见。
  2. 有人将HTML插入您的数据库中(插入时html编码数据)。这意味着,如果您想使用不是基于HTML的移动应用程序,命令行,或者根本不使用基于HTML的任何内容的移动应用程序,那么您将遇到一个奇怪的问题,即HTML编码的字符必须在输出中删除。这通常是一种倒退的方法,并且经常会引起问题。
  3. 您几乎不需要“清理”您的输入。如果有的话,应该拒绝不允许的输入,或者在将其插入数据库时​​以适当的方式对其进行转义。消毒只是在非常特殊的情况下发生的事情,您现在似乎还没有。您只是输入和输出文本。
  4. 您几乎绝不应更改用户输入

如果可能的话,我的建议是先修复您的INSERT代码,这样它就不会对数据进行html编码。当您将数据输出到HTML格式时,应该发生这种html编码。您可以使用htmlspecialchars()来做到这一点。