各位看官們!其實本人我真的很懶惰,想到很多主題可以去深入,但是人啊,惰性總是有的,要不是我碼農村民一直提醒我要打,不然真的又浪費掉一個禮拜,進入正題吧。
在上一篇有說到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

  1. 六角學院 這次投稿的API w3HexSchool 鼠年全馬鐵人挑戰
    https://raw.githubusercontent.com/hexschool/w3hexschool-API/master/data.json
  2. 文化部-文化資料開放資訊網
    https://opendata.culture.tw/
  3. 政府資料開放平台
    https://data.gov.tw/
  4. 國家公共資訊圖書館
    https://www.nlpi.edu.tw/OpenDataListC006480.aspx?appname=OpenDataListC006480
  5. 臺中市政府開放資料平台
    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";

// MySQLi,物件導向的方式
$DB_LINK = new mysqli($DB_HOST,$DB_USER,$DB_PASSWORD,$DB_NAME,$DB_PORT);

// 檢查連線是否正常 列印錯誤日誌 ※mysqli_connect_error() 是顯示連線錯誤訊息
if($DB_LINK->connect_error){
die("錯誤代碼" . $DB_LINK->connect_errno
. '。錯誤訊息為:'. $DB_LINK->connect_error);
exit;
}else{
// 印出SQL資訊
// echo "Connect Successfully. Host info: " . $DB_LINK->host_info;
}

// 設定連線編碼為utf8
$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";

// 取得JSON 資料內容
$url_content = file_get_contents($url);

// 將JSON格式的字符串 進行編碼
$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的數組為陣列
$key_array = array();
// 宣告要value的數組為陣列
$value_array = array();
// 第二維陣列,每筆資料的內容(店家資料)
foreach($value as $key2 => $value2){
$key_array = $key2;

// mysqli_real_escape_string PHP針對SQL做跳脫的語法
$value = mysqli_real_escape_string($DB_LINK,$value2);
$value_array = "'".$value."'";
}

// 將陣列轉化為字串
$insert_key = implode(',',$key_array);
$insert_value = implode(',',$value_array);

// SQL語法
$sql = "INSERT INTO book_store ($insert_key)
values($insert_value)";
// 執行資料操作
mysqli_query($DB_LINK,$sql);
}

存取結果

以下畫面太長的關係,只貼出一部分。資料庫的欄位有些空的,是程式有問題嗎?還是資料有問題?其實是這個資料給的其實就有些是空的了,但這些空的資料就看做處理的人要不要去除掉還是保留了。例如有些郵遞區號都是空的,其實可以自己依照地址再去做加以處理,讓資料更完整,或是個別去搜尋相關資訊。

結論

有些人可能覺得這上面也太簡單了,
或者是這也叫做是文章嗎?
但對我而言可以當作是一個筆記吧!
也可以給一些需要的人做一個參考使用,
一點一滴的經驗,成為自己的小小成就。

下一篇我要介紹的不是只有做後端的存取等應用,
會搭配AJAX應用,讓JSON可以更活化。

標籤: w3HexSchool Json PHP