PHP --- 學(xué)習(xí)筆記(二)

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ì)被替換為 &lt; 和 &gt; 。這樣可防止攻擊者通過(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;
?>


111.png

** 細(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;
?>
222.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末更米,一起剝皮案震驚了整個(gè)濱河市欺栗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌征峦,老刑警劉巖迟几,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異栏笆,居然都是意外死亡类腮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蛉加,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)存哲,“玉大人因宇,你說(shuō)我怎么就攤上這事∷钔担” “怎么了察滑?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)修肠。 經(jīng)常有香客問(wèn)我贺辰,道長(zhǎng),這世上最難降的妖魔是什么嵌施? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任饲化,我火速辦了婚禮,結(jié)果婚禮上吗伤,老公的妹妹穿的比我還像新娘吃靠。我一直安慰自己,他們只是感情好足淆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布巢块。 她就那樣靜靜地躺著,像睡著了一般巧号。 火紅的嫁衣襯著肌膚如雪族奢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天丹鸿,我揣著相機(jī)與錄音坎背,去河邊找鬼泛豪。 笑死傅寡,一個(gè)胖子當(dāng)著我的面吹牛哟绊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播门怪,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庭敦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了薪缆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伞广,失蹤者是張志新(化名)和其女友劉穎拣帽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚼锄,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡减拭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了区丑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拧粪。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡修陡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出可霎,到底是詐尸還是另有隱情魄鸦,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布癣朗,位于F島的核電站拾因,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旷余。R本人自食惡果不足惜绢记,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望正卧。 院中可真熱鬧蠢熄,春花似錦、人聲如沸炉旷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砾跃。三九已至骏啰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抽高,已是汗流浹背判耕。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翘骂,地道東北人壁熄。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碳竟,于是被迫代替她去往敵國(guó)和親草丧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理莹桅,服務(wù)發(fā)現(xiàn)昌执,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 1诈泼、雙引號(hào)和單引號(hào)的區(qū)別 雙引號(hào)解釋變量懂拾,單引號(hào)不解釋變量 雙引號(hào)里插入單引號(hào),其中單引號(hào)里如果有變量的話铐达,變量解...
    尋夢(mèng)xunm閱讀 321評(píng)論 1 7
  • 好文章要讓更多的人知道a场!本文轉(zhuǎn)載自:開源社區(qū)原文鏈接:https://www.kysq.com/article/...
    php_bruce閱讀 1,160評(píng)論 1 28
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停瓮孙,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,182評(píng)論 22 257
  • 曾經(jīng)看過(guò)一句話唐断,讓自己每次出門都成為一次旅行选脊,而不是旅游! 心得就是國(guó)內(nèi)脸甘,還是國(guó)外恳啥,盡量選擇自由行!可以選擇性價(jià)比...
    doubleK閱讀 248評(píng)論 0 1