1. 程式人生 > >php中的form表單

php中的form表單

表單處理

  表單的概念在生活中很常見,就像是問卷調查表一樣,別人先把問卷發給你,你照著問卷的要求填寫,完事過後再將填完的問卷發給別人,從而達到一個將別人需要的資訊傳遞給別人的一種方式。
  傳統的網頁大多數的作用都是展示資料,就是將資訊傳遞給使用者。而在現代化的 Web 開發中,非常注重資訊互動,所以表單也隨處可見,只是形式上變成網頁,性質上還是一模一樣的。主要的作用任然是 收集指定的使用者資訊。

1.表單的基本使用

HTML 中有一個專門用於提交資料的標籤: <form> ,通過這個標籤可以很容易的收集使用者輸入.

form 標籤有兩個必要屬性:
  action:表單提交地址(填完了,交給誰)
  method:表單以什麼方式提交

例如,我們需要在登入介面上收集使用者輸入的使用者名稱和密碼:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF‐8">
  <title>登入</title>
</head>
<body>
  <form action="login.php" method="post">
    <div>
      <label for="username">使用者名稱</label>
      <input type="text" id="username" name="username">
    </div>
    <div>
      <label for="password">密碼</label>
      <input type="password" id="password" name="password">
    </div>
    <button type="submit">登入</button>
  </form>
</body>
</html>

按照目前的情況,使用者第一次請求得到這個表單頁面,填寫完表單內容,點選登入,表單會自動傳送到login.php ,剩下的問題就是要考慮如何在 login.php 中獲取到使用者提交過來的內容.

PHP 中有三個超全域性變數專門用來獲取表單提交內容:
    $_GET :用於獲取以 GET 方式提交的內容
    $_POST :用於獲取以 POST 方式提交的內容
    $_REQUEST :用於獲取 GET 或 POST 方式提交的內容

藉助  $_POST 或者  $_REQUEST 就可以獲取到表單提交的內容:

<?php
// 獲取表單提交的使用者名稱和密碼
echo '使用者名稱:' . $_REQUEST['username'];
echo '密碼:' . $_REQUEST['password'];

1.1.  提交地址

  action 提交地址指的是這個表單填寫完成過後點選提交,傳送請求的請求地址是什麼。
  從便於維護的角度考慮,一般我們最常見的都是提交給當前檔案,然後在當前檔案中判斷是否是表單提交請求:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // 表單提交請求
}

另外,建議使用 $_SERVER['PHP_SELF'] 動態獲取當前頁面訪問路徑,這樣就不用因為檔案重新命名或者網站目錄結構調整而修改程式碼了:

<!‐‐ 這樣寫死 action 地址,當檔案重新命名就需要修改程式碼 ‐‐>
<form action="/foo/login.php">
  <!‐‐ ... ‐‐>
</form>
<!‐‐ 通過 `$_SERVER['PHP_SELF']` 獲取路徑,可以輕鬆避免這個問題 ‐‐>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!‐‐ ... ‐‐>
</form>

1.2.  提交方式

method 可以用於設定表單提交的方式,目前我們所認識的就是最常見兩種表單提交方式: GET 和 POST 。
  從效果上來看,兩者都可以將資料提交到服務端,但是從實現提交的原理上兩者有很大的不同:
GET
  表單資料是通過 URL 中的 ? 引數傳遞到服務端的
  可以在位址列中看到提交的內容
  資料長度有限制,因為 URL 地址長度有限(2000個字元)
POST
  表單資料是通過請求體傳遞到服務端的,我們在介面上看不到
  可以提交任何型別的資料,包括檔案
  由於介面上看不見,瀏覽器也不儲存,所以更安全
  至於什麼情況下應該選用哪種方式,這個需要結合業務場景和這兩種方式各自的特點來決定,沒有絕對的答案,只能給出一些原則:
  絕不能使用 GET 來發送密碼或其他敏感資訊!!!
  應該想清楚這次請求到底主要是去拿東西,還是去送東西

2.  常見表單元素處理

至於表單元素中的文字框文字域一類的元素,都是直接將元素的 name 屬性值作為鍵,使用者填寫的資訊作為值,傳送到服務端。但是表單元素中還有一些比較特殊的表單元素需要單獨考慮:

2.1.  單選按鈕

<!‐‐ 最終只會提交選中的那一項的 value ‐‐>
<input type="radio" name="gender" value="male">
<input type="radio" name="gender" value="female">

2.2.  複選按鈕

<!‐‐ 沒有設定 value 的 checkbox 選中提交的 value 是 on ‐‐>
<input type="checkbox" name="agree">
<!‐‐ 設定了 value 的 checkbox 選中提交的是 value 值 ‐‐>
<input type="checkbox" name="agree" value="true">

如果需要同時提交多個選中項,可以在  name 屬性後面 跟上  [] :

https://php.net/manual/zh/faq.html.php#faq.html.arrays

<input type="checkbox" name="funs[]" id="" value="football">
<input type="checkbox" name="funs[]" id="" value="basketball">
<input type="checkbox" name="funs[]" id="" value="world peace">

最終提交到服務端,通過  $_POST 接收到的是一個索引陣列.

2.3.  選擇框

<select name="subject">
  <!‐‐ 設定 value 提交 value ‐‐>
  <option value="1">語文</option>
  <!‐‐ 沒有設定 value 提交 innerText ‐‐>
  <option>數學</option>
</select>

2.3.  檔案上傳

type 屬性為 file 的 input 元素可以通過表單提交檔案(上傳檔案),服務端 PHP 可以通過 $_FILES 獲取上傳的檔案資訊。

<?php
// 如果選擇了檔案 $_FILES['file']['error'] => 0
// 詳細的錯誤碼說明:http://php.net/manual/zh/features.file‐upload.errors.php
if ($_FILES['file']['error'] === 0) {
  // PHP 在會自動接收客戶端上傳的檔案到一個臨時的目錄
  $temp_file = $_FILES['file']['tmp_name'];
  // 我們只需要把檔案儲存到我們指定上傳目錄
  $target_file = '../static/uploads/' . $_FILES['file']['name'];
  if (move_uploaded_file($temp_file, $target_file)) {
    $image_file = '/static/uploads/' . $_FILES['file']['name'];
  }
}

$_FILES 同樣也是一個關聯陣列,鍵為表單的  name ,內容如下:

array(1) {
  ["avatar"]=>
  array(5) {
    ["name"]=>
    string(17) "demo.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(27) "C:\Windows\Temp\php786C.tmp"
    ["error"]=>
    int(0)
    ["size"]=>
    int(29501)
  }
}

&n