当前位置: 首页 > news >正文

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

转载于:https://www.cnblogs.com/Zell-Dinch/articles/3881368.html

相关文章:

  • 前端代码风格自动化系列(二)之Commitlint
  • SharePoint 2013 Designer 入门教程
  • SparkStreaming的实战案例
  • const let
  • 冷启动问题:如何构建你的机器学习组合?
  • hive报错 Another instance of Derby may have already booted the database
  • iOS应用审核的通关秘籍【转】
  • QTP常用功能
  • TCP三次握手
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • Windows和Linux环境下Memcached安装与配置(转)
  • 如何给wordpress首页自动显示文章内容的第一个图片
  • Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机
  • haslayout
  • python练习程序(批量重命名)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • ➹使用webpack配置多页面应用(MPA)
  • 10个最佳ES6特性 ES7与ES8的特性
  • 2017届校招提前批面试回顾
  • 4个实用的微服务测试策略
  • CSS中外联样式表代表的含义
  • java概述
  • js ES6 求数组的交集,并集,还有差集
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • python docx文档转html页面
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring声明式事务管理之一:五大属性分析
  • vue脚手架vue-cli
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 力扣(LeetCode)357
  • 力扣(LeetCode)965
  • 前端知识点整理(待续)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何编写一个可升级的智能合约
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 思维导图—你不知道的JavaScript中卷
  • 突破自己的技术思维
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序button引导用户授权
  • 协程
  • ​ArcGIS Pro 如何批量删除字段
  • (1)(1.13) SiK无线电高级配置(六)
  • (14)Hive调优——合并小文件
  • (175)FPGA门控时钟技术
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (简单) HDU 2612 Find a way,BFS。
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ***检测工具之RKHunter AIDE
  • .NET使用存储过程实现对数据库的增删改查