何时以及如何在与数据库交互时 encode/decode HTML?

When and how to encode/decode HTML when interacting with a database?

我有一个在 PHP 上运行的网站和一个 MySQL 数据库。我想知道如何最好地处理关于 HTML 编码的用户输入(我很清楚我应该按接收到的形式存储并在输出中解码:这就是我所做的),尤其是这个周期:

现在我的问题是:服务器是否应该解码所有接收到的输入,以便 però 被解码为原始的 però
我怀疑这是否意味着如果用户输入 è 作为他的用户名,它将被注册为 è 而不是他实际想要的...

我知道这不是什么大问题(不知道有多少用户想在用户名中使用 HTML 特殊字符编码文字...),但我和我都感到困惑找不到完全满意的解决方案。

除非我误解了你的问题,否则你似乎对将 HTML 编码字符串输出到文本输入的效果有错误的印象。这是将要发生的事情的一个基本示例。假设您有一个用户想被命名为 PB&J。当然,这很奇怪,但并不是每个人都能选择一个不错的非奇怪用户名,例如 "Bonvi" 或 "Don't Panic".

因此您将其保存在数据库中 原样。

稍后,当您以另一种形式使用它时,您可以将其转义以进行输出。

<input type="text" name="username" value="<?= htmlspecialchars($username) ?>">

在您的页面 source 中,您会看到

<input type="text" name="username" value="PB&amp;amp;J">

与符号转换为 HTML 实体。 (这是你想要的,以防他们真的想被命名为 bob"><script>alert("però!")</script><p class="ha 或更糟的名字。)

但是文本框中显示的值会是PB&amp;J,当用户提交表单时,$_POST['username']中的值会是PB&amp;J不是PB&amp;amp;J不会改成编码后的值

(我在这个例子中使用了 htmlspecialchars,但是这同样适用于你使用 però 和 htmlentities 的例子。)

我只是想从根本上解释它,所以如果我误解了你,我深表歉意 - 我不想听起来居高临下。