abstract:获取按钮元素并创建点击事件。创建一个监听对象,如果监听对象的状态返回值是4表示请求已经完成并响应就绪,再判断一下如果返回的值是200说明查询成功。然后新建一个p标签用于输出查询状态。var json = JSON.parse(xhr.responseText);是把从服务器发送过来的信息转换成js格式。如果查询的信息返回值是1说明查询到了对应的信息直接输出之前设定好的值,反之则依然。然后把登录信息
获取按钮元素并创建点击事件。
创建一个监听对象,如果监听对象的状态返回值是4表示请求已经完成并响应就绪,再判断一下如果返回的值是200说明查询成功。然后新建一个p标签用于输出查询状态。var json = JSON.parse(xhr.responseText);是把从服务器发送过来的信息转换成js格式。如果查询的信息返回值是1说明查询到了对应的信息直接输出之前设定好的值,反之则依然。然后把登录信息用刚才的p标签发送到页面上再禁用按钮功能,设置定时器对页面进行重定位跳转。
设置请求方式为post,后台路径是include下的check.php文件,由于发送的是form表单请求,所以表单头要修改一下xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
把需要发送验证对象的value值以字面量形式赋值给data,然后把data以json方式转换一下数据赋值给data_json,由于直接发送的data_json数据没有下标,下面的data就是加上下标进行发送方便查询
xhr.send('data='+data_json);database.php配置一下数据库的信息
在check.php里载入数据库信息文件并赋值给$db,使用PDO方式连接数据库,使用json_decode($_POST['data'])方法接收post发送过来的数据并赋值给user,实例化并赋值邮箱和密码字段并进行数据库查询。
如果查询到的数据==1说明结果为真,那么就echo json_encode(['status'=>1,'msg'=>'登录成功,正在跳转...']) ;
输出到前端页面,前端页面接收到数据后跳转指定的admin.php页面。
总结写代码过程中的错误:前台页面如果使用的是div而不是form,并且js里使用的是div而不是forms的话查询是没有任何响应的,并且在验证的php页面里不能有输出打印标签,否则前台也不显示。数据库配置文件需要使用return方式返回,并且数组的[]最后要加;分号结尾。
前台代码:
<!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>表单提交系统</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>账户登录系统</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]; // 创建按钮点击事件 btn.onclick = function (){ // 1.创建监听对象 let xhr = new XMLHttpRequest(); // 2.监听响应状态 xhr.onreadystatechange = function () { // 如果获取到的返回值是4说明配置正确 // 0: 请求未初始化 // 1: 服务器连接已建立 // 2: 请求已接收 // 3: 请求处理中 // 4: 请求已完成,且响应已就绪 if (xhr.readyState === 4) { // 返回200表示查询成功 if (xhr.status === 200) { let p = document.createElement('p'); p.style.color = 'red'; // .responseText把服务器发送的信息提取出来使用JSON.parse把数据转换成js对象格式。 var json = JSON.parse(xhr.responseText); // 从后台传递过来的数据如果查询到是1说明有数据如果是0说明没有数据内容 if (json.status === 1) { p.innerHTML = json.msg; } else if (json.status == 0) { p.innerHTML = json.msg; } // 把是否登录成功提示信息发送到页面上 document.forms[0].appendChild(p); // 禁用按钮 btn.disabled = true; // 设置定时器,让提示内容显示2秒跳转。 setTimeout(function () { document.forms[0].removeChild(p); btn.disabled = false; if (json.status == 1) { location.href = 'admin.php'; } }, 2000); } else { // 响应失败的提示 alert('响应失败' + xhr.status); } } else { } } // 设置一下请求方式以及后台文件 xhr.open('post','include/check.php',true); // 这里需要修改表单头提交信息欺骗一下浏览器 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // 发送请求给后台 let data = { email:document.getElementsByName('email')[0].value, password:document.getElementsByName('password')[0].value } // 把data以json字符串方式发送给服务器 let data_json = JSON.stringify(data); // 由于直接发送的data_json数据没有下标,下面的data就是加上下标进行发送方便查询 xhr.send('data='+data_json); } </SCRIPT> </body> </html>
后台验证页面代码:
<?php // 数据库连接参数 $db = require 'database.php'; // 配置数据源DSN信息 $dsn = "{$db['type']}:host={$db['host']};dbname={$db['dbname']}"; // 连接数据库 try { $pdo = new PDO($dsn, $db['username'], $db['password']); } catch (PDOException $e) { die('Connection Failed: ' . $e->getMessage()); } //测试一下是否能接收到数据 $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'=>'登录成功,正在跳转...']) ; exit; } else { echo json_encode(['status'=>0,'msg'=>'邮箱或密码错误,登录失败!']) ; exit; }
数据库配置代码:
<?php // 数据库连接参数 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用处比较大。特别是手机的列表页,上拉加载更多。继续加油。