PHP 是全球最多網站使用的伺服器端程式語言:WordPress、絕大多數電商套件與中小企業官網都跑在它上面,本站也是。它的語法簡單、改完存檔就能看結果,幾乎所有虛擬主機都內建支援,這三個特性讓它成為官網與內容型網站成本最低的選擇。這篇文章從 PHP 是什麼開始,整理基本語法、表單與 MySQL 互動的正確寫法、版本與現況,以及它適合與不適合的網站類型。本文屬於《網頁程式語言》系列,總覽見〈網頁程式設計是什麼〉。
一、PHP 是什麼?
PHP(PHP: Hypertext Preprocessor)是一種在伺服器端執行、專為網頁開發設計的直譯式程式語言,程式寫在 <?php ?> 標籤內,執行結果以 HTML 送給瀏覽器。它由 Rasmus Lerdorf 於 1995 年發布,名稱原意是 Personal Home Page,後來改為現在的遞迴縮寫。
它的市占是所有伺服器端語言中最高的:依 W3Techs 的持續統計,在已知伺服器端語言的網站中,PHP 佔比長期超過七成,WordPress 一家就撐起全球超過四成的網站。這不代表 PHP 技術上最先進,而是它在「容易部署、容易找人、容易找主機」三件事上長期沒有對手。
二、PHP 怎麼運作?
瀏覽器請求 .php 檔時,網頁伺服器把檔案交給 PHP 直譯器執行,直譯器把 <?php ?> 裡的程式跑完、和外面的 HTML 合併,再把純 HTML 回傳。訪客永遠看不到 PHP 原始碼。
- 不需要編譯:改完檔案重新整理就生效,這是初學者上手快的主因。
- 執行方式:現代主機多用 PHP-FPM(FastCGI Process Manager)常駐處理請求,效能遠勝早期每次請求都啟動一個程序的 CGI 模式;CGI 是什麼、為何被取代,見〈CGI 是什麼〉。
- 搭配環境:經典組合是 Linux、Apache 或 Nginx、MySQL 或 MariaDB 加 PHP,簡稱 LAMP 或 LEMP,幾乎所有虛擬主機都預裝好。
三、PHP 基本語法
PHP 的語法接近 C 與 JavaScript:大括號包區塊、每句以分號結尾、變數以 $ 開頭。以下範例存成 .php 放到主機就能執行。
1. Hello, World 與標籤
<?php
echo "Hello, World!";
?>
純程式檔(不含 HTML)習慣只寫開頭 <?php、省略結尾標籤,避免結尾標籤後面多出的空白或換行被送到瀏覽器,造成「headers already sent」錯誤。
2. 變數與字串
<?php
$name = "王小明";
$age = 25;
echo "姓名:" . $name . "<br>"; // 用 . 串接字串
echo "年齡:{$age}"; // 雙引號字串可直接放變數
PHP 是弱型別,變數不必宣告型別,但 PHP 7 以後可以在函數參數與回傳值標註型別,讓錯誤在開發階段就被抓到。
3. 條件判斷
<?php
$age = 18;
if ($age >= 18) {
echo "您已成年";
} elseif ($age >= 12) {
echo "您是青少年";
} else {
echo "您是兒童";
}
比較時建議用 ===(同時比較值與型別),== 會做寬鬆轉型,"0" == false 這類結果常讓初學者困惑。
4. 迴圈與陣列
<?php
for ($i = 1; $i <= 5; $i++) {
echo "這是第 {$i} 次迴圈<br>";
}
$colors = ["紅", "綠", "藍"];
foreach ($colors as $index => $color) {
echo "{$index}:{$color}<br>";
}
$user = ["name" => "王小明", "email" => "ming@example.com"]; // 關聯陣列
echo $user["email"];
PHP 的陣列同時扮演其他語言的清單與字典兩種角色,foreach 是走訪它們最常用的方式。
5. 函數
<?php
function sayHello(string $name): string
{
return "Hello, " . $name;
}
echo sayHello("Alice");
範例標註了參數型別 string 與回傳型別 : string,這是現代 PHP 的建議寫法,Laravel 等框架的程式碼都這樣寫。
四、表單處理:先驗證、再輸出
PHP 用 $_POST、$_GET 讀取表單資料,但任何來自使用者的資料都必須先驗證、輸出前再轉義。
<form method="post" action="">
姓名:<input type="text" name="name"><br>
<input type="submit" value="送出">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$name = trim($_POST["name"] ?? "");
if ($name === "") {
echo "請輸入姓名";
} elseif (mb_strlen($name) > 50) {
echo "姓名過長";
} else {
echo "您輸入的姓名是:" . htmlspecialchars($name, ENT_QUOTES, "UTF-8");
}
}
echo $_POST['name']:使用者若輸入一段 <script>,就會在頁面上被執行,這是跨站腳本(XSS)。htmlspecialchars() 把特殊字元轉成實體,是輸出使用者資料的最低標準。另外 $_SERVER['PHP_SELF'] 也不該直接放進 action,它可被網址注入內容;表單送回同一頁時 action="" 即可。
五、與 MySQL 互動:PDO 與預備語句
現代 PHP 連資料庫用 PDO 或 MySQLi,並一律使用預備語句(prepared statement)帶參數,不要把變數串進 SQL。
<?php
$dsn = "mysql:host=localhost;dbname=testdb;charset=utf8mb4";
try {
$pdo = new PDO($dsn, "dbuser", "dbpassword", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE status = :status");
$stmt->execute([":status" => 1]);
foreach ($stmt as $row) {
echo "ID:" . $row["id"] . ",名字:" . htmlspecialchars($row["name"]) . "<br>";
}
} catch (PDOException $e) {
error_log($e->getMessage());
echo "資料庫連線失敗,請稍後再試。";
}
- 為什麼用預備語句:參數與 SQL 分開送到資料庫,使用者輸入永遠不會被當成 SQL 執行,這是 OWASP 對 SQL 注入的首選防護。
- 為什麼 charset 要 utf8mb4:舊的 utf8 存不了表情符號與部分罕見漢字,會出現亂碼或寫入失敗。
- 錯誤訊息不要印給訪客:範例把詳細錯誤寫進伺服器日誌,畫面只顯示一句通用訊息,避免洩漏資料庫結構。
- 不要再用 mysql_ 系列函數:它們在 PHP 7 已被移除,很多舊教材與舊網站還在用,是搬到新主機時最常見的白畫面原因。
六、版本與現況:PHP 8 之後
PHP 目前以 8 系列為主線,每年 11 月發布一個新版,每個版本提供兩年功能更新加額外的安全性更新,過期版本就不再修補漏洞。
- PHP 5 與 7 全部過期:PHP 7.4 在 2022 年底結束支援,仍在跑 5.x 或 7.x 的網站沒有任何安全性修補,是主機商與 SEO 健檢時最常見的紅字。
- PHP 8 帶來什麼:JIT 編譯、更嚴格的型別、具名參數、列舉(8.1)、唯讀屬性;效能較 7.x 明顯提升,語法也更接近現代語言。
- 升級最常卡在哪:舊程式碼依賴已移除的函數、外掛未更新、對 null 與型別的寬鬆處理在 8 以後會拋錯。升級前先用本機環境跑一次錯誤日誌,比直接在主機切版本安全。
- 生態:Laravel 與 Symfony 是主流框架,Composer 管理套件,WordPress、WooCommerce、Drupal 等內容管理系統都是 PHP 寫的。
確切的各版本支援日期以 PHP 官方的 Supported Versions 頁面為準,本文參考來源附連結。
七、PHP 適合與不適合的網站
- 適合:企業官網、部落格與內容行銷網站、中小型電商、會員系統、需要後台的形象網站,尤其是預算有限、之後可能換維護廠商的專案。
- 不特別適合:大量即時雙向連線的應用(聊天、協作工具,Node.js 更順手)、以資料科學與機器學習為核心的系統(Python 生態更齊)、必須與 .NET 或 Java 既有系統深度整合的企業內部系統。
其他語言的定位與比較表,統一放在〈網頁程式設計是什麼〉;Python 在網頁開發的角色與和 PHP 的差別,見〈Python 是什麼〉。
八、本站以 PHP 建置的實務心得
本站(newscan.com.tw)從建站至今都以 PHP 搭配 MySQL 開發,包含文章系統、詢價表單與後台。多年維運下來,幾件事值得分享給正在選語言的網站主:
- 版本升級要排進年度工作:我們在網站健檢時把 PHP 版本列為必查項目,因為過期版本不只是效能問題,更是資安與主機商停止支援的問題。升級前在本機環境跑過一輪錯誤日誌,實際切換通常只需一個維護時段。
- 共用程式集中管理:連線設定、標頭輸出、共用函式放在少數幾個 include 檔,改一處全站生效;這也讓後來加上結構化資料、noindex 控制這類 SEO 調整能在一個檔案完成。
- PHP 對 SEO 沒有先天優劣:伺服器端輸出完整 HTML 反而利於索引;速度取決於快取、圖片與資料庫查詢,不取決於語言。網站速度的實作要點見〈網頁速度優化〉。
九、結論
PHP 是門檻最低、部署最容易、維護人選最多的伺服器端語言,代價是要自己養成驗證輸入、轉義輸出、用預備語句、按時升版的習慣。做到這四件事的 PHP 網站,安全性與效能都不輸其他語言。
學習順序建議:先把 HTML 與 JavaScript 基礎打好,再學 PHP 與 MySQL,最後進 Laravel 框架;每一步都能用最便宜的虛擬主機實際上線,這是 PHP 給初學者最大的優勢。
十、常見問答 FAQ
PHP 是什麼?
PHP 現在還值得學嗎?
PHP 和 JavaScript 有什麼不同?
PHP 網站安全嗎?
PHP 版本太舊該怎麼升級?
參考來源
- PHP Group,〈PHP 手冊〉,PHP 官方文件。
- PHP Group,〈Supported Versions〉,PHP 官方支援時程。
- PHP Group,〈PDO 預備語句與儲存程序〉,PHP 官方文件。
- W3Techs,〈Usage statistics and market share of PHP for websites〉,W3Techs 持續統計。
- OWASP,〈SQL Injection Prevention Cheat Sheet〉,OWASP Cheat Sheet Series。
- 新視野網頁設計,〈網頁程式設計是什麼?前端、後端、程式語言選擇與學習路線〉,本站自有內容。
PHP 各版本支援期限以官方 Supported Versions 頁面為準;第八節為本站自身網站的維運經驗,不涉及客戶資料。