PHP7語言基礎——交互之表單


PHP能做很多事情,甚至可以開發桌面應用程序,但是最廣泛的應用還是在網頁開發中,然而,開發網頁不得不與表單打交道。我們時刻都需要收集用戶通過表單提交來的信息以便進行進一步處理。表單是程序和用戶交互的主要方式。

表單的種類

這些知識是HTML的範疇,這裏只簡單的提一下,如果需要詳細瞭解,請自行翻閱HTML文檔。

文本域及其類型

讓用戶輸入數據並對用戶輸入進行處理是最常見的交互類型,我們使用input標籤來表示文本域,HTML5中提供了很多不同的輸入類型,輸入類型使用type屬性定義。

  1. text
    text類型是文本域最常見的類型。格式如下:

    text文本框:<input type='text' name='test'>
    

    網頁效果:
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-v9pAlGaN-1584154420241)(D:\mkdownpad2\php7.3.8官方手冊筆記\表單.assets\image-20200308194435468.png)]

  2. color
    color類型的表單將會調出拾色器用於選取顏色:

    color:<input type='color' name='test'>
    

    網頁效果:

    在這裏插入圖片描述

  3. date
    date類型允許從一個日期選擇器選擇一個日期:

    生日:<input type='date' nam='bday'>
    

    網頁效果:
    在這裏插入圖片描述

  4. email
    email類型用於應該包含email地址的輸入域,不規範的輸入會提示錯誤:

    Email:<input type='email' name='useremail'>
    

    網頁效果:
    在這裏插入圖片描述

  5. number
    number類型用於應該包含數值的輸入域,並且還能夠設定對所接收數字的限定,也可設置步進長度。

    數量(1~10,步進爲3):<input type="number" name="quantity" min="1" max="10" step="3">
    

    網頁效果:
    在這裏插入圖片描述

  6. range
    range類型用於應該包含一定範圍內數字值的輸入域,顯示爲滑動條:

    <input type="range" name="points" min="1" max="10">
    

    網頁效果:
    在這裏插入圖片描述

  7. url
    url類型用於應該包含URL地址的輸入域。在提交表單時,會自動驗證url的值:

    請輸入一個網址:<input type="url" name="url">
    

    網頁效果:
    在這裏插入圖片描述

以上是常見的input表單類型,input的type參數能接受的類型如下表:

描述
button 定義可點擊的按鈕(通常與 JavaScript 一起使用來啓動腳本)。
checkbox 定義複選框。
color 定義拾色器。**注意:**Internet Explorer 和 Safari 不支持 元素。
date 定義date控件(包括年、月、日,不包括時間)。**注意:**Internet Explorer 或 Firefox 不支持 元素。
datetime 定義date和time控件(包括年、月、日、時、分、秒、幾分之一秒,基於 UTC 時區)。注意:Internet Explorer、Firefox 或者 Chrome 不支持 元素,Safari 中部分支持。Opera 12 以及更早的版本中完全支持。
datetime-local 定義 date 和 time 控件(包括年、月、日、時、分、秒、幾分之一秒,不帶時區)。**注意:**Internet Explorer 或 Firefox 不支持 元素。
email 定義用於 e-mail 地址的字段。**注意:**Internet Explorer 9(以及更早的版本)或 Safari 不支持 元素。
file 定義文件選擇字段和 “瀏覽…” 按鈕,供文件上傳。
hidden 定義隱藏輸入字段。
image 定義圖像作爲提交按鈕。
month 定義month和year控件(不帶時區)。**注意:**Internet Explorer 或 Firefox 不支持 元素。
number 定義用於輸入數字的字段。**注意:**Internet Explorer 9 以及更早的版本不支持 元素。
password 定義密碼字段(字段中的字符會被遮蔽)。
radio 定義單元按鈕。
range 定義用於精確值不重要的輸入數字的控件。
reset 定義重置按鈕(重置素有的表單值爲默認值)。
search 定義用於輸入搜索字符串的文本字段。**注意:**Internet Explorer 9(以及更早的版本)或 Safari 不支持 元素。
submit 定義提交按鈕。
tel 定義用於輸入電話號碼的字段。
text 默認。定義一個單行的文本字段(默認寬度爲20個字符)。
time 定義用於輸入時間的控件(不帶時區)。注意: Internet Explorer 或 Firefox瀏覽器不支持使用type=“time” 屬性的 HTML 元素。
url 定義用於輸入URL的字段。**注意:**Internet Explorer 9 (及更早IE版本), 或 Safari 瀏覽器不支持使用 type=“url” 屬性的 HTML 元素。
week 定義week和year控件(不帶時區)。**注意:**Internet Explorer 或 Firefox 瀏覽器不支持使用 type=“week” 屬性的 HTML 元素。

其他表單類型

  1. 下拉框
    下拉框使用select標籤定義。
    【示例】

    <select name="car">
        <option value="volo">Volo</option>
        <option value="saab">Saab</option>
        <option value="mercedes">Mercedes</option>
        <option value="audi">Audi</option>
    </select>
    

    網頁效果:

    在這裏插入圖片描述

  2. 文本域
    Textarea 對象代表 HTML 表單中的一個文本域 (text-area)。
    【示例】

    <textarea name='textarea'></textarea>
    

    網頁效果:

    在這裏插入圖片描述

表單

Form對象代表一個HTML表單,表單通常用於收集用戶數據,包含了 input 元素如:文本字段,複選框,單選框,提交按鈕等。表單對象包含如下屬性:

屬性 描述
acceptCharset 服務器可接受的字符集。
action 設置或返回表單的action屬性。定義了當表單被提交時數據被送往何處。
enctype 設置或返回表單用來編碼內容的 MIME 類型。如果表單沒有 enctype 屬性,那麼當提交文本時的默認值是 “application/x-www-form-urlencoded”。當 input type 是 “file” 時,值是 “multipart/form-data”。
id 設置或返回表單的id。
length 返回表單中的元素數目。
method 設置或返回將數據發送到服務器的HTTP 方法。如:get、post等。
name 設置或返回表單的名稱。
target 設置或返回表單提交結果的Frame 或 Window 名。值包含_blank|_parent|_self|_top中的一個。

處理表單數據的基本過程是:數據從web表單(form)發送到PHP代碼,經過處理再生成HTML輸出。它的處理原理是:當PHP處理一個頁面的時候會檢查URL、表單數據、上傳文件、可用cookie、Web服務器和環境變量,如果有可用信息,就可以通過PHP訪問自動全局變量數組$_GET$_POST$_FILES$_COOKIE$_SERVER$_ENV得到。

表單基本結構

表單的基本結構是由<from></form>標識包裹的區域:

<html>
    <head>
        <title>Example</title>
    </head>
    <body>
        <form action="#" method="POST" enctype="multipart/form-data">
            .....
        </form>
    </body>
</html>

get和post方法

在PHP中使用get和post接收來自HTML表單的值,在form表單中定義PHP的接收方式和接收地址。

get和post的區別

  1. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指定的URL地址。這個過程是不會反映在URL中的。
  2. get傳送的數據量較小,不能大於2KB,這主要是因爲受URL長度限制。post傳送的數據量較大,一般被默認爲不受限制。
  3. get安全性非常低,post安全性較高,但是get執行效率比post好。
  4. get是form的默認方法。

獲取表單值

在form表單中,action屬性定義提交表單的地址,method屬性定義提交的方法。

【示例】

<!-- user.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Example</title>
</head>
<body>
    <form action="user.php" method="post">
        用戶名:<input type="text" name="user">
        <br />
        密碼:<input type="password" name="pwd">
        <br />
        生日:<input type="date" name="bday">
        <br />
        <input type="radio" name="sex" value="male">女性
        <input type="radio" name="sex" value="famale">男性
        <br />
        <!-- checkbox的name必須使用數組形式命名,否則PHP只能接收到最後一個被選的值-->
        <input type="checkbox" name="vehicle[]" value="Bike">自行車
        <input type="checkbox" name="vehicle[]" value="Car">汽車
        <br />
        <select name="car">
            <option value="volo">Volvo</option>
            <option value="saab">Saab</option>
            <option value="mercedes">Mercedes</option>
            <option value="audi">Audi</option>
        </select>
        <br />
        <input type="submit" value="提交">
    </form>
</body>
</html>

網頁效果:

在這裏插入圖片描述

代碼中定義接收表單值的地址是user.php,接收方式是post,當用戶點擊提交按鈕後,會將數據發送到user.php中,下面我們創建user.php來接收數據。

// user.php
<?php
echo "<pre>";
var_dump($_POST);
echo "</pre>";
?>

程序輸出結果:

在這裏插入圖片描述

如果form中選擇使用get方式上傳數據,那麼將user.php中的$_POST改爲$_GET即可。使用get方式點擊提交按鈕後,瀏覽器URL變成了如下形式:

user.php?user=admin&pwd=admin&bday=2020-03-08&sex=famale&vehicle[]=Bike&car=mercedes可以看到我們所有的數據都是明文傳送的。得到的數據結果是一樣的。

處理上傳文件

HTML中使用type="file"類型的表單可向服務器上傳文件,服務端使用PHP接收文件數據和接收普通表單元素數據的處理方法不同,必須在form表單中定義enctype="multipart/form-data"

【示例】

<!-- file.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>fileupload</title>
</head>
<body>
    <form action="file.php" enctype="multipart/form-data" method="post" name="upfile">
    上傳文件:<input type="file" name="filename" />
    <input type="submit" value="上傳" />
    </form>
</body>
</html>

網頁效果:

在這裏插入圖片描述

file.php文件代碼如下:

<?php
echo "<pre>";
var_dump($_POST);
var_dump($_FILES);
echo "</pre>";
if ($_FILES["filename"]["error"] > 0) {
    echo "錯誤:".$_FILES["filename"]["error"] . "<br />";
} else {
    print_r($_FILES["filename"]);
    if (is_uploaded_file($_FILES["filename"]['tmp_name'])) {
        $upfile = $_FILES["filename"];
        // 獲取數組裏面的值
        $name = $upfile["name"];    // 獲取上傳文件的文件名
        $type = $upfile["type"];    // 獲取上傳文件的類型
        $size = $upfile["size"];    // 獲取上傳文件的大小
        $tmp_name = $upfile["tmp_name"];    // 獲取上傳文件的臨時存放路徑
        // 移動上傳文件到指定目錄
        move_uploaded_file($tmp_name, './upload/'.$name);
    }
}
?>

程序輸出結果:

在這裏插入圖片描述

從輸出結果可以看到var_dump($_POST);的內容爲空,表明在使用file類型表單提交數據時並不使用$_POST接收數據,而是使用$_FILES來接收。

PHP中使用move_uploaded_file函數將上傳的文件移動到指定位置。

另外,在PHP配置文件php.ini中默認上傳文件的大小隻有2MB,在上傳大文件時需要對配置文件進行修改。php.ini中有關上傳文件的設置如下:

  • file_uploads:是否允許HTTP文件上傳,默認值爲On,允許HTTP文件上傳,次選項不能設置爲Off。
  • upload_tmp_dir:文件上傳的臨時存放目錄。如果沒有設定,那麼PHP會使用系統默認的臨時目錄。該選項默認爲空,如果不配置這個選項,文件上傳功能就無法實現。
  • upload_max_filesize:上傳文件的最大尺寸。這個選項默認值爲2MB,即文件上傳大小爲2MB,如果想上傳一個50MB的文件,就必須設定upload_max_filesize=50M。僅設置upload_max_filesize=50M還是無法實現大文件的上傳功能,還必須修改php.ini文件中的post_max_size選項。
  • post_max_size:通過表單POST給PHP所能接收的最大值,包括表單裏的所有值,默認爲8MB。如果POST數據超出限制,那麼$_POST$_FILES將會爲空。要上傳大文件,必須設定該選項值大於upload_max_filesize選項的值,如:設置了upload_max_filesize=50M,這裏就可以設置post_max_size=100M。另外,如果啓用了內存限制,那麼該值應當小於memory_limit選項的值。
  • max_execution_time:每個PHP頁面運行的最大時間值(單位秒),默認爲30秒。當我們上傳一個較大的文件時,如50MB,很可能要幾分鐘才能上傳完,但PHP默認頁面最久執行時間爲30秒,超過30秒該腳本就停止執行,導致出現無法打開網頁的情況,因此可以把該值設置得較大些,如max_execution_time=600。如果設置爲0,就表示無時間限制。
  • max_input_time:每個PHP腳本解析請求數據所用的時間(單位秒),默認爲60秒。當我們上傳大文件時,可以將這個值設置得較大些。如果設置爲0,就表示無時間限制。
  • memory_limit:這個選項用來設置單個PHP腳本所能申請到的最大內存空間。這有助於防止腳本消耗光服務器上的可用內存。如果不需要任何內存上的限制將其設置爲-1.

對URL傳遞的參數進行編碼

PHP對URL中傳遞的參數進行編碼,即可以實現對所傳遞數據的加密,又可以對無法通過瀏覽器傳遞的字符進行傳遞。要實現次操作一般使用urlencode()rawurlencode()函數。而對此過程的反向操作就是使用urldecode()rawruldecode()函數。

  1. urlencode()

    urlencode(string $str):string
    

    此函數便於將字符串編碼並將其用於 URL 的請求部分,同時它還便於將變量傳遞給下一頁。
    該函數返回字符串,此字符串中除了-_. 之外的所有非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼爲加號(+)。此編碼與WWW表單POST數據的編碼方式是一樣的,同時與application/x-www-form-urlencoded的媒體類型編碼方式一樣。

  2. urldecode()

    urldecode(string $str):string
    

    該函數解碼給出的已編碼字符串中的任何%##。 加號(’+’)被解碼成一個空格字符。

  3. rawurlencode()

    rawurlencode(string $str):string
    

    該函數根據 » RFC 3986 編碼指定的字符。

    在PHP5.3.0之前,rawurlencode » RFC 1738 來編碼波浪線。

  4. rawurldecode()

    rawurldecode(string $str):string
    

    返回字符串,此字符串中百分號(%)後跟兩位十六進制數的序列都將被替換成原義字符。

【示例】

<?php
$user = '張三 李四';    // 定義變量
// 對字符串進行編碼
$link1 = "index.php?userid=" . urlencode($user) . "<br />";
$link2 = "index.php?userid=" . rawurlencode($user) . "<br />";
echo $link1 . $link2;
// 對字符串進行解碼
echo urldecode($link1) . "<br />";
echo urldecode($link2) . "<br />";
echo rawurldecode($link2);
?>

程序輸出結果:

在這裏插入圖片描述

從輸出結果可以看出urlencode()rawurlencode()的區別在於對空格的編碼上,前者使用“+”編碼空格,後者使用“%20”編碼空格。

如果配合JS處理頁面信息,要注意urlencode()函數使用“+”代表空格會與JS代碼衝突。因此在與JS交互時,應使用’rawurlencode()'來編碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章