PHP 和 HTML

PHP 和 HTML 有很多相互作用:PHP 能生成 HTML,HTML 可以向 PHP 傳遞信息。在閱讀這些常見問題之前,先學(xué)會(huì)怎樣 從 PHP 之外取得變量很重要。此主題的手冊(cè)頁也包括很多例子。還要仔細(xì)留意 register_globals對(duì)你意味著什么。

當(dāng)我通過表單/URL 傳值時(shí)需要用什么編碼/解碼方法?

在幾個(gè)環(huán)節(jié)上編碼方式很重要。假定有 string $data,其中包含了想通過非編碼方式傳遞的字符串,那這是相關(guān)步驟:

  • HTML 解析。要指定一個(gè)任意的字符串, 必須將其放在雙引號(hào)中,并用 htmlspecialchars()處理整個(gè)值。

  • URL:URL 由幾部分組成。如果希望自己的數(shù)據(jù)被當(dāng)作其中一項(xiàng)來解釋, 必須urlencode()對(duì)其編碼。

示例 #1 隱藏的 HTML 表單單元

<?php
    
echo "<input type='hidden' value='" htmlspecialchars($data) . "' />\n";
?>

注意: urlencode()來處理 $data是錯(cuò)誤的,因?yàn)槭菫g覽器的責(zé)任來 urlencode()數(shù)據(jù)。所有流行的瀏覽器都能正確處理。注意不論何種方法(例如 GET 或 POST)都會(huì)這樣。不過只會(huì)在用 GET 請(qǐng)求時(shí)注意到這一點(diǎn),因?yàn)?POST 請(qǐng)求通常是隱藏的。

示例 #2 等待用戶編輯的數(shù)據(jù)

<?php
    
echo "<textarea name='mydata'>\n";
    echo 
htmlspecialchars($data)."\n";
    echo 
"</textarea>";
?>

注意: 數(shù)據(jù)會(huì)按照預(yù)期的顯示在瀏覽器中,因?yàn)闉g覽器會(huì)解釋 HTML 轉(zhuǎn)義符號(hào)。 當(dāng)提交時(shí),不論是 GET 或者 POST 方法,數(shù)據(jù)都會(huì)被瀏覽器進(jìn)行 urlencode 來傳輸,并直接被 PHP urldecode。所以最終不需要自己處理任何 urlencoding/urldecoding,全都是自動(dòng)處理的。

示例 #3 URL 中的例子

<?php
    
echo "<a href='" htmlspecialchars("/nextpage.php?stage=23&data=" .
        
urlencode($data)) . "'>\n";
?>

注意: 事實(shí)上這在編造一個(gè) HTML 的 GET 請(qǐng)求,因此需要手工對(duì)數(shù)據(jù)進(jìn)行 urlencode()

注意: 需要對(duì)整個(gè) URL 進(jìn)行 htmlspecialchars(),因?yàn)?URL 是作為 HTML 屬性的一個(gè)值出現(xiàn)的。在本例中,瀏覽器會(huì)首先對(duì)值進(jìn)行 un- htmlspecialchars(),然后再傳遞此 URL。PHP 將能正確理解 URL,因?yàn)閷?duì)數(shù)據(jù)進(jìn)行了 urlencoded()。 要注意到 URL 中的 &被替換成了 &amp;。如果忘了這一步,盡管大多數(shù)瀏覽器都能恢復(fù),但也不總是這樣。因此即使 URL 不是動(dòng)態(tài)的,也 需要對(duì) URL 進(jìn)行 htmlspecialchars()。

我在試用 <input type="image"> 標(biāo)記,但是沒有 $foo.x$foo.y變量,它們哪去了?

當(dāng)提交表單時(shí),可以用圖片代替標(biāo)準(zhǔn)的提交按鈕,用類似這樣的標(biāo)記:

<input type="image" src="image.gif" name="foo" />
當(dāng)用戶點(diǎn)擊了圖片的任何部分,該表單會(huì)被發(fā)送到服務(wù)器并加上兩個(gè)額外的變量: foo.xfoo.y。

因?yàn)? foo.xfoo.y在 PHP 中會(huì)成為非法的變量名,它們被自動(dòng)轉(zhuǎn)換成了 foo_xfoo_y。也就是用下劃線代替了點(diǎn)。因此,可以按照在 來自 PHP 之外的變量這一節(jié)中說明的那樣訪問這些變量。例如, $_GET['foo_x']。

注意:

請(qǐng)求變量名中的空格被轉(zhuǎn)換為下劃線。

怎樣在 HTML 的 <form> 中建立數(shù)組?

要使你的 <form> 結(jié)果被當(dāng)成 array發(fā)送到 PHP 腳本,要對(duì) <input>,<select> 或者 <textarea> 單元這樣命名:

<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
注意變量名后的方括號(hào),這使其成為一個(gè)數(shù)組??梢酝ㄟ^給不同的單元分配相同的名字來把單元分組到不同的數(shù)組里:
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyOtherArray[]" />
<input name="MyOtherArray[]" />
這將產(chǎn)生兩個(gè)數(shù)組,MyArray 和 MyOtherArray,并發(fā)送給 PHP 腳本。還可以給數(shù)組分配指定的鍵名:
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />
AnotherArray 數(shù)組將包含鍵名 0,1,email 和 phone。

注意:

指定數(shù)組的鍵名是 HTML 的可選項(xiàng)。如果不指定鍵名,則數(shù)組被按照單元在表單中出現(xiàn)的順序填充。第一個(gè)例子將包含鍵名 0,1,2 和 3。

參見 數(shù)組函數(shù)來自 PHP 之外的變量。

怎樣從可多選的 HTML 的 select multiple 標(biāo)記中得到所有結(jié)果?

可多選的 select multiple 標(biāo)記是 HTML 的一個(gè)構(gòu)造,允許用戶從一個(gè)列表中選擇多個(gè)項(xiàng)目。這些項(xiàng)目接著被傳遞給該表單 action 中指定的處理程序。問題是它們都會(huì)被用同樣的名字傳遞。例如:

<select name="var" multiple="yes">
每個(gè)被選項(xiàng)將這樣被傳遞到表單處理程序:
var=option1 var=option2 var=option3
每個(gè)選項(xiàng)將覆蓋前面一個(gè) $var變量的內(nèi)容。解決方案是用 PHP 的“表單單元數(shù)組”特性。使用方法如下:
<select name="var[]" multiple="yes">
這將告訴 PHP 將 $var當(dāng)成數(shù)組對(duì)待,每個(gè)對(duì) var[] 的賦值都會(huì)給數(shù)組增加一項(xiàng)。第一項(xiàng)將成為 $var[0],下一個(gè)是 $var[1],等等??梢杂? count()函數(shù)來測(cè)定選擇了多少個(gè)項(xiàng)目,必要時(shí)可以用 sort()函數(shù)來對(duì)選項(xiàng)的數(shù)組進(jìn)行排序。

注意如果在 JavaScript 中通過名字來引用單元,單元名字中的 []可能會(huì)造成問題。用表單單元中的數(shù)字序號(hào)來替代,或者將變量名用單引號(hào)括起來并用其作為單元數(shù)組的索引,例如:

variable = documents.forms[0].elements['var[]'];

怎樣從 Javascript 傳遞一個(gè)變量到 PHP?

由于 Javascript (通常情況下)是客戶端技術(shù),而 PHP (通常情況下)是服務(wù)器端技術(shù),而且 HTTP 是一種“無狀態(tài)”協(xié)議,因此兩種語言之間不能直接共享變量。

但是,有可能在二者之間傳遞變量。一種實(shí)現(xiàn)的方法是用 PHP 生成 Javascript 代碼,并讓瀏覽器自動(dòng)刷新,將特定的變量傳遞回 PHP 腳本。以下例子顯示了如何這樣做——讓 PHP 代碼取得顯示屏幕的高度和寬度,通常只能在客戶端這么做。

<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
  
// output the geometry variables
  
echo "Screen width is: "$_GET['width'] ."<br />\n";
  echo 
"Screen height is: "$_GET['height'] ."<br />\n";
} else {
  
// pass the geometry variables
  // (preserve the original query string
  //   -- post variables will need to handled differently)

  
echo "<script language='javascript'>\n";
  echo 
"  location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
            
"&width=\" + screen.width + \"&height=\" + screen.height;\n";
  echo 
"</script>\n";
  exit();
}
?>