Blogger Information
Blog 62
fans 7
comment 2
visits 58112
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP+AJAX异步请求及登录表单验证案例分享
我是郭富城
Original
1048 people have browsed it

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暴露了与服务器交互的细节,涉及到了安全的问题,不容易调试等等。但是他的优点还是非常突出的,所以就看程序员怎么去使用了。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:想一下, 如果不用ajax,应该如何实现同样功能
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post