Ajax主要的功能是实现了浏览器端 异步 访问服务器:通过浏览器的XMLHttpRequest对象发出小部分数据,
与服务端进行交互,服务端返回小部分数据,然后更新客户端的部分页面。

下图是一次请求成功的信息:

下图是谷歌浏览器Postman插件用于测试后台代码:

前端实现代码:

// GET触发
let search = document.getElementById('search');
// GET提交的表单数据
let keyword = document.getElementById('keyword');
// POST触发
let save = document.getElementById('save');
// POST提交的表单数据
let staffName = document.getElementById('staffName');
let staffNumber = document.getElementById('staffNumber');
let staffSex = document.getElementById('staffSex');
let staffJob = document.getElementById('staffJob');
// 返回信息demo呈现
let searchResult = document.getElementById('searchResult');
let creatResult = document.getElementById('creatResult'); // GET请求
search.addEventListener('click', () => {
let request = new XMLHttpRequest();
request.open('GET', `service.php?number=${keyword.value}`);
request.send(null);
request.addEventListener('readystatechange', () => {
if (request.readyState === 4 && request.status === 200) {
// 后台返回的json对象转为js对象
// 处理json时用JSON.parse(request.responseText)相比eval()不会执行json中的js脚本比较安全
let jsonData = JSON.parse(request.responseText);
// 判断是否错误信息需要和后台约定一个json对象
if (jsonData.success) {
searchResult.innerText = jsonData.msg;
} else {
searchResult.innerText = jsonData.msg;
}
}
})
})
// POST请求
save.addEventListener('click', () => {
let request = new XMLHttpRequest();
request.open('POST', `service.php`);
//POST必须设置Content-Type的值在open与send之间
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//构造一下要发送的表单数据再用send提交
let data = `name=${staffName.value}&number=${staffNumber.value}&sex=${staffSex.value}&job=${staffJob.value}`;
request.send(data);
request.addEventListener('readystatechange', () => {
if (request.readyState === 4 && request.status === 200) {
// 后台返回的json对象转为js对象
// 处理json时用JSON.parse(request.responseText)相比eval()不会执行json中的js脚本比较安全
let jsonData = JSON.parse(request.responseText);
// 判断是否错误信息需要和后台约定一个json对象
if (jsonData.success) {
creatResult.innerText = jsonData.msg;
} else {
creatResult.innerText = jsonData.msg;
}
}
})
})

后台PHP代码:

<?php
//设置页面内容编码格式utf-8
//header("Content-Type:text/plain;charset=utf-8");//响应格式纯文本
header("Content-Type:application/json;charset=utf-8");//服务器端返回给的格式是json字符串
// 跨域header('Access-Control-Allow-Origin:*');//允许所有来源访问
// 跨域header('Access-Control-Allow-Method:POST,GET');//允许访问的方式
//header("Content-Type:text/xml;charset=utf-8");
//header("Content-Type:text/html;charset=utf-8");
//header("Content-Type:application/javascript;charset=utf-8"); //定义一个多维数组,包含员工信息,每条员工信息为一个数组
$staff=array
(
array("name"=>"洪七","number"=>"101","sex"=>"男","job"=>"总经理"),
array("name"=>"郭靖","number"=>"102","sex"=>"男","job"=>"开发工程师"),
array("name"=>"黄蓉","number"=>"103","sex"=>"女","job"=>"产品经理")
);
//判断如果是get请求,则进行搜索;如果是post请求,则进行新建
//$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
//$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
if($_SERVER["REQUEST_METHOD"]=="GET"){
search();//搜索
}elseif($_SERVER["REQUEST_METHOD"]=="POST"){
create();//新建
}
//搜索功能
function search(){
// 跨域请求时追加 $jsonp=$_GET["callback123"];
//超全局变量$_GET和$_POST用于收集表单数据
// 检测url中有没有number字段
if(!isset($_GET["number"])||empty($_GET["number"])){
// 如果没传值就返回给客户端下面这个json对象
echo '{"success":false,"msg":"请输入员工编号"}';
return;
}
//函数之外声明的变量拥有Global作用域,只能在函数以外进行访问。
//global关键词用于访问函数内的全局变量
global $staff;
// 浏览器传过来的number字段
$number=$_GET["number"];
$result = '{"success":false,"msg":"没有找到员工。"}';
// 跨域请求时改为$result = $jsonp.'({"success":false,"msg":"没有找到员工。"})'; //遍历$staff多维数组,查找键值为number的员工是否存在,如果存在,则修改并返回结果
foreach ($staff as $value) {
if($value["number"]==$number){
$result = '{"success":true,"msg":"找到员工:员工编号:' . $value["number"] .
',员工姓名:' . $value["name"] .
',员工性别:' . $value["sex"] .
',员工职位:' . $value["job"] . '"}';
break;
}
}
echo $result;//返回结果
} //创建员工
function create(){
//判断信息是否填写完全
//如果找不到name值或者值为空,就返回参数错误信息不全
if(!isset($_POST["name"])||empty($_POST["name"])
||!isset($_POST["number"])||empty($_POST["number"])
||!isset($_POST["sex"])||empty($_POST["sex"])
||!isset($_POST["job"])||empty($_POST["job"])){
//参数不齐时返回客户端的json对象
echo '{"success":false,"msg":"员工信息填写不全"}';
return;
}
//TODO:获取POST表单数据并保存到数据库
//否则提示保存成功
/*echo "员工:".$_POST["name"]."信息保存成功!";*/
echo '{"success":true,"msg":"员工:'.$_POST["name"].'信息保存成功!"}';
} ?>

处理跨域

1.代理服务器
简单来说就是让后台去访问别域的数据,再传给前端,因为后台不存在跨域问题。
2.jsonp
原理通过<script src=''></script>标签加载js ,但是不支持POST请求
3.html5的XHR2
只需在服务器头部加两个header
header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Methods:POST,GET");
只支持IE10以上

AJAX结合PHP整理复习的更多相关文章

  1. 初步认识ajax(个人整理)

    通过使用ajax可以实现页面的部分动态化 ajax可以发送一个请求去服务端,而服务端则发送回一小段数据给客户端,这样就可以避免加载整个页面,因为很多时候页面只需要刷新某一部分的数据,而其他大部分体就不 ...

  2. Ajax的使用~~~整理

    之前对于ajax没有详细的学习,只是碰到的时候,就记一点,不是很有条理.虽然常用的都会用,但真经不起询问,知其然而不知其所以然,所以专门看了一下<JavaScript高级程序设计>中对aj ...

  3. C语言整理复习——指针

    指针是C的精华,不会指针就等于没学C.但指针又是C里最难理解的部分,所以特意写下这篇博客整理思路. 一.指针类型的声明 C的数据类型由整型.浮点型.字符型.布尔型.指针这几部分构成.前四种类型比较好理 ...

  4. Django - Ajax基本内容整理

    将原来的请求结果普通字符串,变更为类字典的字符串 从这段代码中,可以看到,对原有函数,进行了一个try ...except....操作,进行异常捕捉,将捕捉过程及结果,存入在初始化的字典中,将字典通过 ...

  5. JSP Web第八章整理复习 过滤器

    P269  Filter过滤器的基本原理 P269  Filter过滤器体系结构 原理和体系结构看懂了就行 P270 例8-1过滤器代码与配置文件 略

  6. JSP Web第七章整理复习 Servlet基础知识

    P206-208 Servlet项目的创建,web.xml的配置及标签含义,相关程序 创建:new 一个Servlet类,继承自javax.servlet.http.HttpServlet; 写doG ...

  7. JSP Web第六章整理复习 JavaBean技术

    P183 什么是JavaBean,JavaBean有哪些特点? javabean是一种特殊的java类 特点:属性private,方法public P184 JavaBean封装数据,例6-1,6-2 ...

  8. JSP Web第五章整理复习 JSP访问数据库

    P164  例5-1  常用SQL语句 P178  数据库连接池 (1)连接池的作用 存储多个数据库连接对象,当程序需要时,从池中获取1个连接,程序执行完成后再还给连接池.避免数据库连接建立.关闭的开 ...

  9. JSP Web第四章整理复习 JSP技术基础

    P104 JSP简介 (1)基本概念:jsp技术.jsp.jsp网页组成 JSP技术基础java servlet和整个java体系的Web服务器端开发技术. JSP表示它是用java写的Web服务页面 ...

随机推荐

  1. C# Excel写入数据及图表

    开发工具:VS2017 语言:C DotNet版本:.Net FrameWork 4.0及以上 使用的DLL工具名称:GemBox.Spreadsheet.dll (版本:37.3.30.1185) ...

  2. Shell 初步学习

    Shell 概述 Shell:Linux命令解释器 脚本执行方式 chmod 755 脚本名:赋权限(调用必须显示的使用绝对路径或相对路径) bash 脚本名:通过Bash调用执行脚本 命令别名 al ...

  3. 《图解Spark:核心技术与案例实战》作者经验谈

    1,看您有维护博客,还利用业余时间著书,在技术输出.自我提升以及本职工作的时间利用上您有没有什么心得和大家分享?(也可以包含一些您写书的小故事.)回答:在工作之余能够写博客.著书主要对技术的坚持和热爱 ...

  4. javascript设计模式——适配器模式

    前面的话 适配器模式的作用是解决两个软件实体间的接口不兼容的问题.使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作.适配器的别名是包装器(wrapper),这是一个相对简单的 ...

  5. 闲来无事研究一下酷狗缓存文件kgtemp的加密方式

    此贴为本人原创,转载请注明出处 序 前几天更新了被打入冷宫很久的酷狗,等进入之后就感觉菊花一紧----试 听 居 然 都 要 开 通 音 乐 包(高品和无损)才行了,WTF! 这意味着以前缓存的都听不 ...

  6. Create-React-App创建antd-mobile开发环境(学习中的记录)

    (参考别人结合自己的整理得出,若有错误请大神指出) Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 详 ...

  7. Spring 面试

    1.什么是Spring框架?Spring框架有哪些主要模块? spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  8. C语言可变长參数实现原理

    微博:http://weibo.com/u/2203007022             (1)      C语言可变參数 我们能够从C语言的printf得出可变參数的作用.printf函数的原型例如 ...

  9. leetcode第一刷_Populating Next Right Pointers in Each Node II

    很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...

  10. 开源Android-PullToRefresh下拉刷新源代码分析

    PullToRefresh 这个库用的是很至多.github  今天主要分析一下源代码实现. 我们通过ListView的下拉刷新进行分析.其他的类似. 整个下拉刷新  父View是LinearLayo ...