各位看官們!其實本人我真的很懶惰,想到很多主題可以去深入,但是人啊,惰性總是有的,要不是我碼農村民一直提醒我要打,不然真的又浪費掉一個禮拜,進入正題吧。
在上一篇有說到JSON的介接,但是沒有做到很完全,其實我想做的應該不只是上次那樣的成果,但我的構想還是慢慢一步實做,可能會比較好,這次我在網路上搜尋到某個機關的開放式資料(OpenData),稍微做個簡單的介接,或許比較知道上次在做什麼,延伸了哪些東西,進入正題吧!
環境
為了方便寫程式,就不特別架Linux伺服器,所以使用的套裝軟體XAMPP當作簡單的架站環境
- Apache 2.4.41,
- MariaDB 10.4.11,
- PHP 7.4.2,
- phpMyAdmin 5.0.1,
- OpenSSL 1.1.1,
- XAMPP Control Panel 3.2.4,
介接JSON資料
到了這裡各位應該很納悶,資料我該去哪裡找?該請誰提供?其實網路有很多政府單位或業者提供,Google搜尋OpenData其實很多,提供多種格式,下面我列出幾個網站給大家自己去尋寶,方便以後做練習或是運用。這次我選了政府資料開放平台裡面的獨立書店 我看起來資料量不會很大,但裡面有一些不一樣的地方,所以跟大家分享這次介接。
介接網址在這: https://data.gov.tw/dataset/6224
- 六角學院 這次投稿的API w3HexSchool 鼠年全馬鐵人挑戰
https://raw.githubusercontent.com/hexschool/w3hexschool-API/master/data.json
- 文化部-文化資料開放資訊網
https://opendata.culture.tw/
- 政府資料開放平台
https://data.gov.tw/
- 國家公共資訊圖書館
https://www.nlpi.edu.tw/OpenDataListC006480.aspx?appname=OpenDataListC006480
- 臺中市政府開放資料平台
https://opendata.taichung.gov.tw/
MYSQL資料庫
建立資料庫
資料庫名稱: api [color=#ffb85e]
1 2 3 4
| CREATE DATABASE IF NOT EXISTS `api` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE `api`;
|
新增資料表
平台所提供的欄位不只有下面表格所列出的這些,例如裡面包含version、fax、phone、opentime等等,但這些都不需要,獨立書店的欄位中,我們只需要以下欄位做處理寫入。[color=#ffb85e]
中文名稱 |
欄位代號 |
編號 |
id |
名稱 |
name |
名稱英文 |
name_eng |
簡介 |
intro |
簡介英文 |
intro_eng |
群組類別 |
groupTypeName |
主類別 |
mainTypeName |
類別KEY |
mainTypePK |
代表圖像 |
representImage |
郵遞區號 |
areaCode |
縣市 |
cityName |
地址 |
address |
經度 |
longitude |
緯度 |
latitude |
點閱數 |
hitRate |
資料表名稱: book_store [color=#ffb85e]
為了方便,所以我還是把SQL語法給打上來了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| CREATE TABLE `api`.`book_store` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '編號' , `name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名稱' , `representImage` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '代表圖像' , `intro` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '簡介' , `intro_eng` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '簡介英文' , `name_eng` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名稱英文' , `groupTypeName` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '群組類別' , `mainTypeName` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主類別' , `mainTypePK` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '類別KEY' , `areaCode` INT NULL DEFAULT NULL COMMENT '郵遞區號' , `cityName` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '縣市' , `address` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '位址' , `longitude` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '經度' , `latitude` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '緯度' , `hitRate` INT NOT NULL COMMENT '點閱數' , PRIMARY KEY (`id`) ) ENGINE = MyISAM;
|
建立資料庫連線
這邊主要以PHP 7的語法做範例
config.php [color=#ffb85e]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| $DB_HOST = "localhost"; $DB_NAME = "api"; $DB_USER = "root"; $DB_PASSWORD = ""; $DB_PORT = "3306";
$DB_LINK = new mysqli($DB_HOST,$DB_USER,$DB_PASSWORD,$DB_NAME,$DB_PORT);
if($DB_LINK->connect_error){ die("錯誤代碼" . $DB_LINK->connect_errno . '。錯誤訊息為:'. $DB_LINK->connect_error); exit; }else{ }
$DB_LINK -> query("SET NAMES 'utf8'");
$DB_LINK -> select_db("api");
$DB_LINK->close();
|
JSON資料存進資料庫
有些人會有疑問,資料在做資料庫的時候,真的有必要這麼麻煩嗎?其實這就要看資料的完整性,有時候要做出排除才能達到我們所要的結果。
把自己所需的欄位存進資料庫
※ array_key_exists ( 陣列群裡的其中一個$key , 陣列群 )
此函數在這用在判斷JSON轉換陣列以後是否有某個陣列存在使用。
※ mysqli_real_escape_string(SQL連接,轉換的字串);
主要轉換字串裡面會有一些關鍵字需要做跳脫的動作,以免SQL執行時會造成錯誤
詳細介紹:https://www.w3school.com.cn/php/func_mysql_real_escape_string.asp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| require_once "config.php";
$url = "https://cloud.culture.tw/frontsite/trans/emapOpenDataAction.do?method=exportEmapJson&typeId=M";
$url_content = file_get_contents($url);
$Array = json_decode($url_content,true);
$BOOK_JSON = array();
foreach($Array as $key => $value){ $BOOK_JSON[] = array( 'name' => (array_key_exists('name',$value)) ? $value['name'] : "", 'representImage' => (array_key_exists('representImage',$value)) ? $value['representImage'] : "", 'intro' => (array_key_exists('intro',$value)) ? $value['intro'] : "", 'intro_eng' => (array_key_exists('intro_eng',$value)) ? $value['intro_eng'] : "", 'name_eng' => (array_key_exists('name_eng',$value)) ? $value['name_eng'] : "", 'groupTypeName' => (array_key_exists('groupTypeName',$value)) ? $value['groupTypeName'] : "", 'mainTypeName' => (array_key_exists('mainTypeName',$value)) ? $value['mainTypeName'] : "", 'mainTypePK' => (array_key_exists('mainTypePK',$value)) ? $value['mainTypePK'] : "", 'areaCode' => (array_key_exists('areaCode',$value)) ? $value['areaCode'] : "", 'cityName' => (array_key_exists('cityName',$value)) ? $value['cityName'] : "", 'address' => (array_key_exists('address',$value)) ? $value['address'] : "", 'longitude' => (array_key_exists('longitude',$value)) ? $value['longitude'] : "", 'latitude' => (array_key_exists('latitude',$value)) ? $value['latitude'] : "", 'hitRate' => (array_key_exists('hitRate',$value)) ? $value['hitRate'] : "" ); }
foreach($BOOK_JSON as $key => $value){ $key_array = array(); $value_array = array(); foreach($value as $key2 => $value2){ $key_array = $key2; $value = mysqli_real_escape_string($DB_LINK,$value2); $value_array = "'".$value."'"; } $insert_key = implode(',',$key_array); $insert_value = implode(',',$value_array); $sql = "INSERT INTO book_store ($insert_key) values($insert_value)"; mysqli_query($DB_LINK,$sql); }
|
存取結果
以下畫面太長的關係,只貼出一部分。資料庫的欄位有些空的,是程式有問題嗎?還是資料有問題?其實是這個資料給的其實就有些是空的了,但這些空的資料就看做處理的人要不要去除掉還是保留了。例如有些郵遞區號都是空的,其實可以自己依照地址再去做加以處理,讓資料更完整,或是個別去搜尋相關資訊。
結論
有些人可能覺得這上面也太簡單了,
或者是這也叫做是文章嗎?
但對我而言可以當作是一個筆記吧!
也可以給一些需要的人做一個參考使用,
一點一滴的經驗,成為自己的小小成就。
下一篇我要介紹的不是只有做後端的存取等應用,
會搭配AJAX應用,讓JSON可以更活化。
標籤: w3HexSchool
Json
PHP