AJAX结合PHP整理复习
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整理复习的更多相关文章
- 初步认识ajax(个人整理)
通过使用ajax可以实现页面的部分动态化 ajax可以发送一个请求去服务端,而服务端则发送回一小段数据给客户端,这样就可以避免加载整个页面,因为很多时候页面只需要刷新某一部分的数据,而其他大部分体就不 ...
- Ajax的使用~~~整理
之前对于ajax没有详细的学习,只是碰到的时候,就记一点,不是很有条理.虽然常用的都会用,但真经不起询问,知其然而不知其所以然,所以专门看了一下<JavaScript高级程序设计>中对aj ...
- C语言整理复习——指针
指针是C的精华,不会指针就等于没学C.但指针又是C里最难理解的部分,所以特意写下这篇博客整理思路. 一.指针类型的声明 C的数据类型由整型.浮点型.字符型.布尔型.指针这几部分构成.前四种类型比较好理 ...
- Django - Ajax基本内容整理
将原来的请求结果普通字符串,变更为类字典的字符串 从这段代码中,可以看到,对原有函数,进行了一个try ...except....操作,进行异常捕捉,将捕捉过程及结果,存入在初始化的字典中,将字典通过 ...
- JSP Web第八章整理复习 过滤器
P269 Filter过滤器的基本原理 P269 Filter过滤器体系结构 原理和体系结构看懂了就行 P270 例8-1过滤器代码与配置文件 略
- JSP Web第七章整理复习 Servlet基础知识
P206-208 Servlet项目的创建,web.xml的配置及标签含义,相关程序 创建:new 一个Servlet类,继承自javax.servlet.http.HttpServlet; 写doG ...
- JSP Web第六章整理复习 JavaBean技术
P183 什么是JavaBean,JavaBean有哪些特点? javabean是一种特殊的java类 特点:属性private,方法public P184 JavaBean封装数据,例6-1,6-2 ...
- JSP Web第五章整理复习 JSP访问数据库
P164 例5-1 常用SQL语句 P178 数据库连接池 (1)连接池的作用 存储多个数据库连接对象,当程序需要时,从池中获取1个连接,程序执行完成后再还给连接池.避免数据库连接建立.关闭的开 ...
- JSP Web第四章整理复习 JSP技术基础
P104 JSP简介 (1)基本概念:jsp技术.jsp.jsp网页组成 JSP技术基础java servlet和整个java体系的Web服务器端开发技术. JSP表示它是用java写的Web服务页面 ...
随机推荐
- hdoj 4325 Flowers 线段树+离散化
hdoj 4325 Flowers 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4325 思路: 直接线段树,按照花的开放区间的大小建树,要注意虽然 ...
- Spring JDBC(二)SimpleJdbcInsert
上一篇写了关于jdbcTemplate的一些基本使用,这一篇来聊聊SimpleJdbcInsert SimpleJdbcInsert是springjdbc提供的一个简化插入操作的类,下面来看一下常用的 ...
- JavaScript tips ——搞定闰年
前言 处理时间时,常常要考虑用户的输入是否合法,其中一个很典型的场景就是平闰年的判断,网上其实有很多类似的算法,但是其实不必那么麻烦,下面我讲讲的我的思路. 规则 公元年数可被4整除为闰年,但是整百( ...
- iOS 提交AppStore不出现构建的版本
提交App Store不出现构建的版本 Xcode版本:8.0 近日往App Store上跟新一个版本,提交了好几次,built号增加了好几个,上传每次都成功了,但是在iTunes Contact上一 ...
- 使用hiredis实现pipeline方式访问
1.介绍 hiredis: 一个c/c++的访问redis的api库 地址:https://github.com/redis/hiredis pipeline方式: redis中的pipeline方式 ...
- git实用攻略(二)
最近团队的版本控制从svn切换到了git,虽说已经使用git有2年多了,也写了一个实用攻略,但是github上的项目使用经验和公司内部团队协作的使用经验还有很多不同.补充下新的使用体会. 首先还是看一 ...
- BST性能分析&改进思路——平衡与等价
极端退化 前面所提到的二叉搜索树,已经为我们对数据集进行高效的静态和动态操作打开了一扇新的大门.正如我们所看到的,BST从策略上可以看作是将之前的向量(动态数组)和链表结构的优势结合起来,不过多少令我 ...
- java中的集合操作类(未完待续)
申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...
- Hibernate中使用@Lob 注解保存String[] 问题
Hibernate中使用@Lob 注解保存String[] 问题 在Hibernate注解中怎样你想保存一个字段为String数组类型.假设你想尝试保存为clob类型的话,普通情况下为定义为: @En ...
- jmeter的使用---web测试
jmeter的使用---web测试 url:http://127.0.0.1:1080/WebTours/ 1.通过badboy录制脚本 1.1输入url点击右侧的跳转按钮,随后右侧显示url界面 1 ...