PHP 和 HTML 有很多相互作用:PHP 能生成 HTML,HTML 可以向 PHP 傳遞信息。在閱讀這些常見(jiàn)問(wèn)題之前,先學(xué)會(huì )怎樣
從 PHP 之外取得變量很重要。此主題的手冊頁(yè)也包括很多例子。還要仔細留意
register_globals
對你意味著(zhù)什么。
在幾個(gè)環(huán)節上編碼方式很重要。假定有 string $data,其中包含了想通過(guò)非編碼方式傳遞的字符串,那這是相關(guān)步驟:
HTML 解析。要指定一個(gè)任意的字符串, 必須將其放在雙引號中,并用 htmlspecialchars()處理整個(gè)值。
URL:URL 由幾部分組成。如果希望自己的數據被當作其中一項來(lái)解釋?zhuān)? 必須用 urlencode()對其編碼。
示例 #1 隱藏的 HTML 表單單元
<?php
echo "<input type='hidden' value='" . htmlspecialchars($data) . "' />\n";
?>
注意: 用 urlencode()來(lái)處理 $data是錯誤的,因為是瀏覽器的責任來(lái) urlencode()數據。所有流行的瀏覽器都能正確處理。注意不論何種方法(例如 GET 或 POST)都會(huì )這樣。不過(guò)只會(huì )在用 GET 請求時(shí)注意到這一點(diǎn),因為 POST 請求通常是隱藏的。
示例 #2 等待用戶(hù)編輯的數據
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data)."\n";
echo "</textarea>";
?>
注意: 數據會(huì )按照預期的顯示在瀏覽器中,因為瀏覽器會(huì )解釋 HTML 轉義符號。 當提交時(shí),不論是 GET 或者 POST 方法,數據都會(huì )被瀏覽器進(jìn)行 urlencode 來(lái)傳輸,并直接被 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 請求,因此需要手工對數據進(jìn)行 urlencode()。
注意: 需要對整個(gè) URL 進(jìn)行 htmlspecialchars(),因為 URL 是作為 HTML 屬性的一個(gè)值出現的。在本例中,瀏覽器會(huì )首先對值進(jìn)行 un- htmlspecialchars(),然后再傳遞此 URL。PHP 將能正確理解 URL,因為對數據進(jìn)行了 urlencoded()。 要注意到 URL 中的
&
被替換成了&
。如果忘了這一步,盡管大多數瀏覽器都能恢復,但也不總是這樣。因此即使 URL 不是動(dòng)態(tài)的,也 需要對 URL 進(jìn)行 htmlspecialchars()。
當提交表單時(shí),可以用圖片代替標準的提交按鈕,用類(lèi)似這樣的標記:
<input type="image" src="image.gif" name="foo" />
因為 foo.x和 foo.y在 PHP 中會(huì )成為非法的變量名,它們被自動(dòng)轉換成了 foo_x和 foo_y。也就是用下劃線(xiàn)代替了點(diǎn)。因此,可以按照在 來(lái)自 PHP 之外的變量這一節中說(shuō)明的那樣訪(fǎng)問(wèn)這些變量。例如, $_GET['foo_x']。
注意:
請求變量名中的空格被轉換為下劃線(xiàn)。
要使你的 <form> 結果被當成 array發(fā)送到 PHP 腳本,要對 <input>,<select> 或者 <textarea> 單元這樣命名:
<input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" />
<input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyOtherArray[]" /> <input name="MyOtherArray[]" />
<input name="AnotherArray[]" /> <input name="AnotherArray[]" /> <input name="AnotherArray[email]" /> <input name="AnotherArray[phone]" />
注意:
指定數組的鍵名是 HTML 的可選項。如果不指定鍵名,則數組被按照單元在表單中出現的順序填充。第一個(gè)例子將包含鍵名 0,1,2 和 3。
參見(jiàn) 數組函數和 來(lái)自 PHP 之外的變量。
可多選的 select multiple 標記是 HTML 的一個(gè)構造,允許用戶(hù)從一個(gè)列表中選擇多個(gè)項目。這些項目接著(zhù)被傳遞給該表單 action 中指定的處理程序。問(wèn)題是它們都會(huì )被用同樣的名字傳遞。例如:
<select name="var" multiple="yes">
var=option1 var=option2 var=option3
<select name="var[]" multiple="yes">
注意如果在 JavaScript 中通過(guò)名字來(lái)引用單元,單元名字中的
[]
可能會(huì )造成問(wèn)題。用表單單元中的數字序號來(lái)替代,或者將變量名用單引號括起來(lái)并用其作為單元數組的索引,例如:
variable = documents.forms[0].elements['var[]'];
由于 Javascript (通常情況下)是客戶(hù)端技術(shù),而 PHP (通常情況下)是服務(wù)器端技術(shù),而且 HTTP 是一種“無(wú)狀態(tài)”協(xié)議,因此兩種語(yǔ)言之間不能直接共享變量。
但是,有可能在二者之間傳遞變量。一種實(shí)現的方法是用 PHP 生成 Javascript 代碼,并讓瀏覽器自動(dòng)刷新,將特定的變量傳遞回 PHP 腳本。以下例子顯示了如何這樣做——讓 PHP 代碼取得顯示屏幕的高度和寬度,通常只能在客戶(hù)端這么做。
<?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();
}
?>