十二、案例:省市县三级联动
1、数据表的关系
省表:province
市表:city
区县:areacounty
对应关系:
province表中的==Pcode==字段和city表中的==ProvinceCode==对应
city表中的==Ccode==和areacounty表中的==CityCode==对应
查询所有的省:select * from province
查询广东省下面的市:select * from city where ProvinceCode=440000
//440000是广东省的Pcode
查询广州市下面的区县:select * from areacounty where CityCode=440100
//440100是广州市的Ccode
2、制作html页面
1 | <body> |
效果:
3、页面加载,先获取所有的省
通过js,发送ajax请求到07city.php,然后获取所有的省。
约定用type区分,此次请求要取什么数据。
先写07city.php
,获取所有的省:
1 | $pdo = new PDO('mysql:host=localhost; dbname=test; charset=utf8', 'root', '123'); |
4、html页面发送ajax请求,把所有的省获取
1 | <script> |
效果:
5、当省切换的时候获取对应的市
js代码:
1 | /************************ 获取市的代码 *******************************/ |
PHP代码:获取对应的市
1 | $pdo = new PDO('mysql:host=localhost; dbname=test; charset=utf8', 'root', '123'); |
js处理服务器返回的市的数据:
1 | //当省的内容改变的时候,获取对应的市 |
6、当市切换的时候,获取对应的区县
复制获取市的代码,然后修改:
js代码:
1 | document.getElementById('c').onchange = function () { |
PHP代码:
1 | .... |
切换省的时候,把区县重置:
7、细节处理
- 切换省份时,区县要重置
省份重置时,市和区县都要重置
1
2
3
4
5
6
7
8
9
10
11
12
13//省份对象事件:改变
gById('p').onchange = function () {
//--------------------细节处理-----------------------//
//切换省份时,区县要重置
gById('a').innerHTML='<option value="0">--请选择区县--</option>';
//省份重置时,市和区县都要重置
if (this.value==0){
gById('c').innerHTML='<option value="0">--请选择市--</option>';
gById('a').innerHTML='<option value="0">--请选择区县--</option>';
}
//--------------------细节处理-----------------------//市重置时,区县需要重置
1
2
3
4
5
6
7
8
9//市对象事件:改变
gById('c').onchange = function () {
//--------------------细节处理-----------------------//
//市重置时,区县要重置
if (this.value==0){
gById('a').innerHTML='<option value="0">--请选择区县--</option>';
}
//--------------------细节处理-----------------------//
十三、案例:省市县三级联动另一种思路
1、对于不经常变换的数据,可以用文件存储
全国的省、市、区县可能很多年都不会发生变化,对于这种数据,就可以不用放到数据库中,直接使用文件存储,效果很好。不但可以加快查询速度,还能减轻数据库服务器的压力。
2、获取省
首先创建01city.php
,里面读取0.json
,直接返回读取的json数据。
1 | //返回所有的省 |
创建01city.html
,里面先写html布局
1 | <select id="p"> |
然后js封装一个get方法:
1 | <script> |
最后调用get方法,获取所有的省,并处理
1 | /**************************** 首先加载所有的省 *****************************/ |
整体的图示:
3、获取市
1 | /********************* 获取市,省切换的时候 **************************/ |
01city.php
获取地址栏的filename,根据filename来获取对应的json文件:
1 | //获取地址栏的参数 filename |
4、细节处理
上面的代码已包含。
切换省份时,区县要重置
省份重置时,市和区县都要重置
1
2
3
4
5
6
7
8
9
10
11
12
13
14//省份对象事件:改变
document.getElementById('p').onchange = function () {
//--------------------细节处理-----------------------//
//切换省份时,区县要重置
gById('a').innerHTML = '<option value="0">--请选择区县--</option>';
//省份重置时,市和区县都要重置
if (this.value == 0) {
gById('c').innerHTML = '<option value="0">--请选择市--</option>';
gById('a').innerHTML = '<option value="0">--请选择区县--</option>';
return; //终止函数往下执行
}
//--------------------细节处理-----------------------//市重置时,区县需要重置
1
2
3
4
5
6
7
8
9
10//市对象事件:改变
document.getElementById('c').onchange = function () {
//--------------------细节处理-----------------------//
//市重置时,区县要重置
if (this.value == 0) {
gById('a').innerHTML = '<option value="0">--请选择区县--</option>';
return; //终止函数往下执行
}
//--------------------细节处理-----------------------//
案例—Ajax跨域获取天气信息
接口地址1:http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
==Ajax可以直接请求==,推断出对方网站肯定设置 header('Access-Control-Allow-Origin:*');
。
下面是08weather.html
代码
1 | <body> |
接口地址2:http://www.weather.com.cn/data/sk/101010100.html
==Ajax不可以直接请求。==
下面是09weather.html
1 | <body> |
09weather.php
代码:
1 | echo file_get_contents('http://www.weather.com.cn/data/sk/101010100.html'); |
七、案例 – Ajax无刷新分页
7.1、分页原理
比如,我的 areacounty 表有3125条数据。要求每页显示10条。那么共有多少页?
$count = 3125;
$pageSize = 10;
$maxPage = ceil($count / $pageSize);
获取第1页数据的SQL:select * from areacounty order by AID limit 0,10;
获取第2页数据的SQL:select * from areacounty order by AID limit 10,10;
获取第3页数据的SQL:select * from areacounty order by AID limit 20,10;
获取第$p页的数据的SQL:select * from areacounty order by AID limit ($p-1)*$pageSize, $pageSize;
7.2、传统的分页
TODO
7.3、异步请求数据,完成无刷新分页
TODO