表单及数据提交、表单的作用、服务端接收提交的数据、php处理数据流程、文件域及文件域中数据处理、php展示数据(响应)
表單及數據提交:
表單的作用:
用于收集相關信息;html中有專門提交數據的標簽,可以很容易的收集用戶輸入的信息,這個標簽有兩個重要的屬性:action表單提交的地址和method以什么方式提交表單,通常后面是get和post。
通常使用有name屬性及type屬性值為submit或者image的input按鈕來提交數據;button默認的type屬性值就是submit,所以他也可以提交數據。
提交方式:
method可以設置表單的提交方式,提交方式有很多種,一般會使用get或post這兩種方式提交方式,其區別:
.get:表單數據是通過URL中的?參數傳遞到服務端的,可以在地址欄看到提交的內容,數據長度有限,因為URL地址長度為2000字符左右,不能使用get發送密碼等敏感信息。
.post:表單數據是通過請求體傳到服務端的,在界面上是看不到的,可以提交任何類型的數據,包括文件,由于界面上看不到,瀏覽器不儲存,更安全。
服務端接收提交的數據:
在form標簽action指定的php文件中使用下面的超全局變量即可獲取到form表單中提交的數據:
//$_GET接收URL地址?后面get方式提交過來的數據,其用法是在后面跟上input中name屬性值,如:$_GET[username];//$_POST接收以post方式提交過來請求體中的數據,其用法是在后面跟上input中name屬性值,如:$_POST[password]; $_REQUEST;//get或post方式提交的數據都能獲取到,其用法是在后面跟上input中name屬性值,如:$_REQUEST[avatar];注意:為了便于維護,我們通常將表單數據提交給當前的頁面本身,即php代碼放到當前html頁面前面,action的提交地址也可使用統一的:$_SERVER[‘PHP_SELF’];此時也是便于維護的,行業中對程序應對變化的能力稱之為魯棒性。
<?php// 由于代碼執行順序,在同一個文件中做數據處理時,應當先做判斷是否有數據,在有數據的情況下在繼續處理數據,通常使用$_SERVER['REQUEST_METHOD']判斷提交方式:if($_SERVER['REQUEST_METHOD']==='POST'){var_dump($_POST);};?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><!-- 所有選框都應該有name屬性,數據才可以正常被php接收使用 --><form action="test.php" method='post'><input type="text" name='username'><input type="password" name='password'><input type="submit" value='登錄'></form><!-- 單選框 ,若要實現多選一,那么多個type="radio"的input中name屬性值應該設置為相同的:--><form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'><input type="radio" name='sex' value='man'>男<input type="radio" name='sex' value='woman'>女<button>提交</button></form><!-- 復選框 , 如果要提交多個選項,那么在多個type="checkbox"的input中name屬性值的后面要加[]來實現多選;若不加[],則不能實現多選,最后一項會把前面的覆蓋掉--><form action='<?php //echo $_SERVER['PHP_SELF']; ?>' method='post'><input type="checkbox" name='ball[]' value='籃球'>籃球<input type="checkbox" name='ball[]' value='足球'>足球<input type="checkbox" name='ball[]' value='排球'>排球<input type="checkbox" name='ball[]' value='羽毛球'>羽毛球<input type="checkbox" name='ball[]' value='棒球'>棒球<button>提交</button></form><!-- 下拉選框 ,帶有name屬性的select標簽中包含多個option標簽--><form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'><select name="math" id=""><option value="1">激活</option><option value="2">未激活</option><option value="3">未知</option></select><button>提交</button></form><!-- 選文件,type屬性值為file的input,且要有name屬性 --><form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'><input type="file" name='files'><button>提交</button></form><!-- 注意:表單提交中有value屬性的會把value屬性的值提交到php中 --></body></html>php處理數據流程:
處理表單提交過來的數據總結起來有三大步驟:
1.接收數據并校驗
2.數據持久化
3.數據響應,如下面一個簡單登錄頁面的服務端處理代碼(實際開發中并不會這樣嵌套if-else,而是將校驗代碼封裝到一個函數,利用return結束后面代碼執行):
//php部分:<?php // $_SERVER['REQUEST_METHOD']判斷請求方式的方式來解決代碼執行順序造成數據沒有加載完成的問題:if($_SERVER['REQUEST_METHOD']==='POST'){//1.校驗數據:// 當沒有提交name屬性值為username的input時:if(empty($_POST['username'])){echo '輸入用戶名';}else{// 當沒有提交name屬性值為password的input時:if(empty($_POST['password'])){echo '輸入密碼';}else{// 當沒有提交name屬性值為pass的input時:if(empty($_POST['pass'])){echo '請確認密碼';}else{//當兩次輸入的密碼不一致時:if($_POST['password']!=$_POST['pass']){echo '兩次輸入密碼不一致';}else{// 當服務協議提交且值為on時:if(!(isset($_POST['agree']) && $_POST['agree']==='on')){echo '必須同意協議';}else{//2.接收數據:$usernaem=$_POST['username'];$password=$_POST['password'];//3.數據持久化:保存到本地文件或數據庫(見下面php操作數據庫):file_put_contents('users.txt',$usernaem . '|' . $password . "\n",FILE_APPEND);//為了追加多條數據這里傳入常量FILE_APPEND即可。}}}}}}// 為了解決if-else嵌套太深的問題一般將代碼這樣寫:function data(){// 為了下面的提示信息$message能正常顯示,這里需要用global把$message設置為全局變量,否則不顯示。或者更改 $message ----> $GLOBALS['message']也可以更改message為全局變量。global $message;if(empty($_POST['username'])){$message = '輸入用戶名';return;};if(empty($_POST['password'])){$message = '輸入密碼';return;};if(empty($_POST['pass'])){$message = '請確認密碼';return;};if($_POST['password']!=$_POST['pass']){$message = '兩次輸入密碼不一致';return;};if(!(isset($_POST['agree']) && $_POST['agree']==='on')){$message = '必須同意協議';return;};$usernaem=$_POST['username'];$password=$_POST['password'];file_put_contents('users.txt',$usernaem . '|' . $password . "\n",FILE_APPEND);//為了追加多條數據這里傳入常量FILE_APPEND即可。};//當請求方式正確時調用數據的函數:if($_SERVER['REQUEST_METHOD']==='POST'){data(); };?>//html部分: <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'><table><tr><td><label for="username">用戶名</label></td><td><input type="text" name='username' id='username' value='<?php echo isset($_POST['username']) ? $_POST['username'] : '' ?>'></td></tr><tr><td><label for="password">密碼</label></td><td><input type="password" name='password' id='password'></td></tr><tr><td><label for="confirm">確認密碼</label></td><td><input type="password" name='confirm' id='pass'></td></tr><tr><td></td><td><input type="checkbox" name='agree' id='agree' value='on'>同意協議</td></tr><?php if(isset($message)): ?><tr><td></td><td><?php echo $message; ?></td></tr><?php endif ?><tr><td></td><td><button>注冊</button></td></tr></table> </form></body></html>文件域及文件域中數據處理:
處理文件域中數據思路和處理簡單的input數據思路一致,但是需要注意:form中這兩個屬性應該設置成method=‘post’ ,enctype=‘multipart/form-data’;具體如上傳圖片例子:
<?php//封裝行數的方式接收數據校驗持久化:function upload(){//把$message變為全局變量,還可以將下面的$message直接用$GLOBSALS['message']替換也可以提升為全局變量。global $message;if(!isset($_FILES['avatar'])){//判斷用戶提交的表單中是否有name屬性值為avatar的文件域$message='上傳失敗1';return;};$avatar=$_FILES['avatar'];//將接收到的數據賦值給變量,$avatar在這里的數據結構是:// array(1) {// ["file"]=>// array(5) {// ["name"]=>// string(16) "教程目錄.jpg"// ["type"]=>// string(10) "image/jpeg"// ["tmp_name"]=>// string(27) "C:\Windows\Temp\php3124.tmp"//網站臨時目錄// ["error"]=>// int(0)// ["size"]=>// int(1144467)// }// }// 多個文件上傳用循環的方式:因為文件域接收到的數據是以數組的形式儲存for($i=0;$i<count($avatar['name']);$i++){if($avatar['error'][$i] != UPLOAD_ERR_OK){//如果 $avarat['error'] !== 0 ,說明上傳文件有錯誤,一般為服務端沒有接收到文件,這里的0需要語義化為:UPLOAD_ERR_OK$message='上傳失敗2';return;};$source = $avatar['tmp_name'][$i];//文件在服務端的臨時目錄$target = 'events/' . $avatar['name'][$i];//把數據要持久化的文件目錄$result = move_uploaded_file($source,$target);//移動服務端臨時目錄中的文件到需要數據持久化的文件目錄,并返回一個布爾值。if(!$result){$message = '上傳失敗3';return;};};$message='上傳成功';};if($_SERVER['REQUEST_METHOD']==='POST'){// 接收一個文件使用超全局成員 $_FILES// var_dump($_FILES);upload();var_dump($_FILES['avatar']);};?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><!-- 注意:如果表單中有文件域,必須將表單的method設置為post enctype設置為multipart/form-dataenctype的默認值為urlencoded 格式為:key1=value1&key2=value2form表單中屬性autocomplete='off':關閉input輸入時的自動輸入提示accept=''可以限制文件域默認選擇文件的類型,可以手動選擇為 所有文件 值是:MIME type的值,解決不了根本問題--><form action="<?php echo $_SERVER['PHP_SELF']; ?>" method='post' enctype='multipart/form-data'><input type="file" name='avatar[]' multiple><!--注意:當文件域要上傳多個文件時,name屬性值中后面加[],并且設置multiple屬性--><?php if(isset($message)): ?><p><?php echo $message; ?></p><?php endif ?><button>提交</button></form></body></html>php展示數據(響應):
數據展示思路:文件讀取----JSON反序列化-----數組遍歷-----php與html混編;
把JSON格式的字符串轉化為對象的過程叫做反序列化;
解析字符串:字符串轉化為了數組的過程:
<?php// 1.讀取test.json的數據或數據庫中的數據(見下面php操作數據庫):$contents=file_get_contents('test.json');//得到JSON格式的字符串//2.json_decode($contents);//json字符串反序列化,得到的每一項是一個對象,php中訪問對象的值用 -> //如果需要返回關聯數組,則需要在json_decode($congents,true)中傳入第二個參數的值為true:$data=json_decode($contents,true);//得到關聯數組數據,作為前端開發者,沒必要深入學習php,所以采用關聯數組;值為false時:轉換為php中的stdClass類型對象?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><!--3.通過foreach遍歷關聯數組:--><?php foreach($data as $key): ?>//4.將數據響應到頁面:執行第一次循環則響應json數據中的第一個{}中的數據,下一次循環以此類推<?php echo $key['id']; ?><?php echo $key['title']; ?><?php echo $key['artist']; ?>//{}中有數組繼續遍歷:<?php foreach($key['images'] as $src): ?><?php echo $src; ?><?php endforeach ?><?php echo $key['source']; ?><?php echo $key[' id ']; ?<?php endforeach ?></body></html>提示:本文圖片等素材來源于網絡,若有侵權,請發郵件至郵箱:810665436@qq.com聯系筆者刪除。
筆者:苦海
總結
以上是生活随笔為你收集整理的表单及数据提交、表单的作用、服务端接收提交的数据、php处理数据流程、文件域及文件域中数据处理、php展示数据(响应)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 片段_python片段程序
- 下一篇: 怎么下载php源文件,设计了一个php下