2009-02-05 100 views
0

为什么不能在每次提交表单后不断对htmlspecialchars()进行编码?看看下面的例子:php 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;放大器;

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

回答

2

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

所以,浏览器读取

<input value="&amp;" /> 

,并将其转换成 “与价值 '&' 文本框控件”。

同样将用于其他特殊字符是真实的:

<input value="&quot" /> 

将导致“字符

当您提交表单时,浏览器将这些值未编码,因此你的PHP脚本接收它像“&”,而不是“& amp”,

0

为方便起见,$ _POST中的值已经被html解码。所以,你的脚本开始运行时,下面是正确的:

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

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

当像一个以上是由浏览器与一个向服务器提交一个表单符号为“TXT”的值,它使以下到请求的主体:

txt=&amp; 

该值编码,因为浏览器将连接多个字段与像

的符号字符
txt=&amp;&user=soulmerge&pass=whatever 

PHP需要发送的值,并把它们解码为程序员的便利性 - 它使一个符号出&现在我虽然这在首位的问题的原因 - 想我听错了。费迪南德正确回答了实际问题。

+0

“$ _POST中的值已经被html解码了,以方便起见” - 对不起,但这不是真的当您通过GET发送HTML编码数据或POST,他们将可用“a s“在您的脚本中,不会进行自动解码。 – 2009-02-05 22:00:22

+0

猜猜我误解了这个问题... – soulmerge 2009-02-06 09:26:25