首页 > 解决方案 > Htmlspecialchars ENT_NOQUOTES 不起作用?

问题描述

我试图在表单中输出项目的名称,即“大卫的项目”,如果用户没有正确输入表单中的所有数据,以节省用户必须再次输入名称。

如果我 var_dump $name 我会看到 David 的项目。但是如果我回显 $name 我会看到 David"'" 项目。我意识到 ' (单引号)变成了 "'"; 但我尝试使用 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));

这可以接受吗?

抱歉,我意识到这可能是一个非常愚蠢的问题,但我无法理解它。

感谢您的任何回复。

标签: phphtmlspecialchars

解决方案


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

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

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


推荐阅读