1. 程式人生 > >PHP and HTML Form

PHP and HTML Form

PHP 中的 $_GET 和 $_POST 變數用於檢索表單中的資訊 當處理 HTML 表單時,PHP能把來自 HTML 頁面中的表單元素自動變成PHP指令碼元素。

PHP 表單和使用者輸入

form.html

<!--當用戶填寫完上面的表單並點選提交按鈕時,表單的資料會被送往名為 "welcome.php" 的 PHP 檔案-->
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年齡: <input type="text" name="age"
>
<input type="submit" value="提交"> </form>

welcome.php

歡迎<?php echo $_POST["fname"]; ?>!<br>
你的年齡是 <?php echo $_POST["age"]; ?>  歲。
PHP 獲取下拉選單的資料
  1. 下拉選單單選 表單使用 GET 方式獲取資料,action 屬性值為空表示提交到當前指令碼,通過 select 的 name 屬性獲取下拉選單的值:
<?php
$q = isset($_GET['q'])? htmlspecialchars
($_GET['q']) : ''; if($q) { if($q =='RUNOOB') { echo '菜鳥教程<br>http://www.runoob.com'; } else if($q =='GOOGLE') { echo 'Google 搜尋<br>http://www.google.com'; } else if($q =='TAOBAO') { echo '淘寶<br>http://www.taobao.com'
; } } else { ?>
<form action="" method="get"> <select name="q"> <option value="">選擇一個站點:</option> <option value="RUNOOB">Runoob</option> <option value="GOOGLE">Google</option> <option value="TAOBAO">Taobao</option> </select> <input type="submit" value="提交"> </form> <?php } ?>
  1. 下拉選單多選 設定 select name=“q[]” 以陣列的方式獲取,使用 POST 方式提交:
<?php
$q = isset($_POST['q'])? $_POST['q'] : ''; // check whether q is empty
if(is_array($q)) {
    $sites = array(
            'RUNOOB' => '菜鳥教程: http://www.runoob.com',
            'GOOGLE' => 'Google 搜尋: http://www.google.com',
            'TAOBAO' => '淘寶: http://www.taobao.com',
    );
    foreach($q as $val) {
        // PHP_EOL 為常量,用於換行
        echo $sites[$val] . PHP_EOL;
    }
      
} else {
?>
<form action="" method="post"> 
    <select multiple="multiple" name="q[]">
    <option value="">選擇一個站點:</option>
    <option value="RUNOOB">Runoob</option>
    <option value="GOOGLE">Google</option>
    <option value="TAOBAO">Taobao</option>
    </select>
    <input type="submit" value="提交">
    </form>
<?php
}
?>
  1. radio - 單選按鈕表單 PHP 單選按鈕表單中 name 屬性的值一致,value 值不同.
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
        if($q =='RUNOOB') {
                echo '菜鳥教程<br>http://www.runoob.com';
        } else if($q =='GOOGLE') {
                echo 'Google 搜尋<br>http://www.google.com';
        } else if($q =='TAOBAO') {
                echo '淘寶<br>http://www.taobao.com';
        }
} else {
?><form action="" method="get"> 
    <input type="radio" name="q" value="RUNOOB" />Runoob
    <input type="radio" name="q" value="GOOGLE" />Google
    <input type="radio" name="q" value="TAOBAO" />Taobao
    <input type="submit" value="提交">
</form>
<?php
}
?>
  1. checkbox - 複選框 可以選多個值
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
    $sites = array(
            'RUNOOB' => '菜鳥教程: http://www.runoob.com',
            'GOOGLE' => 'Google 搜尋: http://www.google.com',
            'TAOBAO' => '淘寶: http://www.taobao.com',
    );
    foreach($q as $val) {
        // PHP_EOL 為常量,用於換行
        echo $sites[$val] . PHP_EOL;
    }
      
} else {
?><form action="" method="post"> 
    <input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br> 
    <input type="checkbox" name="q[]" value="GOOGLE"> Google<br> 
    <input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
    <input type="submit" value="提交">
</form>
<?php
}
?>
表單元素

HTML 表單提交資料程式碼如下

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

$_SERVER[“PHP_SELF”]是超級全域性變數,返回當前正在執行指令碼的檔名,與 document root相關; htmlspecialchars() 函式把一些預定義的字元轉換為 HTML 實體。

& (和號) 成為 &amp; " (雙引號) 成為 &quot; ’ (單引號) 成為 &#039; < (小於) 成為 &lt; > (大於) 成為 &gt;

XSS 攻擊(跨站指令碼攻擊)

惡意攻擊者往Web頁面裡插入惡意html程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html程式碼會被執行,從而達到惡意使用者的特殊目的。

如果我們直接這樣寫程式碼:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
<!--instantiation-->
<form method="post" action="test_form.php">

那麼,如果我們在url欄裡輸入如下地址:

則將被解析為可執行的惡意程式碼

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

此時,利用htmlspecialchars() 函式則可以避免此類問題,我們修改程式碼如下:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

上述程式碼將會被解析為下述程式碼形式,避免了XSS漏洞。

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">
使用 PHP 驗證表單資料

通過$_SERVER[“REQUEST_METHOD”]來檢測表單是否被提交 ; 當用戶提交表單時:

  1. 使用 PHP trim() 函式去除使用者輸入資料中不必要的字元 (如:空格,tab,換行);
  2. 使用PHP stripslashes()函式去除使用者輸入資料中的反斜槓 (); 對使用者所有提交的資料都通過htmlspecialchars() 函式處理。

總結為程式碼如下:

function test_input($data)
{
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
Form 必需欄位

利用empty($_POST[“xxx”])函式和if-else語句進行判斷

顯示錯誤資訊

can add following code:

<span class="error"><?php echo $Err;?></span>
驗證名稱

preg_match(string $pattern, string $subject) 在 subject 字串中搜索與 pattern 給出的正則表示式相匹配的內容。如果提供了 matches ,則其會被搜尋的結果所填充; $matches[0] 將包含與整個模式匹配的文字,$matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文字,以此類推。

int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )

驗證郵件 檢測 e-mail 地址是否合法

$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
  $emailErr = "非法郵箱格式"; 
}

驗證 URL 檢測URL地址是否合法

$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
  $websiteErr = "非法的 URL 的地址"; 
}
$_GET 和 $_POST 變數
$_GET $_POST
收集來自 method=“get” 的表單中的值 收集來自 method=“post” 的表單中的值
表單域的名稱會自動成為 $_GET 陣列中的鍵 表單域的名稱會自動成為 $_POST 陣列中的鍵
變數名和值顯示在URL 中,對敏感資訊不安全 變數名和值不可見
可加入收藏夾 不可加入收藏夾
值不能超過2000字元 傳送資訊的量無限制,但一般預設為8MB,可通過php.ini 檔案中的 post_max_size 進行更改