PHP 程式設計怎麼學?掌握網頁開發與 MySQL 實作重點

PHP 程式設計的核心用途

PHP 程式設計主要用於網站後端開發。當使用者送出表單、登入會員、查詢商品或進行購物車操作時,PHP 會在伺服器端接收請求、執行商業邏輯、存取資料庫,再將結果輸出成 HTML 或 JSON。對想學習動態網站與資料庫應用的人來說,PHP 具備免費、開放原始碼、部署容易及資料庫支援完整等優點,適合用來建立內容管理系統、會員平台、預約系統與企業內部管理軟體。

PHP 的全名是 PHP: Hypertext Preprocessor,也就是「超文字預處理器」。它的語法受到 C、Java 與 Perl 等語言影響,初學者只要理解變數、運算式、條件判斷、迴圈、陣列與函數,便能逐步進入 PHP 網頁與資料庫程式開發。

需要注意的是,PHP 7.4 已於 2022 年 11 月停止官方安全支援。既有教材仍可用來理解基礎語法,但建立正式網站時,應選擇 PHP 官方仍支援的版本,並確認框架、套件及主機環境是否相容。

PHP 介紹與伺服器端運作方式

PHP 如何產生動態網頁

瀏覽器向網站送出 HTTP 請求後,網頁伺服器會將 PHP 檔案交給 PHP 執行環境處理。程式可以讀取表單資料、驗證登入狀態、查詢 MySQL 資料庫,再把處理結果傳回瀏覽器。使用者通常只能看到最後輸出的 HTML 或 JSON,不會直接取得伺服器上的 PHP 原始碼。

專案中的首頁常命名為index.php。如果伺服器已正確設定預設文件,開啟網站目錄網址時,系統便會自動載入index.php。這是 Web 伺服器的預設文件機制,不是 PHP 語言本身的特殊規則。

PHP 與前端技術的分工

HTML 負責頁面結構,CSS 負責版面與視覺樣式,JavaScript 處理瀏覽器端互動,PHP 則負責伺服器端邏輯。例如使用者填寫課程搜尋表單後,JavaScript 可以先檢查欄位是否空白,但真正的輸入驗證、權限判斷及資料庫查詢仍須在 PHP 後端執行。

PHP 網頁開發不能只依賴單一語言。開發者還應理解 HTTP、SQL、資料庫正規化、Cookie、Session、JSON 及基本資安原則。若要串接第三方服務,則需要了解 REST API、身分驗證與錯誤處理。

PHP 開發環境與基本執行方式

建立適合學習的環境

PHP 可以安裝於 Windows、macOS 與 Linux。初學者可使用整合式開發環境,也可以分別安裝 PHP、Web 伺服器及 MySQL。正式專案則常利用 Docker 建立一致的開發環境,降低不同作業系統與套件版本造成的差異。

安裝完成後,可以在終端機執行php -v確認版本。開發測試時,也能在專案目錄執行php -S localhost:8000啟動 PHP 內建伺服器。內建伺服器主要供本機開發使用,不應直接作為正式網站的公開伺服器。

第一個 PHP 程式

PHP 程式以<?php開始。純 PHP 檔案通常不必加入結尾標籤,以免檔案末端空白造成 HTTP 標頭或 Cookie 傳送錯誤。

<?php

$name = 'PHP';
echo "開始學習 {$name} 程式設計";

變數名稱以美元符號開始,並且區分大小寫。命名應能表達用途,例如使用$courseName,會比$x更容易閱讀與維護。

變數、資料型態與運算式

PHP 常見資料型態

PHP 常用資料型態包含字串、整數、浮點數、布林值、陣列、物件與null。PHP 屬於動態型別語言,變數不必先宣告固定型態,但這不代表可以忽略型別。表單與網址參數通常以字串形式傳入,進行數值計算或資料庫寫入之前,仍應驗證內容與轉換型別。

<?php

$courseName = 'PHP資料庫設計';
$price = 1200;
$isOpen = true;
$discountPrice = $price * 0.9;


現代 PHP 支援型別宣告及嚴格型別模式。正式專案可在檔案前加入`declare(strict_types=1);`,搭配參數型別與回傳型別,提早發現不符合預期的資料。

運算式與比較方式

PHP 提供算術、字串、比較及邏輯運算子。字串串接使用句點,數字加法使用加號。比較資料時,原則上應優先使用===!==進行嚴格比較,避免 PHP 自動型別轉換造成難以察覺的錯誤。

例如字串'0'、整數0與布林值false在寬鬆比較中可能出現非預期結果。登入、權限及付款狀態等重要判斷,更應清楚確認資料型別。

網頁表單設計與 PHP 資料接收

GET 與 POST 的使用時機

GET 參數會顯示在網址中,適合搜尋、篩選、排序與可分享的查詢條件。POST 資料放在請求內容中,適合新增、修改、登入與其他可能改變伺服器狀態的操作。POST 並不等於加密,涉及密碼或個人資料的網站仍必須使用 HTTPS。

PHP 可以透過$_GET$_POST取得輸入內容,但不應直接信任這些資料。所有來自瀏覽器、網址、Cookie、API 或上傳檔案的內容,都必須視為不可信輸入。

PHP 表單處理範例

<?php

$courseName = trim($_POST['course_name'] ?? '');

if ($courseName === '') {
    echo '請輸入課程名稱';

} else {

echo htmlspecialchars(

$courseName,

ENTQUOTES | ENTSUBSTITUTE,

‘UTF-8’

);

}

空值合併運算子??可以在欄位不存在時提供預設值,trim()可移除字串前後空白。輸出到 HTML 時,應使用htmlspecialchars()進行編碼,以降低跨網站指令碼攻擊風險。

若輸入的是電子郵件、整數或網址,可以搭配filter_var()驗證格式。後端驗證不能只判斷欄位是否為空,還要檢查長度、格式、允許範圍與業務規則。

PHP 日期時間與條件判斷

日期時間的正確處理方式

日期功能常用於課程開始時間、訂單成立時間及會員到期日。PHP 可使用DateTimeImmutable處理日期,這種物件在修改時間時會回傳新物件,不會直接改變原始值,通常較容易追蹤程式狀態。

<?php

$now = new DateTimeImmutable(

‘now’,

new DateTimeZone(‘Asia/Taipei’)

);

echo $now->format(‘Y-m-d H:i:s’);

網站應明確設定時區,不要完全依賴伺服器預設值。若系統服務跨國使用者,資料庫可統一儲存 UTC 時間,顯示時再依使用者所在時區轉換。

使用條件判斷控制流程

ifelseifelse適合依照條件執行不同邏輯。例如課程名額大於零時允許報名,否則顯示額滿訊息。switch適合處理多個固定值;現代 PHP 也可使用match運算式,並獲得較嚴格的值比較及直接回傳結果。

條件判斷不宜層層巢狀。可以先處理錯誤條件並提前回傳,讓主要流程保持清楚。權限檢查也不能只在畫面上隱藏按鈕,而必須在伺服器端再次判斷。

迴圈與陣列初探

迴圈的適用情境

for適合已知執行次數的情境,while適合依條件持續執行,foreach則最常用來逐筆處理陣列或資料庫查詢結果。建立課程清單時,可以用foreach輸出每門課程的名稱與狀態。

<?php

$courses = ['PHP基礎', '表單設計', 'MySQL資料庫'];

foreach ($courses as $course) {
    echo htmlspecialchars($course, ENT_QUOTES, 'UTF-8');

}

迴圈應設定明確終止條件,避免無限迴圈。處理大量資料時,不宜一次將所有紀錄載入記憶體,可採用資料庫分頁、批次查詢或產生器降低資源消耗。

索引陣列與關聯陣列

索引陣列以數字作為鍵值,適合表示一組連續項目;關聯陣列則以有意義的字串作為鍵,適合表示單筆結構化資料。

<?php

$course = [

‘id’ => 1,

‘name’ => ‘PHP程式設計’,

‘status’ => ‘open’,

];

常用陣列函數包含count()array_filter()array_map()array_column()in_array()。使用in_array()檢查內容時,建議將第三個參數設為true,啟用嚴格型別比較。

PHP 陣列使用方式分析表

陣列與流程工具比較

功能 適合情境 主要優點 注意事項
索引陣列 儲存多筆同類項目 結構簡單、容易迭代 刪除元素後索引可能不連續
關聯陣列 表示課程、會員或訂單資料 欄位名稱清楚 鍵不存在時應先檢查或使用??
foreach 逐筆讀取陣列 語法直覺、適合資料列表 參照迭代後要適當解除參照
array_map() 對每個元素執行轉換 能清楚表達資料轉換 複雜流程不宜全部塞入匿名函數
array_filter() 篩選符合條件的資料 可減少手動條件迴圈 回傳陣列可能保留原始鍵值
array_column() 擷取二維陣列的特定欄位 適合整理查詢結果 資料缺少欄位時需確認結果
count() 計算元素數量 使用簡單 不應在大型迴圈中重複做無謂計算

使用 course_db 設計網頁資料庫程式

從資料需求建立資料表

course_db為範例,可以規劃課程、講師與報名紀錄等資料表。每個資料表應有主鍵,關聯欄位可依需求設定外鍵與索引。課程名稱、上課時間、名額及狀態應使用合適的資料型態,而不是將所有資料都存成長字串。

資料庫設計的重點不只是完成 SQL 語法,而是先釐清資料實體、欄位責任與關聯。例如報名紀錄應連結會員及課程,不宜把會員姓名、課程名稱與全部資訊重複寫入每一筆資料。

使用 PDO 安全連線 MySQL

PHP 可透過 PDO 連線 MySQL。資料庫帳號與密碼不應直接提交到公開版本庫,可放在環境變數或受保護的設定檔中。

<?php

$pdo = new PDO(
    'mysql:host=localhost;dbname=course_db;charset=utf8mb4',

$dbUser,

$dbPassword,

[

PDO::ATTRERRMODE => PDO::ERRMODEEXCEPTION,

PDO::ATTRDEFAULTFETCHMODE => PDO::FETCHASSOC,

PDO::ATTREMULATEPREPARES => false,

]

);

字元集應使用utf8mb4,以完整支援 Unicode 字元。錯誤模式設為例外後,程式可以集中處理連線或查詢失敗,不必讓每個 SQL 操作各自判斷模糊的錯誤結果。

使用預備陳述式查詢資料

<?php

$sql = 'SELECT id, name, status

FROM courses

WHERE status = :status’;

$stmt = $pdo->prepare($sql);

$stmt->execute([‘status’ => ‘open’]);

$courses = $stmt->fetchAll();

預備陳述式會將 SQL 結構與輸入值分開,是降低 SQL 注入風險的基本措施。不要把$_GET$_POST直接串接到 SQL 字串中。排序欄位、資料表名稱等無法直接使用一般參數綁定的部分,應透過程式建立允許清單,而不是接受任意輸入。

新增、修改或刪除多筆彼此相關的資料時,應使用交易確保一致性。若其中一步失敗,就回復已執行的操作,避免產生只有部分資料成功的狀況。

函數與類別的程式設計方法

定義可重複使用的函數

函數可以將重複邏輯集中管理。函數名稱應表達行為,參數與回傳值最好宣告型別,並盡量避免在函數內任意修改全域變數。

<?php

declare(strict_types=1);

function calculateDiscount(int $price, float $rate): int

{

return (int) round($price * $rate);

}

一個函數最好只負責一項明確工作。查詢資料、轉換格式及輸出 HTML 若全部混在同一函數中,日後測試與修改會更加困難。

認識 Class、屬性與方法

類別可以封裝狀態與行為。例如Course類別可具有課程編號、名稱與狀態等屬性,並提供判斷是否可報名的方法。資料庫查詢則可交由 Repository 或其他資料存取類別負責,避免實體物件同時承擔過多責任。

現代 PHP 支援建構式屬性提升、唯讀屬性、列舉與屬性標記等功能。不過初學者應先理解封裝、依賴關係及單一責任,再決定是否採用進階語法,而不是為了使用物件導向而建立沒有實際價值的類別。

命名空間與 PHP 程式撰寫風格

使用 Namespaces 避免名稱衝突

命名空間可將類別依功能分組,避免不同套件出現同名類別。專案通常搭配 Composer 的自動載入機制,依照 PSR-4 規範安排目錄與類別名稱。

<?php

namespace App\Service;

final class CourseService

{

}

命名空間應反映專案結構,但不宜過度切割。類別與方法名稱要具備一致性,讓其他開發者可以從名稱理解用途。

自動檢查程式碼風格

PHP 社群常參考 PHP-FIG 發布的 PSR 規範。PSR-12 可作為程式碼風格基礎,專案也能依團隊需求建立額外規則。

PHP_CodeSniffer 可以檢查程式碼是否符合指定規範;PHP CS Fixer 可自動修正常見格式。正式修正前可先使用--dry-run模式查看差異,並在版本控制中檢查結果。格式工具負責一致性,靜態分析、單元測試與人工審查則負責找出其他程式問題,彼此不能完全取代。

PHP 網頁安全與效能原則

建立基本安全防線

資料庫查詢應使用預備陳述式,HTML 輸出要依輸出情境進行編碼,密碼應透過password_hash()建立雜湊,驗證時使用password_verify()。不要自行設計加密密碼的方法,也不要以明文或可逆加密方式儲存登入密碼。

登入後應適時重新產生 Session ID,Cookie 要依環境設定SecureHttpOnlySameSite。會改變資料的表單還應加入 CSRF 權杖。檔案上傳則必須限制大小、檢查實際類型、重新命名,並避免將可執行檔案直接放在公開目錄。

效能改善應以量測為基礎

PHP 網頁速度不只取決於 PHP 語法,也與資料庫索引、SQL 查詢次數、網路延遲、圖片、快取及伺服器設定有關。應先透過日誌與效能分析工具找出瓶頸,再決定是否加入資料快取、OPcache、分頁或佇列。

避免在迴圈內重複查詢資料庫,是常見且有效的改善方向。正式環境不應直接顯示完整錯誤訊息與堆疊資訊,而應記錄到受保護的日誌,對使用者僅顯示適當的錯誤頁面。

結論

PHP 程式設計的學習順序,可以從 PHP 介紹、執行環境、變數與運算式開始,再進入表單處理、日期時間、條件判斷、迴圈及陣列。具備語言基礎後,便可使用course_db練習 PDO 連線、SQL 查詢、預備陳述式及交易處理,逐步建立完整的網頁資料庫應用。

能夠執行的程式不一定是可安全維護的程式。實務開發還要重視輸入驗證、輸出編碼、密碼雜湊、版本支援、例外處理、程式風格及測試。透過官方 PHP 文件、PHP-FIG 規範與 OWASP 安全建議持續確認做法,才能讓 PHP 網站兼顧功能、安全與長期維護需求。

常見問題

1. PHP 適合完全沒有程式基礎的人嗎?

適合。建議先學習變數、資料型態、條件判斷、迴圈、陣列及函數,再進入表單與 MySQL。理解 HTTP 及 HTML 基本結構,也有助於掌握前後端資料如何傳遞。

2. 學 PHP 一定要先學 HTML 嗎?

不必先精通 HTML,但至少要理解表單、輸入欄位、連結及基本文件結構。PHP 負責後端處理,最後仍經常需要輸出 HTML 內容。

3. PHP 7.4 現在還適合建立新網站嗎?

不適合。PHP 7.4 已停止官方安全支援。舊教材可用於理解基礎概念,但新專案應使用官方仍支援的 PHP 版本,並檢查套件及主機相容性。

4. PHP 與 MySQL 有什麼關係?

PHP 是程式語言,MySQL 是關聯式資料庫管理系統。PHP 可透過 PDO 或 MySQLi 連線 MySQL,執行新增、查詢、修改與刪除資料等操作。

5. GET 與 POST 哪一個比較安全?

兩者都不能取代 HTTPS 與後端驗證。GET 適合搜尋與篩選,POST 適合送出可能改變資料的操作。敏感資訊不應放在網址中,但使用 POST 也不代表資料已自動加密。

6. 如何避免 PHP 發生 SQL 注入?

使用 PDO 或 MySQLi 預備陳述式,將 SQL 結構與使用者輸入分開處理。不要直接把表單或網址參數串接進 SQL 字串,動態欄位名稱則應採用允許清單。

7. PHP 陣列與物件應如何選擇?

簡單資料集合或查詢結果可使用陣列;若資料同時具有明確狀態、行為及驗證規則,使用物件通常更容易維護。選擇時應依實際複雜度判斷。

8. PHP 函數與類別有何不同?

函數用來封裝可重複執行的邏輯;類別則能整合屬性與方法,建立具有狀態及行為的物件。小型轉換適合函數,複雜領域邏輯通常適合類別。

9. PHP 網站需要使用框架嗎?

不是必要條件。小型練習可使用原生 PHP 理解請求、路由、Session 及資料庫流程。當專案規模增加時,成熟框架能提供路由、驗證、資料庫遷移、測試與安全工具,但仍需理解底層原理。

10. 如何提升 PHP 網頁的安全性?

應持續更新受支援版本,使用預備陳述式、輸出編碼、CSRF 防護、HTTPS 及安全 Cookie 設定;密碼使用password_hash()處理,並限制檔案上傳。正式環境還應關閉詳細錯誤顯示、保存安全日誌,並依 OWASP 建議定期檢查風險。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料