PHP Conference Japan 2024

PHP 和 HTML

PHP 和 HTML 之間有很多互動:PHP 可以產生 HTML,而 HTML 可以將資訊傳遞給 PHP。在閱讀這些常見問題之前,請務必了解如何從外部來源取得變數。關於此主題的手冊頁面也包含許多範例。

當我透過表單/URL 傳遞值時,我需要什麼編碼/解碼?

編碼在幾個階段都很重要。假設你有一個 字串 $data,其中包含你想要以非編碼方式傳遞的字串,以下是相關的階段

  • HTML 解譯。為了指定隨機字串,你必須將其包含在雙引號中,並使用 htmlspecialchars() 處理整個值。

  • URL:URL 由數個部分組成。如果你希望將資料解譯為單一項目,則必須使用 urlencode() 進行編碼。

範例 #1 隱藏的 HTML 表單元素

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

注意 使用 urlencode() $data 是錯誤的,因為瀏覽器有責任 urlencode() 資料。所有常見的瀏覽器都會正確執行此操作。請注意,無論方法(即 GET 或 POST)如何,都會發生這種情況。你只會在 GET 請求的情況下注意到這一點,因為 POST 請求通常是隱藏的。

範例 #2 使用者編輯的資料

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

注意 瀏覽器會按預期顯示資料,因為瀏覽器會解譯 HTML 跳脫符號。 透過 GET 或 POST 提交時,瀏覽器會對資料進行 url 編碼以進行傳輸,並由 PHP 直接進行 url 解碼。因此,最後你不需要自己執行任何 url 編碼/解碼,一切都會自動處理。

範例 #3 在 URL 中

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

注意 實際上,你正在偽造 HTML GET 請求,因此需要手動 urlencode() 資料。

注意 你需要使用 htmlspecialchars() 處理整個 URL,因為 URL 作為 HTML 屬性的值出現。在這種情況下,瀏覽器會先取消 htmlspecialchars() 值,然後傳遞 URL。PHP 將正確理解 URL,因為你已經使用 urlencode() 處理資料。 你會注意到 URL 中的 &&amp; 取代。儘管大多數瀏覽器會在你忘記時恢復,但這並非總是可行。因此,即使你的 URL 不是動態的,你也需要使用 htmlspecialchars() 處理 URL。

我嘗試使用 <input type="image"> 標籤,但 $foo.x$foo.y 變數無法使用。$_GET['foo.x'] 也不存在。它們在哪裡?

提交表單時,可以使用影像來代替標準的提交按鈕,標籤如下

<input type="image" src="image.gif" name="foo" />
當使用者在影像上的某處點擊時,隨附的表單會傳輸到伺服器,並帶有兩個額外的變數:foo.xfoo.y

由於 foo.xfoo.y 在 PHP 中會產生無效的變數名稱,因此它們會自動轉換為 foo_xfoo_y。也就是說,句點會被底線取代。因此,你可以像存取任何其他在關於從外部來源取得變數的章節中所描述的變數一樣存取這些變數。例如,$_GET['foo_x']

注意:

請求變數名稱中的空格會轉換為底線。

我如何在 HTML <form> 中建立陣列?

若要將你的 <form> 結果作為 陣列 發送到你的 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[]" />
這會產生兩個陣列,MyArray 和 MyOtherArray,它們會發送到 PHP 腳本。也可以為你的陣列指定特定鍵
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />
AnotherArray 陣列現在將包含鍵 0、1、email 和 phone。

注意:

在 HTML 中,指定陣列鍵是選擇性的。如果你未指定鍵,則陣列會按照元素在表單中出現的順序填入。我們的第一個範例將包含鍵 0、1、2 和 3。

另請參閱 陣列函式來自外部來源的變數

我如何從一個 select multiple HTML 標籤取得所有結果?

HTML 結構中的 select multiple 標籤允許使用者從清單中選擇多個項目。然後,這些項目會傳遞到表單的動作處理常式。問題在於它們都以相同的 widget 名稱傳遞。即

<select name="var" multiple="yes">
每個選取的選項都會以以下形式到達動作處理常式
var=option1
var=option2
var=option3
      
每個選項都會覆寫前一個 $var 變數的內容。解決方案是使用 PHP 的「表單元素產生陣列」功能。應使用以下內容
<select name="var[]" multiple="yes">
這告訴 PHP 將 $var 視為陣列,並且每次將值指派給 var[] 時,都會將項目新增至陣列。第一個項目會變成 $var[0],下一個變成 $var[1],依此類推。可以使用 count() 函式來判斷選取了多少個選項,並且可以使用 sort() 函式來在必要時排序選項陣列。

請注意,如果你正在使用 JavaScript,則元素名稱上的 [] 可能會在您嘗試按名稱參考該元素時導致問題。請改用其數字形式的元素 ID,或將變數名稱括在單引號中,並將其用作元素陣列的索引,例如

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

我如何將變數從 Javascript 傳遞給 PHP?

由於 JavaScript(通常)是客戶端技術,而 PHP(通常)是伺服器端技術,且 HTTP 是「無狀態」協定,這兩種語言無法直接共用變數。

然而,這兩種語言之間可以傳遞變數。其中一種方法是使用 PHP 生成 JavaScript 程式碼,並讓瀏覽器自行重新整理,將特定變數傳回 PHP 腳本。下面的範例精確地展示了如何做到這一點 —— 它允許 PHP 程式碼擷取螢幕高度和寬度,這通常只能在客戶端實現。

範例 #4 使用 PHP 生成 JavaScript

<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// 輸出幾何變數
echo "螢幕寬度為: ". $_GET['width'] ."<br />\n";
echo
"螢幕高度為: ". $_GET['height'] ."<br />\n";
} else {
// 傳遞幾何變數
// (保留原始查詢字串
// -- post 變數需要以不同的方式處理)

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();
}
?>

新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top