【问题标题】:php htmlspecialchars() from one form to anotherphp htmlspecialchars() 从一种形式到另一种形式
【发布时间】:2009-02-05 21:41:01
【问题描述】:

为什么 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

在输入框中,值为&

我期待 & amp;功放;

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

【问题讨论】:

    标签: php htmlspecialchars


    【解决方案1】:

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

    所以,浏览器会读取

    <input value="&amp;" />
    

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

    其他特殊字符也是如此:

    <input value="&quot" />
    

    会产生一个 " 字符。

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

    【讨论】:

    • 所以当用户点击键盘上的 & 时,浏览器会自动将其编码为 & amp;在将其插入 之前?
    • 没有。 &只有在 HTML 中转义 & 才需要。一旦页面被解析和呈现,浏览器就不再关心 HTML。当用户点击“&”时,生成的 texbox 小部件的值为“&”。提交表单时,数据通过 HTTP 发送——不再涉及 HTML。
    • 啊,我明白了,这很有意义。
    • 这有点晚了,但实际上,浏览器将它从 &到 &,然后再从 & 到 %26,因为 & 是 GET/POST 中的特殊字符... PHP 然后在接收端将 %26 解码回 &。
    • 当使用带有“multipart/form-data”编码的 POST 时,这也不是真的 :)
    【解决方案2】:

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

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

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

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

    txt=&amp;
    

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

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

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

    【讨论】:

    • "$_POST 中的值已经为方便起见进行了 html 解码" -- 抱歉,这不是真的。当您通过 GET 或 POST 发送 HTML 编码的数据时,它们将在您的脚本中“按原样”可用,不会进行自动解码。
    猜你喜欢
    • 2010-10-06
    • 2011-03-09
    • 2015-06-23
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多