PHP+Mysql+Ajax+JS实现省市区三级联动


Posted in PHP onMay 23, 2014

基本思想就是:在JS动态创建select控件的option,通过Ajax获取在PHP从SQL数据库获取的省市区信息,代码有点长,但很多都是类似的,例如JS中省、市、区获取方法类似,PHP中通过参数不同执行不同的select语句。

index.html代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>省市区三级联动</title>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<script src="scripts/thumbnails.js" type="text/javascript"></script>
</head>
<body>
<div id="description">
<select style="width:100px; " onchange="sech(this.id)" id="sheng">
<option value="province">请选择省份</option>
</select>
<select onchange="sech(this.id)" id="shi">
<option value="city">请选择市区</option>
</select>
<select id="xian">
<option value="county">请选择县乡</option>
</select>
</div>
</div>
</body>
</html>

thumbnails.js代码:

window.onload = getProvince;function createRequest() {//Ajax于PHP交互需要对象
  try {
    request = new XMLHttpRequest();//创建一个新的请求对象;
  } catch (tryMS) {
    try {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (otherMS) {
      try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        request = null;
      }
    }
  }
  return request;
}
function sech(id) {//省市改变时触发,select的onchange事件
    var aa = document.getElementById(id);
if(id=="sheng"){
      getCity(aa.value);//这里aa.value为省的id
}
if(id=="shi")
{
getCounty(aa.value);//这里aa.value为市的id
}
}
function getProvince() {//获取所有省
  request = createRequest();
  if (request == null) {
    alert("Unable to create request");
    return;
  }
  var url= "getDetails.php?ID=0";//ID=0时传递至PHP时让其获取所有省
  request.open("GET", url, true);
  request.onreadystatechange = displayProvince; //设置回调函数
  request.send(null);    //发送请求
}
function getCity(id){//获取省对应的市
  request = createRequest();
  if (request == null) {
    alert("Unable to create request");
    return;
  }
  var url= "getDetails.php?ID=" + escape(id);
  request.open("GET", url, true);
  request.onreadystatechange = displayCity;
  request.send(null);
}
function getCounty(id){//获取市对应的区
  request = createRequest();
  if (request == null) {
    alert("Unable to create request");
    return;
  }
  var url= "getDetails.php?ID=" + escape(id);
  request.open("GET", url, true);
  request.onreadystatechange = displayCounty;
  request.send(null);
}
 
function displayProvince() {//将获取的数据动态增加至select
  if (request.readyState == 4) {
    if (request.status == 200) {
  var a=new Array;
var b=request.responseText;//将PHP返回的数据赋值给b
 a=b.split(",");//通过","将这一数据保存在数组a中
  document.getElementById("sheng").length=1;
  var obj=document.getElementById("sheng');  
  for(i=0;i
      obj.options.add(new Option(a[i],i+1)); //动态生成OPTION加到select中,第一个参数为Text,第二个参数为Value值.
    }
  }
}
 
function displayCity() {//将获取的数据动态增加至select
  if (request.readyState == 4) {
    if (request.status == 200) {
  var a=new Array;
var b=request.responseText;
 a=b.split(",");
  document.getElementById("shi").length=1;//重新选择
  document.getElementById("xian").length=1;//重新选择
if(document.getElementById("sheng").value!="province"){
  var obj=document.getElementById('shi');  
  for(i=0;i
      obj.options.add(new Option(a[i], document.getElementById("sheng").value*100+i+1)); //ocument.getElementById("sheng").value*100+i+1对应的是市的ID。
}
    }
  }
}
function displayCounty() {//将获取的数据增加至select
  if (request.readyState == 4) {
    if (request.status == 200) {
  var a=new Array;
var b=request.responseText;
 a=b.split(",");
 document.getElementById("xian").length=1;
if(document.getElementById("sheng").value!="province"&&document.getElementById("shi").value!="city"){
  var obj=document.getElementById('xian');  
  for(i=0;i
      obj.options.add(new Option(a[i],i+1001)); 
}
    }
  }
}

getDetails.php代码:

<?php
header("Content-Type: text/html; charset=gb2312");
$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$connstr = "Provider=SQLOLEDB;Persist Security Info=False;User ID=root;Password=123456;Initial Catalog=area;Data Source=localhost";
if($_REQUEST['ID']==0){//获得省列表
$conn->Open($connstr); //建立数据库连接
$sqlstr = "select name from Province"; //设置查询字符串
$rs = $conn->Execute($sqlstr); //执行查询获得结果
$num_cols = $rs->Fields->Count(); //得到数据集列数
$Province=array();
$i=0;
while (!$rs->EOF) {
$Province[$i]=$rs->Fields['name']->Value.",";
$rs->MoveNext();
$i++;
}
foreach($Province as $val)
echo $val;
$conn->Close();
$rs = null;
$conn = null;
}
if($_REQUEST['ID']>0&&$_REQUEST['ID']<35){//获得省对应的市列表
$conn->Open($connstr); //建立数据库连接
$sqlstr = "select name from City where cid=".$_REQUEST['ID']; //设置查询字符串
$rs = $conn->Execute($sqlstr); //执行查询获得结果
$num_cols = $rs->Fields->Count(); //得到数据集列数
$City=array();
$i=0;
while (!$rs->EOF) {
$City[$i]=$rs->Fields['name']->Value.",";
$rs->MoveNext();
$i++;
}
foreach($City as $val)
echo $val;
$conn->Close();
$rs = null;
$conn = null;
}
if($_REQUEST['ID']>100){//获得省市对应的县列表
$conn->Open($connstr); //建立数据库连接
$sqlstr = "select name from County where cid=".$_REQUEST['ID']; //设置查询字符串
$rs = $conn->Execute($sqlstr); //执行查询获得结果
$num_cols = $rs->Fields->Count(); //得到数据集列数
$County=array();
$i=0;
while (!$rs->EOF) {
$County[$i]=$rs->Fields['name']->Value.",";
$rs->MoveNext();
$i++;
}
foreach($County as $val)
echo $val;
$conn->Close();
$rs = null;
$conn = null;
}
?>

数据库设计,表格Province表,City表,County表。
要求:Province表需要id和name,id建议从1至34,例如北京id为1,广东id为2,以此类推;
        City表需要id,name和cid,id为cid*100+1,cid为该市的上级,例如深圳的上级为广东省,cid为2的话,深圳的id就是201,以此类推。
        County表需要id,name和cid,因为是三级的关系,id可以随意,建议从10001开始自增。cid为所在上级,例如宝安区的cid为201,龙岗区的cid也为201;

截图:

 HTML效果:

PHP+Mysql+Ajax+JS实现省市区三级联动

完成后效果:

PHP+Mysql+Ajax+JS实现省市区三级联动

PHP+Mysql+Ajax+JS实现省市区三级联动

PHP+Mysql+Ajax+JS实现省市区三级联动

备注:PHP是服务器端的,建议发布网站后通过ip调试。

PHP 相关文章推荐
PHP 文件上传功能实现代码
Jun 24 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
Aug 22 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
php实现简单的语法高亮函数实例分析
Apr 27 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
基于PHP实现数据分页显示功能
May 26 PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 PHP
php的无刷新操作实现方法分析
Feb 28 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP接入支付宝接口失效流程详解
Nov 10 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 PHP
PHP解析html类库simple_html_dom的转码bug
May 22 #PHP
浅谈discuz密码加密的方式
May 22 #PHP
PHP函数strip_tags的一个bug浅析
May 22 #PHP
PHP学习笔记之字符串编码的转换和判断
May 22 #PHP
PHP+memcache实现消息队列案例分享
May 21 #PHP
php+highchats生成动态统计图
May 21 #PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 #PHP
You might like
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
如何在php中正确的使用json
2013/08/06 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
javascript 日期时间 转换的方法
2013/02/21 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
文秘人员工作职责
2014/01/31 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
护理专业自荐书
2014/06/04 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
国富论读书笔记
2015/06/26 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
详解Python中*args和**kwargs的使用
2022/04/07 Python