後端基礎:用 PHP 與 MySQL 學習後端基礎 part1

Hugh's Programming life
14 min readJun 30, 2019

--

這部份的內容是 後端基礎概念:php 與 資料庫基本知識 的加強

在建構好執行環境之後,就可以開始寫 PHP。

PHP

在 PHP 檔案裡面,使用 PHP 的指令,如果沒有用 PHP 標籤包起來,就不能執行。所以都要使用

<?php
...
?>

或是

<?
...
?>

但是後者在某些伺服器可能會不支援,所以需要多注意。所以一般來說還是要使用第一種比較好。

像是在 each 一樣也可以放入標籤,這樣標籤在網頁就會直接呈現

<?php
echo '<h1>123</h1>'
?>

這樣就會得到 h1 標題大小跟粗體的 123

PHP 的變數的是每次都要加入 $ 字號才可以

array 跟 array 長度

$arr = array(1, 2, 3, 4, 5);
echo "length: " . sizeof($arr); // 5
// 取得 arr 最後一個
echo $arr[sizeof($arr) - 1];

php 不能印出 array ,要轉成字串之後才可以或是利用另外一個方法

var_dump($arr); // type, value 

這樣除了會印出陣列之外,連陣列每個裡面的型態跟字數都會告知。參考資料

或是使用

print_r($arr) // 只會印出內容。

-

function

function($a, $b) { 
return $a + $b
}
echo add(1, 3)
// 4

總結:

PHP 的特性:

  1. 變數前面都要加 $ 字
  2. 結尾都要加分號
  3. 印出陣列要用別的方法處理:var_dump、print_r
  4. 字串拼接是用 . 號

Apache 與 PHP 原理簡介

要講一個很重要的東西。PHP 從頭到尾是怎麼回事?

網路協定下,會有一個 request 發送給 server 然後在回應一個 response

所以 PHP 的角色其實沒這麼重要,因為只是 server 的其中一環。

這個 server 接收到資料之後會交給 Apache,Apache 會把資料交給 PHP,PHP 再把資料交給 HTML,最後回傳給 Apache, Apache 再發 response 給 Client。

Apache 可以通過 Chrome 的 dev tools 看到,就在 header 內部的 Response header 中的 Server 就可以看到採用的是那一種版本的 Apache 甚至 PHP 等等都可以看到。

不過一般這些資訊在實際上都會被隱藏,也是為了資訊安全而做。

Apache 做的事件很簡單,就是得到一個 request 之後傳給需要處理的地方,然後再把處理完的結果 response。

也可以發現到,Apache 其實整個結構也是資料夾結構般的結構。這原因是因為當初在設定的時候,就只能設定在當下的那個資料夾內,所以只能取得該資料夾內部的資料。

http://localhost:999/hugh/index.php

另外一提,像是 Facebook 的結構就不是像這樣子了

https://www.facebook.com/1786072530

主要是因為這些是可以調整的,會呈現像資料夾結構般 Apache 的預設結構。

以 facebook 來說:當 Facebook 得到一個 request 之後,可以把這個 request 丟給某個 php 處理,就如同下面所呈現的樣子

request(facebook.com/1786072530)→ facebook server → ... → response

假設 facebook 也是用 php 處理

內部:
facebook.com/1786072530 → user.php → output → response

所以到底什麼是 sever? server 其實就也只是一個程式而已。只是專門處理 request 跟 response,用寫程式的方式就類似於下面這樣(非實際執行)。

function server(request) { 
...
$output = handle_request(user.php)
return $output
}

所以 PHP 還是要經過編譯之後在輸出,否則就只能輸出原始碼。

總結:伺服器使用的時候,預設是使用檔案路徑的方式。但實際上我們可以另外寫個方法來,讓路徑呈現的方式不一樣。就是像 facebook 的例子那樣,可以讓近來的 request 透過伺服器分析之後,交給 user.php 檔案,然後該 php 檔案在處理完之後,把資料呈現出來。

資料庫基礎

資料庫系統介紹:

前面介紹到 server 就是一個程式,專門處理 request 跟 response 的程式。

資料庫系統也是一個程式,專門在處理資料的程式。

為什麼我們需要資料庫?因為因為常常會需要儲存資料,但沒有資料庫也可以存取資料的。那就要存在變數裡面,或是說記憶體,而這些都會隨著程式的關閉而資料消滅,所以要怎麼處理呢?所以為了下一次運行的時候,還可以存取這些資料,就像是我們在儲存資料的時候那樣,存檔,這也是最早的方法,但這樣會因為要找資料,就必須要手動去處理。資料結構可能像下面這樣子。假設是學生的分數資料,有一筆要管理:

存檔
學號, 國文分數, 英文分數, 數學分數, 總分
1001, 10, 20, 30, 60
1002, 20, 20, 20, 60
...
...
...

這樣的話,需要某一筆資料的話,就必須要去手動找尋。所以就有人開發了資料庫來幫忙管理。其實資料庫的底層還是一樣存在硬碟,只是提供一個友善的界面,可以使用程式語言去把資料管理資料。這就是資料庫系統的主要價值所在。

-

資料庫系統有分兩種:

第一種是關聯性資料庫,會有一個 table,就像是表格一樣,可以建立很多不同的 table。就像是 excel 那樣。關聯的意思就是,建立的 table 可以設置不同的種類的名詞,來把同樣類型的資料放在一起,存取的時候,中間只需要用一個 id 來分別各種不同的 table 的資料是屬於誰的資料。以前面學生為例子,可能有學生的分數、個人資料等等的資訊,那就可以通過學號(id)來方便不同 table 之間的關聯性。

關聯性資料庫的語言是 SQL

-

第二種就是非關聯得資料庫,名稱是 NoSQL 也稱為 Not only SQL 。在 SQL 的資料型態會有一些限制,像是只能儲存數字或字串。而 非關聯的方式就可以儲存一些 array 或是 object。兩者都很好用,只是適用的場合不同。比較經常是儲存一些 LOG,而這種儲存方式則是可以依據需求去額外添加一些資料,就不會像 SQL 一樣,為了儲存那些資料,必須要額外開一個欄位來儲存,如果是常常需要不同類型的資料 SQL 就會變得很複雜。所以就可以使用 NoSQL 來儲存。而 NoSQL 有這種好處的原因就在於跟 SQL 比起來,NoSQL 的結構就比較鬆散。

而這些資料庫型態其實都只是個統稱而已。實際上有各種不同別人時做出來的資料庫。

-

最有名的關聯資料庫就是 MySQL,還有很多種,像是 PostgreSQL、MongoDB、MSSQL。這些關聯性資料庫都很接近,只是它們底層的 SQL engine 運作的方式可能不太一樣。每套 SQL 都有自己的語法,大都是大同小異,可能是一些功能上的不同而已。但因為概念跟語法形式都差不多,所以學了一套之後,其他套也會很容易上手。

如何管理資料庫

資料庫就是程式。所以操作的方法最簡單的就是 CLI 去操控或是使用 GUI 。GUI 介面比較有名的是 phpMyAdmin,這套是用 PHP 寫成的。所以就只是一個 PHP 的檔案,專門拿來管理資料庫的。

其他還有比較多人使用的,像是 adminer、Sequel Pro,這些都是協助我們管理資料庫的程式,所以沒有了它們一樣也可以管理資料庫。

Table schema 簡介

Schema 就是結構。所以在資料庫內部的一個 table 就會有一個是結構。所以一般我們說 schema 就是在說那個 table 的結構。

一個資料庫一定會有,名稱跟型態。這樣才可以知道是什麼資料,是什麼型態。名稱可以想成是那個欄位的 key ,這樣才可以分辨是誰的資料,型態才可以知道這資料要怎麼儲存。

編碼與排序,這個是很重要的一部分,如果沒設定好就會儲存成亂碼。

空值就是可否允許空值、可以設置預設值等等的資料。

所以要新增 table 可以直接新增。然後需要輸入 id 接著選擇型態。型態有很多種資料,像是數值就可以選很多種,分這麼細的原因是在我們知道這邊要儲存什麼樣內容之後,就可以選擇對應的型態,讓資料庫做最好的規劃。只要把鼠標放在名稱上面,就可以看到介紹。還可以設定預設值,一個是 Null ,另一個是儲存時間。編碼這邊還可以每個資料分開選,如果不選的話就是使用 table 的預設值。

屬性,這邊選 UNSIGNED,那資料在儲存的時候,就不會用上負數,所以資料就可以多一倍。意思就是像型態選了 TINYINT,就會由 -128 ~ 127,變成儲存 0 ~ 255。

A_I 這就是自動填入,通常 ID 都會勾選,因為每一個 row 都要有一個 ID,才可以分辨資料。這需要搭配索引。

其他就是比較複雜,所以就先不用了解。

其他的重點還有型態,有個字串 CHAR、VARCHAR,而通常字串較少的會儲存成 VARCHAR 這樣會較省資源,比如說 username 就可以長度填入 20,意思就是最多可以儲存到 20 位字串。超過就不能存,會返回錯誤。

DATE,這邊也有好幾種,一般在設定的時候,通常會儲存創造時間(create at),就可以利用型態 date 搭配上預設值的 CURRENT_TIMESTRIP,這樣在儲存的時候,就可以自動把儲存當下的時間儲存起來,所以就不用針對這種類型的資料去另外寫程式碼儲存,也就是說,他在創造文章的時候,就不需要特別寫程式去抓取創造文章的時間了,因為資料庫會幫你管理好這件事情了。

補充資料:

自動新增 id 的部份不一定是照順序的,假如本來有個 id 5 的資料,刪除了之後,再次新增,就會從 id 6 開始,所以自動新增只是保證一定是遞增的。沒有保證照順序。

資料庫的資料是很重要的一部分,因為資料型態如果不對的話,資料庫就不給寫入了。所以在寫資料庫的時候,很多地方都要思考清楚再去創造。例如說需要多少種 table,每種 table 需要哪些資料等等。所以說創造資料庫的時候,schema 要怎麼做要想清楚。否則的話,之後在實作其他部分,就會變得比較困難。

Index、Unique 這些有什麼用?

這部分是解說一些前面沒有說到的細節。

主鍵(Primary key, pk)

設定成主鍵的這個欄位必須要滿足幾個條件,第一不能為空值,第二是不能重複,在這個 table 的幾個欄位中是最重要的東西才會這設置成 Primary key,假設設置的是員工的資料,那 Primary key 就是 員工編號。因為這是這家企業中不會重複的資料。

Unique

這是要確保這個欄位的資料都沒有重複,所以利用這個欄位可以使資料不寫入重複資料。另外一點是 Primary key 一定是 Unique,所以就不用另外再設定了。像是不想有相同的帳號,相同的 email 就可以利用這個欄位。

Index

索引。從索引可以很快的找到想要的資料,在資料庫裡面也是這個意思。建立索引就是會讓資料的相同性額外建立一個資料表,這樣在找資料的時候,就可以快速的找到,也因為這樣子,所以一定會佔用一些空間,因為建立索引的時候,會需要花一些時間等資料庫建立完成,但這樣的好處是在查詢的時候,可以非常快速的查詢到要的資料。例如說我有很多人的名字清單,我想要查詢名字裡面有 nick 這個名字的人,就可以透過索引的方式去建立,然後以後在查詢的時候,就可以快速查詢到了。這也是一個很重要的部份。

Index 可以是複合的,意思就是可以把兩個欄位的資料一起建立索引。

大致就是對於很常需要去查資料的內容去建立索引,這樣就可以省下很多時間。

MySQL 語法簡介

我們可以從 phpMyAdmin 直接看到執行的語法。

指令忘記的話,就可以在這邊找如何下指令。基本的指令就可以在這邊使用就可以了。

查詢資料 Select

非常常用到的一個指令,不管要做什麼都可以用這個指令查詢一下。

SELECT * FROM `users` // 選擇全部,* 是全部的意思

這邊很少見的使用 ` 號,其實不使用也可以。還是可以執行。

所以這邊的格式是

 SELECT (選擇的對象) FROM (對象,table 名稱)

對象可以多重選擇用逗號隔開即可

SELECT id, content FROM `users`

還可以改變欄位名稱

就是使用 as

SELECT id as name FROM `users`

本來的 id 欄位名字變成 name

-

where + 條件

SELECT id FROM `users` where id=2

找尋 id 那筆 id=2 的資料。

-

where 條件 and 條件。同時符合

還可以混合應用。

SELECT * FROM `users` WHERE username="13fn=aniosnmdoa" AND content="dmiokfmispdfd"

去找尋 username 等於那樣且 content 等於那樣的資料,然後可以利用 * 的部份調整想要顯示的資料。這邊用 * 是全部的意思,所以只要相關的資料就會全部都顯示出來。

另外還可以利用 or 只要兩個調整其中一個成立就顯示資料。

另一點是如果是使用 WHERE 1 的話,因為 1 永遠都是 true 所以就會把所有的資料顯示出來。所以加跟不加是一樣的意思。

還有很多種選擇方式,像是 id > 10 的資料,或是字串中的某部份有沒有符合,這邊部份等用到的時候再去查看即可。

-

新增資料 Insert

在 SQL 中,選擇了 INSERT 之後,就會幫我們套用好可能會用到的資料。

` 在這邊的用意是把名稱包起來,因為如果名稱內使用一些語法的詞的話,會被判斷為是語法,例如說名稱叫做 insert number 不用 ` 包起這個名稱,的話 insert 就會被判斷成語法。進而引發錯誤。但如果沒有這種情況的話,不加也是可以的。

另一點是只要是字串就要加上雙引號。

然後我們可以把上面指令的部份修改一下。像是 ID 可以自動生成,所以就不需要了,而 create at 也是一樣,系統會自動抓取時間,所以也不用寫入。就可以修改成:

INSERT INTO users(username, content) VALUES ("username01", "content01")

-

修改資料 Update

phpMyadmin 按下 update 之後,一樣會出現預設指令。

這邊的 where 很重要,因為不加的話,會直接把指定的欄位通通改成那個值,所以要利用 where 設置條件來選取所要要變動的那個筆資料。

UPDATE users SET username=”user01" WHERE id=1

這段的意思是 把 users table 裡面 id 是 1 的資料的 username 改為 user01。

一樣也可以一次更改很多資料:

UPDATE `users` SET username="user02" , content="content02" WHERE id=2

更改的資料要用逗號( , )隔開。

切記,沒有 where 就會改變所有的欄位資料,所以務必加上

-

刪除資料 Delete

這指令很簡單。就是指定一個條件,刪除符合條件的那個資料

DELETE FROM users WHERE id=3

額外補充,其實在刪除的時候,資料庫並不是真正的刪除,有些資料庫,會有類似的機制。

會在 table 另外新增一個 is_deleted ,當資料被刪除的時候,就會用這個欄位來標示,會把 is_deleted 布林值,設置為 1。所以利用 where 設置條件的時候,有這種機制的資料庫,會自動幫 where 加上 is_deleted = 0 的條件,好避開已經被刪除的資料。

--

--

Hugh's Programming life
Hugh's Programming life

Written by Hugh's Programming life

我是前端兼後端工程師,主要在前端開發,包括 React、Node.js 以及相關的框架和技術。之前曾擔任化工工程師的職位,然而對電腦科技一直抱有濃厚的熱情。後來,我參加了轉職課程並開設這個部落格紀錄我的學習過程。於2020年轉職成功後,我一直持續精進技能、擴展技術範疇跟各種對人生有正面意義的學習,以增加我的工作能力。

No responses yet