导入【 http://ip.qq.com/js/geo.js】外部省市县三级地区到Mysql数据库
1、QQ提供的一个外部省市县三级地区的js文件:
http://ip.qq.com/js/geo.js
我在我的HTML页面调用这个外部js文件
<script type='text/javascript' src=' http://ip.qq.com/js/geo.js' charset='GBK'></script>
如果不想调用这个外部文件,也可以另存为本地js文件
注意这里的charset='GBK' 表示这个外部文件是GBK格式的,在utf-8格式的HTML页面引入GBK格式的这个js文件必须要声明这个外部文件的编码格式,否则会乱码
这里我附上一个省市县三级联动的demo:
<!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" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>省市县三级联动</title>
<script type="text/javascript" src="http://ip.qq.com/js/geo.js" charset="GBK"></script>
</head>
<body onload="setup();preselect('省份');promptinfo();">
<form>
<select class="select" name="province" id="s1">
<option></option>
</select>
<select class="select" name="city" id="s2">
<option></option>
</select>
<select class="select" name="town" id="s3">
<option></option>
</select>
<input id="address" name="address" type="hidden" value="" />
<input onclick="alert(document.getElementById('address').value); return false;" type="submit" value="提交" />
</form>
<script type='text/javascript'>
//这个函数是必须的,因为在geo.js里每次更改地址时会调用此函数
function promptinfo () {
var address = document.getElementById('address');
var s1 = document.getElementById('s1');
var s2 = document.getElementById('s2');
var s3 = document.getElementById('s3');
address.value = s1.value + s2.value + s3.value;
}
</script>
</body>
</html>
<?php
//导入http://ip.qq.com/js/geo.js
function getAreas () {
$contents = file_get_contents("http://ip.qq.com/js/geo.js");//导入geo.js
$contents = iconv("gbk", "utf-8", $contents);//与我的html页面编码不一致,所以要转码
$reg = "/(dsy\.add.*\"\]\);)/";//找出规律,只保留我要的部分
preg_match_all($reg, $contents, $arr);//找出规律,只保留我要的部分
/*
//$arr, 如图;
*/
//规律
$areas = array();
foreach($arr[0] as $v) {
$f = str_replace(array('dsy.add(', ');', '[', ']','"',' '), array('','','','','',''), $v);//将不需要的部分替换为空字符串
$key = substr($f, 0, strpos($f, ','));//将0_n_x结构的部分作为键
$str = explode(',',substr($f, strpos($f, ',')+1));//将汉字部分作为值并且拆分成数组
$areas[$key] = $str;//保存到数组
}
/*
这里得出的结果如图所示:
*/
$proArr = array();//省
$cityArr = array();//市
$townArr = array();//县
foreach($areas as $k => $v) {
$l = substr_count($k, '_');//计算这个'_'出现的次数并且据此判断是否是省,市,县:'_'有0个-》省,'_'有1个-》市,'_'有2个-》县
if ($l == 0) {
$proArr[] = $v;//省
} else if ($l == 1) {
$cityArr[$k] = $v;//市
} else if ($l == 2) {
$townArr[$k] = $v;//县
}
}
//采用以下方式进行添加数据
//insert into pre_ts('areaname', 'pid') values(name1, pid1),(name2, pid2),(name3, pid3)...
$tab_name = "pre_areas";
//省
$p = insertAreas($proArr,$tab_name);
//市
$c = insertAreas($proArr,$tab_name);
//县
$t = insertAreas($townArr,$tab_name);
//或者其他插入数据库的方法如ThinkPHP中的M()->execute($sql);
mysql_query($p);//或者M()->execute($p);
mysql_query($c);
mysql_query($t);
}
//定义插入数据的方法
function insertAreas ($arr,$tab_name) {
$insert = "insert into {$tab_name}(`areaname`,`pid`) values";
foreach($arr as $k => $v) {
foreach($v as $ck => $cv) {
$insert .= ",('".$cv."', '".$k.'_'.$ck."')";
}
}
return $insert.substr($insert, 1);
}
//调用这个方法
首先需要创建一个表,比如pre_areas;
CREATE TABLE `pre_areas` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`areaname` char(16) NOT NULL,
`pid` char(12) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4512 DEFAULT CHARSET=utf8
getAreas();
?>
说明:
存入数据库如图:
在数据库中根据pid可以找到子级或者是父级,需要再次调整的可以据此进行调整到适合自己的方案。
----“做每天该做的事,不计结果!”
---- 因爲對於編程還只是新手,對很多知識掌握的不牢靠,歡迎大家批評指正~~|=-=|~~