0

为什么每次提交表单后 htmlspecialchars() 不能连续编码字符?看看下面的例子:

<?php $_POST['txt'] = htmlspecialchars($_POST['txt']); ?>
<form method="post">
<input name="txt" value="<?=$_POST['txt'] ?>" />
<input type="submit" name="save" value="test" />
</form>

您可以在http://verticalcms.com/htmlspecialchars.php运行时看到它。

现在执行以下操作

1) Type & into the text field
2) Hit the test button once
3) When the page completes post back, hit the test button again
4) When the page completes post back, view the page source code

在输入框中,值为&

我期待& 放大器;

为什么不是& 放大器;???

4

2 回答 2

2

这只是 HTML 实体编码。在 HTML 属性中使用“&”时,应该对其进行编码。这就是你正在做的事情。

所以,浏览器读取

<input value="&amp;" />

并将其转换为“具有值'&'的文本框小部件”。

其他特殊字符也是如此:

<input value="&quot" />

会产生一个 " 字符。

当您提交表单时,浏览器会发送这些未编码的值,因此您的 PHP 脚本会像“&”一样接收它,而不是“&”。

于 2009-02-05T21:55:56.253 回答
0

为方便起见,$_POST 中的值已经经过 html 解码。因此,当您的脚本启动时,以下情况为真:

$_POST['txt'] == '&';
htmlspecialchars('&') == '&amp;'

[编辑] 看起来这需要进一步解释

当浏览器将上述表单提交给服务器时,使用一个&符号作为“txt”的值,它会将以下内容放入请求的正文中:

txt=&amp;

该值是编码的,因为浏览器会将多个字段与一个 & 字符连接起来,例如

txt=&amp;&user=soulmerge&pass=whatever

为了程序员的方便,PHP 获取传输的值并对其进行解码 - 它使 & 成为 & 现在我虽然这首先是问题的原因 - 猜我弄错了。费迪南德正确回答了实际问题。

于 2009-02-05T21:51:35.250 回答