話說這個PHP腳本我已經寫過好多次了,不過由於國家統計局提供的數據格式有些許的變化,所以我又重寫了一遍,問題既涉及到PHP,同時也涉及到MySQL,感覺很適合做面試題,這類問題往往最能反映出求職者的基本素質。
准備工作:需要下載最新縣及縣以上行政區劃代碼,並保存成data.txt文件。
最新縣及縣以上行政區劃代碼
首先創建MySQL表:
需要注意的是表的字符集和文件的字符集需要一致。
CREATE TABLE IF NOT EXISTS `region` (
`id` int(10) unsigned NOT NULL,
`parent_id` int(10) unsigned NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB;
補充:更好的存儲層次化的數據:Storing Hierarchical Data in a Database Article。
然後編寫PHP腳本:
需要注意的是自己保證data.txt文件內容的合法性,代碼本身未做嚴禁的校驗。
<?php
// config
$host = '';
$dbname = '';
$charset = '';
$username = '';
$password = '';
set_time_limit(0);
$dsn = "mysql:host={$host};dbname={$dbname};charset={$charset}";
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);
$dbh = new PDO($dsn, $username, $password, $options);
$handle = fopen('data.txt', 'r');
$parent = array();
while (!feof($handle)) {
$row = trim(fgets($handle));
if (!preg_match('/(\d+)(\s+)(.+)/', $row, $matches)) {
continue;
}
list($row, $id, $delimiter, $name) = $matches;
if (!isset($separator)) {
$separator = $delimiter;
}
$level = substr_count($delimiter, $separator);
$parent_id = $level > 1 ? $parent[$level - 1] : 0;
$parent[$level] = $id;
$sth = $dbh->prepare('
INSERT INTO region (id, parent_id, name)
VALUES (:id, :parent_id, :name)
');
$sth->bindValue(':id', $id, PDO::PARAM_INT);
$sth->bindValue(':parent_id', $parent_id, PDO::PARAM_INT);
$sth->bindValue(':name', $name);
$sth->execute();
}
fclose($handle);
?>
說明:根據自己的情況填寫好配置選項就可以運行了。
……
有了官方的行政區劃代碼,再配上民間的純真IP數據庫,就更完美了。
作者:老王