2009-02-05 102 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