博客列表 >PHP+AJAX异步请求及登录表单验证案例分享

PHP+AJAX异步请求及登录表单验证案例分享

我是郭富城
我是郭富城原创
2020年05月22日 04:20:191047浏览

PHP+AJAX

1. 什么是 AJAX

  • AJAX = Asynchronous JavaScript And XML(异步 JavaScriptXML
  • AJAXAsynchronous JavaScript And XML 的首字母缩写。

    AJAX 使用 JavaScript 在 web 浏览器与 web 服务器之间来发送和接收数据。
    AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

1.1 同步和异步

  • 同步: 前端发请求, 必须等到后端响应完成,才允许发送另一个请求
  • 异步: 前端发请求后不等待后端响应结果继续执行,后端响应完成通过事件方式告知前端处理信息

    异步最常用的处理形式就是回调函数

1.2 优点是什么

  • 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
  • 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

2. AJAX 请求流程

2.1 创建 XMLHttpRequest 对象

  • 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)
  • XMLHttpRequests 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
  • 创建 XMLHttpRequest 对象的语法:
    xhr=new XMLHttpRequest();
  • 为了应对所有的现代浏览器,包括 IE5IE6,可以检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject
  1. var xhr;
  2. if (window.XMLHttpRequest) {
  3. // code for IE7+, Firefox, Chrome, Opera, Safari
  4. xhr = new XMLHttpRequest();
  5. } else {
  6. // code for IE6, IE5
  7. xhr = new ActiveXObject("Microsoft.XMLHTTP");
  8. }

2.2 监听请求

  • 当使用 async=true 时,请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:
  • 当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当 readyState 改变时,就会触发 onreadystatechange 事件。readyState 属性存有 XMLHttpRequest 的状态信息。
属性 状态
onreadystatechange 每当 readyState 属性改变时,就会调用该函数。
readyState - 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化,1: 服务器连接已建立,2: 请求已接收,3: 请求处理中,4: 请求已完成,且响应已就绪
status 200: “OK”,404: 未找到页面
  1. xhr.onreadystatechange = function () {
  2. if (xhr.readyState == 4 && xhr.status == 200) {
  3. document.getElementById("myDiv").innerHTML = xhr.responseText;
  4. }
  5. };

2.3 初始化请求参数

  • 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open()方法:
  • open(method,url,async)
  1. method:请求的类型;GET POST
  2. url:文件在服务器上的位置
  3. asynctrue(异步)或 false(同步)

2.4 发送请求

  • 我们使用 XMLHttpRequest 对象的send()
  • send(string),将请求发送到服务器。string:仅用于 POST 请求

3. Ajax-GET 请求

  • GET 简单也快,并且在大部分情况下都能用。
  • 然而,在以下情况中,需要使用 POST 请求:

    无法使用缓存文件(更新服务器上的文件或数据库)
    向服务器发送大量数据(POST 没有数据量限制)
    发送包含未知字符的用户输入时,POSTGET 更稳定也更可靠

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. //1.创建xhr对象
  11. var xhr = new XMLHttpRequest();
  12. //2.监听请求
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. console.log(xhr.responseText);
  16. }
  17. };
  18. //3.初始化请求参数
  19. xhr.open("GET", "get.php", "true");
  20. //4.发送请求
  21. xhr.send(null);
  22. </script>
  23. </body>
  24. </html>
  • get.php 里面的内容
  1. <?php
  2. $user['name'] = 'Nicola';
  3. $user['email'] = 'admin@aoebbs.cn';
  4. //将数组转为json字符串必须用echo不能用return
  5. echo json_encode($user);

4. Ajax-POST 请求

4.1 方式一,模拟表单类型

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. //1.创建xhr对象
  11. var xhr = new XMLHttpRequest();
  12. //2.监听请求
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. console.log(xhr.responseText);
  16. }
  17. };
  18. //3.初始化请求参数
  19. xhr.open("POST", "post.php", "true");
  20. //4.设置请求头
  21. xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  22. //准备请求参数
  23. var use = {
  24. email: "admin@nicola.com",
  25. password: "123456",
  26. };
  27. //把js对象转为json字符串
  28. var data = JSON.stringify(use);
  29. //5.发送请求
  30. xhr.send(data);
  31. </script>
  32. </body>
  33. </html>
  • post.php 内容
  1. <?php
  2. // print_r($_POST);
  3. $data = key($_POST);
  4. // echo $data;
  5. //$data转为可以处理的数据
  6. $user = json_decode($data);
  7. print_r($user);
  8. $user = json_decode($data, true);
  9. print_r($user);

4.2 方式二 直接用 json

  • 设置请求头,这里变更为 json,请求格式是 utf-8
    xhr.setRequestHeader("Content-type", "application/json;charset=utf-8");
  • 用原始文件流的方式来接收php://input
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. //1.创建xhr对象
  11. var xhr = new XMLHttpRequest();
  12. //2.监听请求
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. console.log(xhr.responseText);
  16. }
  17. };
  18. //3.初始化请求参数
  19. xhr.open("POST", "post2.php", "true");
  20. //4.设置请求头,这里变更为json,请求格式是utf-8
  21. xhr.setRequestHeader("Content-type", "application/json;charset=utf-8");
  22. //准备请求参数
  23. var use = {
  24. email: "admin@nicola.com",
  25. password: "123456",
  26. };
  27. //把js对象转为json字符串
  28. var data = JSON.stringify(use);
  29. //5.发送请求
  30. xhr.send(data);
  31. </script>
  32. </body>
  33. </html>
  • post2.php 内容
  1. <?php
  2. // print_r($_POST);
  3. $data = file_get_contents('php://input');
  4. // 用原始文件流的方式来接受
  5. // $data = key($_POST);
  6. // // echo $data;
  7. // //$data转为可以处理的数据
  8. $user = json_decode($data);
  9. print_r($user);
  10. $user = json_decode($data, true);
  11. print_r($user);

4. Ajax-FormData 请求

  • 可直接序列化表单数据
  • 可直接被 Ajax 识别,所以可以不设置请求头
  • 除了表单数据外,也可用于普通数据

    FormData 的方式向服务器发送表单数据,服务器端会自动识别 FormData对象,可以不用设置请求头,通过 JSON.parse();把服务器返回的 JSON 转为 JS 对象。判断用户输入的信息和服务器端的信息是否匹配。如果不匹配则向网页中输出相应的提示信息

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. // - 可直接序列化表单数据
  11. // - 可直接被 Ajax 识别,所以可以不设置请求头
  12. // - 除了表单数据外,也可用于普通数据
  13. //1.创建xhr对象
  14. var xhr = new XMLHttpRequest();
  15. //2.监听请求
  16. xhr.onreadystatechange = function () {
  17. if (xhr.readyState === 4 && xhr.status === 200) {
  18. console.log(xhr.responseText);
  19. }
  20. };
  21. //3.初始化请求参数
  22. xhr.open("POST", "formdata.php", "true");
  23. //formdata
  24. var data = new FormData();
  25. data.append("username", "admin");
  26. data.append("password", "admin8888");
  27. //5.发送请求
  28. xhr.send(data);
  29. </script>
  30. </body>
  31. </html>
  • formdata.php 内容
  1. <?php
  2. print_r($_POST);

5. 用 FormData 完成一个用户登录与验证的小案例

5.1 前端界面设计

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>用户登录表单验证</title>
  7. </head>
  8. <body>
  9. <p>用户登录表单验证</p>
  10. <!-- onsubmit="return false": 禁用表单的默认提交,改为自定义的Ajax提交 -->
  11. <form
  12. action=""
  13. method="POST"
  14. style="display: grid; gap: 15px;"
  15. onsubmit="return false"
  16. >
  17. <input
  18. type="email"
  19. name="email"
  20. placeholder="请输入你的邮箱"
  21. required
  22. autofocus
  23. />
  24. <input
  25. type="password"
  26. name="password"
  27. placeholder="请输入你的密码"
  28. required
  29. />
  30. <button>提交</button>
  31. </form>
  32. <script>
  33. // 1. 获取表单和按钮
  34. var form = document.querySelector("form");
  35. var btn = document.querySelector("form button");
  36. // 2. 给按钮绑定点击事件,进行Ajax请求
  37. btn.onclick = function () {
  38. // 1. 创建Ajax对象
  39. var xhr = new XMLHttpRequest();
  40. // 2. 监听请求
  41. xhr.onreadystatechange = function () {
  42. if (xhr.readyState === 4 && xhr.status === 200) {
  43. console.log(xhr.responseText);
  44. // 将jsonl转js对象
  45. var res = JSON.parse(xhr.responseText);
  46. console.log(res);
  47. switch (res.status) {
  48. case 0:
  49. case 1:
  50. error = res.message;
  51. break;
  52. default:
  53. error = "非法操作,请联系管理员";
  54. }
  55. // 将提示显示到表单中
  56. var span = document.createElement("span");
  57. span.innerHTML = error;
  58. span.style.color = "red";
  59. form.appendChild(span);
  60. }
  61. };
  62. // 3. 初始化请求参数
  63. xhr.open("POST", "formdata.php", true);
  64. // FormData
  65. var data = new FormData(form);
  66. data.append("login_time", new Date().getTime());
  67. // 5. 发送请求
  68. xhr.send(data);
  69. };
  70. // 清除提示信息
  71. var inputs = document.querySelectorAll("input");
  72. for (var i = 0; i < inputs.length; i++) {
  73. inputs[i].oninput = function () {
  74. if (btn.nextElementSibling !== null)
  75. form.removeChild(btn.nextElementSibling);
  76. };
  77. }
  78. </script>
  79. </body>
  80. </html>

5.2 数据表

  • 密码都是123456

    5.3 ajax 验证用户登录

  • FormData 的方式向服务器发送表单数据,服务器端会自动识别 FormData对象

    1. // FormData
    2. var data = new FormData(form);
    3. data.append("login_time", new Date().getTime());
    4. // 5. 发送请求
    5. xhr.send(data);
  • pod方式连接数据库
  • sql语句从数据库查询已有的用户数据
    php $sql = 'SELECT COUNT(`id`) FROM `user` WHERE `email`=? AND `password`=? LIMIT 1';
  • 预处理sql语句,防止sql注入
  • 传入参数,通过post方式获取用户提交的表单信息,核对邮箱和加密后的密文是否和数据库中储存的信息一致
  1. <?php
  2. // print_r($_POST);
  3. //pod方式连接数据库
  4. $pdo = new PDO('mysql:host=localhost;dbname=php', 'root', 'root123456');
  5. //sql语句从数据库查询已有的用户数据
  6. $sql = 'SELECT COUNT(`id`) FROM `user` WHERE `email`=? AND `password`=? LIMIT 1';
  7. // 预处理sql语句,防止sql注入
  8. $stmt = $pdo->prepare($sql);
  9. //传入参数,通过post方式获取用户提交的表单信息,核对邮箱和加密后的密文是否和数据库中储存的信息一致
  10. $stmt->execute([$_POST['email'], md5($_POST['password'])]);
  11. // 获取用户的信息
  12. $user = $stmt->fetch(PDO::FETCH_NUM);
  13. // 判断是否验证成功
  14. if ($user[0] == 1) echo json_encode(['status' => 1, 'message' => '验证通过']);
  15. else echo json_encode(['status' => 0, 'message' => '邮箱或密码错误']);

6. 总结

ajax不是新的编程语言,而是一种使用现有标准的新方法。在不重新加载整个页面的情况下,ajax是与服务器交换数据并更新部分网页的艺术。但是通过做一个登录验证的小案例,我也发现了ajax的一些缺点,比如,ajax不支持浏览器back按钮,AJAX暴露了与服务器交互的细节,涉及到了安全的问题,不容易调试等等。但是他的优点还是非常突出的,所以就看程序员怎么去使用了。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议