PHP --- 表單處理
PHP 超全局變量 $_GET 和 $_POST 用于收集表單數(shù)據(jù)
一吁恍、GET 和 POST
1锅锨、GET 和 POST 都創(chuàng)建數(shù)組(例如雕欺,array( key => value, key2 => value2, key3 => value3, ...))富雅。此數(shù)組包含鍵/值對(duì)蒲犬,其中的鍵是表單控件的名稱,而值是來(lái)自用戶的輸入數(shù)據(jù)。
2蛇捌、GET 和 POST 被視作 $_GET 和 $_POST抚恒。它們是超全局變量,這意味著對(duì)它們的訪問(wèn)無(wú)需考慮作用域 - 無(wú)需任何特殊代碼络拌,您能夠從任何函數(shù)俭驮、類或文件訪問(wèn)它們。
3春贸、$_GET 是通過(guò) URL 參數(shù)傳遞到當(dāng)前腳本的變量數(shù)組混萝。
4、$_POST 是通過(guò) HTTP POST 傳遞到當(dāng)前腳本的變量數(shù)組萍恕。
二逸嘀、何時(shí)使用 GET?
通過(guò) GET 方法從表單發(fā)送的信息對(duì)任何人都是可見的(所有變量名和值都顯示在 URL 中)允粤。GET 對(duì)所發(fā)送信息的數(shù)量也有限制崭倘。限制在大于 2000 個(gè)字符。不過(guò)类垫,由于變量顯示在 URL 中司光,把頁(yè)面添加到書簽中也更為方便。
GET 可用于發(fā)送非敏感的數(shù)據(jù)悉患。
注釋:絕不能使用 GET 來(lái)發(fā)送密碼或其他敏感信息飘庄!
三、何時(shí)使用 POST购撼?
通過(guò) POST 方法從表單發(fā)送的信息對(duì)其他人是不可見的(所有名稱/值會(huì)被嵌入 HTTP 請(qǐng)求的主體中),并且對(duì)所發(fā)送信息的數(shù)量也無(wú)限制谴仙。
此外 POST 支持高階功能迂求,比如在向服務(wù)器上傳文件時(shí)進(jìn)行 multi-part 二進(jìn)制輸入。
不過(guò)晃跺,由于變量未顯示在 URL 中揩局,也就無(wú)法將頁(yè)面添加到書簽。
提示:開發(fā)者偏愛 POST 來(lái)發(fā)送表單數(shù)據(jù)掀虎。
表單的 HTML 代碼是這樣的:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
當(dāng)提交此表單時(shí)凌盯,通過(guò) method="post" 發(fā)送表單數(shù)據(jù)。
- 什么是 $_SERVER["PHP_SELF"] 變量烹玉?
$_SERVER["PHP_SELF"] 是一種超全局變量驰怎,它返回當(dāng)前執(zhí)行腳本的文件名。
因此二打,$_SERVER["PHP_SELF"] 將表單數(shù)據(jù)發(fā)送到頁(yè)面本身县忌,而不是跳轉(zhuǎn)到另一張頁(yè)面。這樣,用戶就能夠在表單頁(yè)面獲得錯(cuò)誤提示信息症杏。
$_SERVER["PHP_SELF"] 變量能夠被黑客利用装获!
- 什么是 htmlspecialchars() 函數(shù)?
通過(guò)使用 htmlspecialchars() 函數(shù)能夠避免 $_SERVER["PHP_SELF"] 被利用厉颤。
htmlspecialchars() 函數(shù)把特殊字符轉(zhuǎn)換為 HTML 實(shí)體穴豫。這意味著 < 和 > 之類的 HTML 字符會(huì)被替換為 < 和 > 。這樣可防止攻擊者通過(guò)在表單中注入 HTML 或 JavaScript 代碼(跨站點(diǎn)腳本攻擊)對(duì)代碼進(jìn)行利用逼友。
通過(guò)PHP驗(yàn)證表單的步驟
1精肃、通過(guò) PHP 的 htmlspecialchars() 函數(shù)傳遞所有變量。
2翁逞、在用戶提交該表單時(shí)肋杖,我們還要做兩件事:
a、(通過(guò) PHP trim() 函數(shù))去除用戶輸入數(shù)據(jù)中不必要的字符(多余的空格挖函、制表符状植、換行)
b、(通過(guò) PHP stripslashes() 函數(shù))刪除用戶輸入數(shù)據(jù)中的反斜杠(\\)
3怨喘、創(chuàng)建一個(gè)檢查函數(shù)
檢查函數(shù)命名為 test_input()津畸。
通過(guò) test_input() 函數(shù)檢查每個(gè) $_POST 變量,腳本是下面<?php --- ?>中間的部分:
<?php
// 定義變量并設(shè)置為空值
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
// 創(chuàng)建的界面效果如下圖
<h2>PHP 驗(yàn)證實(shí)例</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
姓名:<input type="text" name="name">
<br><br>
電郵:<input type="text" name="email">
<br><br>
網(wǎng)址:<input type="text" name="website">
<br><br>
評(píng)論:<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性別:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的輸入:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
** 細(xì)節(jié)驗(yàn)證 **
1必怜、檢查名字是都只包含字母和空格
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允許字母和空格肉拓!";
}
注釋:preg_match() 函數(shù)檢索字符串的模式,如果模式存在則返回 true梳庆,否則返回 false暖途。
2、驗(yàn)證E-mail的語(yǔ)法是否有效,是否包含 (@) 和 (.)兩個(gè)符號(hào):
$email = test_input($_POST["email"]);
if (!preg_match("/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/",$email)) {
$emailErr = "無(wú)效的 email 格式膏执!";
}
3驻售、檢查 URL 地址語(yǔ)法是否有效(這條正則表達(dá)式同時(shí)允許 URL 中的斜杠)。
$website = test_input($_POST["website"]);
if (!preg_match("/\\b(?:(?:https?|ftp):\\/\\/|www\\.)[-a-z0-9+&@#\\/%?=~_|!:,.;]*[-a-z0-9+&@#\\/%
=~_|]/i",$website)) {
$websiteErr = "無(wú)效的 URL";
}
檢測(cè)代碼與之前的代碼結(jié)合:
<?php
// 定義變量并設(shè)置為空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "姓名是必填的";
} else {
$name = test_input($_POST["name"]);
// 檢查姓名是否包含字母和空白字符
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允許字母和空格";
}
}
if (empty($_POST["email"])) {
$emailErr = "電郵是必填的";
} else {
$email = test_input($_POST["email"]);
// 檢查電子郵件地址語(yǔ)法是否有效
if (!preg_match("/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/",$email)) {
$emailErr = "無(wú)效的 email 格式";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// 檢查 URL 地址語(yǔ)法是否有效(正則表達(dá)式也允許 URL 中的斜杠)
if (!preg_match("/\\b(?:(?:https?|ftp):\\/\\/|www\\.)[-a-z0-9+&@#\\/%?=~_|!:,.;]*[-a-z0-9+&@#\\/%=~_|]/i",$website)) {
$websiteErr = "無(wú)效的 URL";
}
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "性別是必選的";
} else {
$gender = test_input($_POST["gender"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 驗(yàn)證實(shí)例</h2>
<p><span class="error">* 必需的字段</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
姓名:<input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
電郵:<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
網(wǎng)址:<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
評(píng)論:<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性別:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的輸入:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>