abstract:獲取按鈕元素并創(chuàng)建點(diǎn)擊事件。創(chuàng)建一個監(jiān)聽對象,如果監(jiān)聽對象的狀態(tài)返回值是4表示請求已經(jīng)完成并響應(yīng)就緒,再判斷一下如果返回的值是200說明查詢成功。然后新建一個p標(biāo)簽用于輸出查詢狀態(tài)。var json = JSON.parse(xhr.responseText);是把從服務(wù)器發(fā)送過來的信息轉(zhuǎn)換成js格式。如果查詢的信息返回值是1說明查詢到了對應(yīng)的信息直接輸出之前設(shè)定好的值,反之則依然。然后把登錄信息
獲取按鈕元素并創(chuàng)建點(diǎn)擊事件。
創(chuàng)建一個監(jiān)聽對象,如果監(jiān)聽對象的狀態(tài)返回值是4表示請求已經(jīng)完成并響應(yīng)就緒,再判斷一下如果返回的值是200說明查詢成功。然后新建一個p標(biāo)簽用于輸出查詢狀態(tài)。var json = JSON.parse(xhr.responseText);是把從服務(wù)器發(fā)送過來的信息轉(zhuǎn)換成js格式。如果查詢的信息返回值是1說明查詢到了對應(yīng)的信息直接輸出之前設(shè)定好的值,反之則依然。然后把登錄信息用剛才的p標(biāo)簽發(fā)送到頁面上再禁用按鈕功能,設(shè)置定時器對頁面進(jìn)行重定位跳轉(zhuǎn)。
設(shè)置請求方式為post,后臺路徑是include下的check.php文件,由于發(fā)送的是form表單請求,所以表單頭要修改一下xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
把需要發(fā)送驗(yàn)證對象的value值以字面量形式賦值給data,然后把data以json方式轉(zhuǎn)換一下數(shù)據(jù)賦值給data_json,由于直接發(fā)送的data_json數(shù)據(jù)沒有下標(biāo),下面的data就是加上下標(biāo)進(jìn)行發(fā)送方便查詢
xhr.send('data='+data_json);database.php配置一下數(shù)據(jù)庫的信息
在check.php里載入數(shù)據(jù)庫信息文件并賦值給$db,使用PDO方式連接數(shù)據(jù)庫,使用json_decode($_POST['data'])方法接收post發(fā)送過來的數(shù)據(jù)并賦值給user,實(shí)例化并賦值郵箱和密碼字段并進(jìn)行數(shù)據(jù)庫查詢。
如果查詢到的數(shù)據(jù)==1說明結(jié)果為真,那么就echo json_encode(['status'=>1,'msg'=>'登錄成功,正在跳轉(zhuǎn)...']) ;
輸出到前端頁面,前端頁面接收到數(shù)據(jù)后跳轉(zhuǎn)指定的admin.php頁面。
總結(jié)寫代碼過程中的錯誤:前臺頁面如果使用的是div而不是form,并且js里使用的是div而不是forms的話查詢是沒有任何響應(yīng)的,并且在驗(yàn)證的php頁面里不能有輸出打印標(biāo)簽,否則前臺也不顯示。數(shù)據(jù)庫配置文件需要使用return方式返回,并且數(shù)組的[]最后要加;分號結(jié)尾。
前臺代碼:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>表單提交系統(tǒng)</title> <style> *{ padding: 0; margin: 0; font-size: 14px; } form{ width: 260px; margin:130px auto; } p{ margin: 20px 0; } p:first-child{ text-align: center; font-weight: bold; font-size: 22px; } p:last-child{ text-align: center; } </style> </head> <body> <form> <p>賬戶登錄系統(tǒng)</p> <p> <label>郵箱:</label> <input type="email" name="email"> </p> <p> <label>密碼:</label> <input type="password" name="password"> </p> <p><button type="button">登錄</button></p> </form> <SCRIPT> // 獲取按鈕 let btn = document.getElementsByTagName('button')[0]; // 創(chuàng)建按鈕點(diǎn)擊事件 btn.onclick = function (){ // 1.創(chuàng)建監(jiān)聽對象 let xhr = new XMLHttpRequest(); // 2.監(jiān)聽響應(yīng)狀態(tài) xhr.onreadystatechange = function () { // 如果獲取到的返回值是4說明配置正確 // 0: 請求未初始化 // 1: 服務(wù)器連接已建立 // 2: 請求已接收 // 3: 請求處理中 // 4: 請求已完成,且響應(yīng)已就緒 if (xhr.readyState === 4) { // 返回200表示查詢成功 if (xhr.status === 200) { let p = document.createElement('p'); p.style.color = 'red'; // .responseText把服務(wù)器發(fā)送的信息提取出來使用JSON.parse把數(shù)據(jù)轉(zhuǎn)換成js對象格式。 var json = JSON.parse(xhr.responseText); // 從后臺傳遞過來的數(shù)據(jù)如果查詢到是1說明有數(shù)據(jù)如果是0說明沒有數(shù)據(jù)內(nèi)容 if (json.status === 1) { p.innerHTML = json.msg; } else if (json.status == 0) { p.innerHTML = json.msg; } // 把是否登錄成功提示信息發(fā)送到頁面上 document.forms[0].appendChild(p); // 禁用按鈕 btn.disabled = true; // 設(shè)置定時器,讓提示內(nèi)容顯示2秒跳轉(zhuǎn)。 setTimeout(function () { document.forms[0].removeChild(p); btn.disabled = false; if (json.status == 1) { location.href = 'admin.php'; } }, 2000); } else { // 響應(yīng)失敗的提示 alert('響應(yīng)失敗' + xhr.status); } } else { } } // 設(shè)置一下請求方式以及后臺文件 xhr.open('post','include/check.php',true); // 這里需要修改表單頭提交信息欺騙一下瀏覽器 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // 發(fā)送請求給后臺 let data = { email:document.getElementsByName('email')[0].value, password:document.getElementsByName('password')[0].value } // 把data以json字符串方式發(fā)送給服務(wù)器 let data_json = JSON.stringify(data); // 由于直接發(fā)送的data_json數(shù)據(jù)沒有下標(biāo),下面的data就是加上下標(biāo)進(jìn)行發(fā)送方便查詢 xhr.send('data='+data_json); } </SCRIPT> </body> </html>
后臺驗(yàn)證頁面代碼:
<?php // 數(shù)據(jù)庫連接參數(shù) $db = require 'database.php'; // 配置數(shù)據(jù)源DSN信息 $dsn = "{$db['type']}:host={$db['host']};dbname={$db['dbname']}"; // 連接數(shù)據(jù)庫 try { $pdo = new PDO($dsn, $db['username'], $db['password']); } catch (PDOException $e) { die('Connection Failed: ' . $e->getMessage()); } //測試一下是否能接收到數(shù)據(jù) $user = json_decode($_POST['data']); $email = $user->email; $password = $user->password; $sql = "SELECT COUNT(*) FROM `user` WHERE `email`='{$email}' AND `password`='{$password}' "; $stmt = $pdo->prepare($sql); $stmt->execute(); if ($stmt->fetchColumn(0) == 1) { echo json_encode(['status'=>1,'msg'=>'登錄成功,正在跳轉(zhuǎn)...']) ; exit; } else { echo json_encode(['status'=>0,'msg'=>'郵箱或密碼錯誤,登錄失敗!']) ; exit; }
數(shù)據(jù)庫配置代碼:
<?php // 數(shù)據(jù)庫連接參數(shù) return [ 'type' => 'mysql', 'host' => 'localhost', 'dbname' => 'user', 'username' => 'root', 'password' => 'root', ];
Correcting teacher:查無此人Correction time:2019-04-23 13:49:51
Teacher's summary:完成的不錯。ajax用處比較大。特別是手機(jī)的列表頁,上拉加載更多。繼續(xù)加油。