1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>菜鳥教程(runoob.com)</title> 6 <style> 7 .error {color: #FF0000;} 8 </style> 9 </head> 10 <body> 11 12 -------------------------------------------------------------------------------------- 13 <?php 14 // (1) 定義變量並默認設置爲空值 --> since line 18: 沒有報錯,有則驗證格式 15 $nameErr = $emailErr = $genderErr = $websiteErr = ""; 16 $name = $email = $gender = $comment = $website = ""; 17 18 if ($_SERVER["REQUEST_METHOD"] == "POST") 19 { 20 if (empty($_POST["name"])) 21 { 22 $nameErr = "名字是必需的"; 23 } 24 else 25 { 26 $name = test_input($_POST["name"]); 27 // 檢測名字是否只包含字母跟空格,preg_match正則匹配 28 if (!preg_match("/^[a-zA-Z ]*$/",$name)) 29 { 30 $nameErr = "只容許字母和空格"; 31 } 32 } 33 34 ------------------------------------------------------------- 35 if (empty($_POST["email"])) 36 { 37 $emailErr = "郵箱是必需的"; 38 } 39 else 40 { 41 $email = test_input($_POST["email"]); 42 // 檢測郵箱是否合法 43 if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) 44 { 45 $emailErr = "非法郵箱格式"; 46 } 47 } 48 49 ------------------------------------------------------------- 50 if (empty($_POST["website"])) 51 { 52 $website = ""; 53 } 54 else 55 { 56 $website = test_input($_POST["website"]); 57 // 檢測 URL 地址是否合法 58 if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) 59 { 60 $websiteErr = "非法的 URL 的地址"; 61 } 62 } 63 64 ------------------------------------------------------------- 65 if (empty($_POST["comment"])) 66 { 67 $comment = ""; 68 } 69 else 70 { 71 $comment = test_input($_POST["comment"]); 72 } 73 74 ------------------------------------------------------------- 75 if (empty($_POST["gender"])) 76 { 77 $genderErr = "性別是必需的"; 78 } 79 else 80 { 81 $gender = test_input($_POST["gender"]); 82 } 83 } 84 85 function test_input($data) 86 { 87 $data = trim($data); 88 $data = stripslashes($data); 89 $data = htmlspecialchars($data); 90 return $data; 91 } 92 ?> 93 -------------------------------------------------------------------------------------- 94 <h2>PHP 表單驗證明例</h2> 95 <p><span class="error">* 必需字段。</span></p> 96 97 <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 98 99 名字: <input type="text" name="name" value="<?php echo $name;?>"> 100 <span class="error">* <?php echo $nameErr;?></span> 101 <br><br> 102 E-mail: <input type="text" name="email" value="<?php echo $email;?>"> 103 <span class="error">* <?php echo $emailErr;?></span> 104 <br><br> 105 網址: <input type="text" name="website" value="<?php echo $website;?>"> 106 <span class="error"><?php echo $websiteErr;?></span> 107 <br><br> 108 備註: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> 109 <br><br> 110 性別: 111 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 112 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 113 <span class="error">* <?php echo $genderErr;?></span> 114 <br><br> 115 <input type="submit" name="submit" value="Submit"> 116 117 </form> 118 -------------------------------------------------------------------------------------- 119 <?php 120 echo "<h2>您輸入的內容是:</h2>"; 121 echo $name; 122 echo "<br>"; 123 echo $email; 124 echo "<br>"; 125 echo $website; 126 echo "<br>"; 127 echo $comment; 128 echo "<br>"; 129 echo $gender; 130 ?> 131 132 </body> 133 </html>
Ref: [Node.js] 07 - Html and Httpphp
(1) 提交數據類型判斷html
$_SERVER['REQUEST_METHOD'] == 'POST'web
是判斷提交的數據是不是POST方式傳來的數據庫
以後,經過 _POST["fname"] 獲取包裏的具體值。後端
(2) 收集post的值瀏覽器
預約義的 $_POST 變量用於收集來自 method="post" 的表單中的值。服務器
(3) $_GET、$_POST 和 $_REQUEST 的區別?異步
$_GET 變量接受全部以 get 方式發送的請求,及瀏覽器地址欄中的 ? 以後的內容。ide
$_POST 變量接受全部以 post 方式發送的請求,例如,一個 form 以 method=post 提交,提交後 php 會處理 post 過來的所有變量。函數
$_REQUEST 支持兩種方式發送過來的請求,即 post 和 get 它均可以接受,顯示不顯示要看傳遞方法,get 會顯示在 url 中(有字符數限制),post 不會在 url 中顯示,能夠傳遞任意多的數據(只要服務器支持)。
(4) 什麼時候使用 method="get"?
[1] 在 HTML 表單中使用 method="get" 時,全部的變量名和值都會顯示在 URL 中。
註釋:因此在發送密碼或其餘敏感信息時,不該該使用這個方法!
[2] 然而,正由於變量顯示在 URL 中,所以能夠在收藏夾中收藏該頁面。在某些狀況下,這是頗有用的。
註釋:HTTP GET 方法不適合大型的變量值。它的值是不能超過 2000 個字符的。
(5) 什麼時候使用 method="post"?
從帶有 POST 方法的表單發送的信息,對任何人都是不可見的,而且對發送信息的量也沒有限制【實際上是8M】。
然而,因爲變量不顯示在 URL 中,因此沒法把頁面加入書籤。
Ref: http://www.runoob.com/php/php-forms.html
當用戶填寫完上面的表單並點擊提交按鈕時,表單的數據會被送往名爲 "welcome.php" 的 PHP 文件。
[1] 使用post提交
<html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <form action="welcome.php" method="post"> 名字: <input type="text" name="fname"> 年齡: <input type="text" name="age"> <input type="submit" value="提交"> </form> </body> </html>
[2] 服務器固然使用post來自動解析
歡迎 <?php echo $; ?>!<br> 你的年齡是 <?php echo $_POST["age"]; ?> 歲。
可見,這裏界面和邏輯未分離。
<?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 } ?>
<?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"> <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 } ?>
可見,這裏界面和邏輯未分離。
<?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 } ?>
可見,界面和邏輯未分離。
<?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 } ?>
咱們應該儘量的對用戶的輸入進行驗證(經過客戶端腳本)。瀏覽器驗證速度更快,而且能夠減輕服務器的壓力。
若是用戶輸入須要插入數據庫,您應該考慮使用服務器驗證。在服務器驗證表單的一種好的方式是,把表單的數據傳給當前頁面(異步提交的方式更好),而不是跳轉到不一樣的頁面。這樣用戶就能夠在同一張表單頁面獲得錯誤信息。用戶也就更容易發現錯誤了。
【黑客危機】 ----> Line 97
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
[1] htmlspecialchars() 函數把一些預約義的字符轉換爲 HTML 實體。
預約義的字符是:
[2] 什麼是 $_SERVER["PHP_SELF"] 變量?
詳見:http://www.runoob.com/php/php-form-validation.html
關於,界面和邏輯未分離的問題。
只是寫法看上去有點相似。JS是運行在瀏覽器上,而PHP則是純後端服務器語言。
<!DOCTYPE html> <html>
<head> <meta charset="utf-8"> <script> function validateForm() { var x = document.forms["myForm"]["fname"].value; if (x == null || x == "") { alert("須要輸入名字。"); return false; } } </script> </head>
<body> <form name="myForm" action="demo_form.php" onsubmit="return validateForm()" method="post"> 名字: <input type="text" name="fname"> <input type="submit" value="提交"> </form> </body> </html>