导入【 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可以找到子级或者是父级,需要再次调整的可以据此进行调整到适合自己的方案。  

posted @ 2014-08-01 00:04  Zell~Dincht  阅读(775)  评论(2编辑  收藏  举报