在 ServBay 中使用 PHP MySQL 擴充套件 (mysqlnd, mysqli, PDO)
ServBay 作為一套強大的本機整合式 Web 開發環境,極大地簡化了 PHP 應用程式與資料庫之間的互動。它為所有支援的 PHP 版本預先安裝並預設啟用了關鍵的 MySQL 資料庫擴充套件,包括 mysqlnd
、mysqli
與 PDO_MySQL
。這代表您不需手動設定,即可直接在 PHP 專案中操作 MySQL 或 MariaDB 資料庫。
ServBay 可用的 PHP MySQL 擴充套件
ServBay 內建以下三種主流的 MySQL 擴充套件於其 PHP 執行環境內,確保高度相容性與優良效能:
- MySQL Native Driver (
mysqlnd
):PHP 的原生驅動程式,為mysqli
與PDO_MySQL
的底層庫,提供與 MySQL 或 MariaDB 伺服器通訊的核心能力,通常擁有更佳的效能與記憶體管理效益。 - MySQLi (
mysqli
):MySQL Improved Extension(增強版 MySQL 擴充套件),同時支援物件導向與程序式語法,專為連接 MySQL 與 MariaDB 資料庫設計,支援如預處理語句、交易、儲存過程、多重語句查詢等進階特性。 - PDO MySQL (
PDO_MySQL
):PHP Data Objects (PDO) 的 MySQL 驅動。PDO 提供一套統一的資料庫存取抽象層,讓開發者以一致 API 操作多種資料庫(如 MySQL、MariaDB、PostgreSQL、SQLite 等),大幅提升程式可攜性。
啟用狀態
在 ServBay 中,mysqlnd
、mysqli
與 PDO_MySQL
擴充套件於所有 PHP 版本皆預設啟用。您無需額外開啟或設定。ServBay 已幫您妥善處理 php.ini
相關設置,可直接於程式碼中使用這些擴充套件連線資料庫。
各類 PHP MySQL 擴充套件比較說明
認識這三種擴充套件的差異,有助於依專案需求挑選最合適方案:
MySQL Native Driver (
mysqlnd
)- 核心功用:
mysqlnd
以 C 語言撰寫,為 PHP 與 MySQL/MariaDB 進行溝通的基礎層。 - 主要特色:自 PHP 5.3 起成為
mysqli
與PDO_MySQL
的預設底層驅動,直接整合於 PHP,無需依賴外部 MySQL 函式庫(如libmysqlclient
)。 - 關鍵優勢:比舊的
libmysqlclient
效能更佳、記憶體運用更有效率,並支援如非同步查詢、強化的永久連線與豐富的擴充 API 等先進技術。您通常不會直接用到mysqlnd
API,而是透過mysqli
或PDO
間接享受其優勢。
- 核心功用:
MySQLi (
mysqli
)- 核心功用:MySQL Improved Extension 專為 MySQL (4.1.3 以上) 與 MariaDB 設計的 PHP 擴充套件。
- 主要特色:同時提供物件導向以及程序式 API。內建預處理語句(能有效阻擋 SQL 注入)、交易管理、呼叫儲存過程、多語句查詢等 MySQL/MariaDB 的進階功能。
- 關鍵優勢:功能齊全且針對 MySQL/MariaDB 做高度優化,效能出色,若專案只會用到 MySQL 或 MariaDB,且須發揮特有高階功能,選用
mysqli
是值得信賴的方案。
PDO MySQL (
PDO_MySQL
)- 核心功用:PHP Data Objects (PDO) 提供輕量、彈性的統一界面供操作多種資料庫,
PDO_MySQL
則是 PDO 針對 MySQL/MariaDB 的特定驅動。 - 主要特色:透過一致 API(如
PDO
類別、PDOStatement
物件)執行資料庫操作。強制採用預處理語句(以prepare()
與execute()
執行),是對抗 SQL 注入的最佳實踐,並支援交易控制。 - 關鍵優勢:高可攜性即 PDO 最大賣點。若您的應用程式未來可能移轉至 PostgreSQL、SQLite 或其他資料庫,採用 PDO 可使程式碼需修改之處極少。其物件導向接口簡潔安全,新專案強烈建議選用 PDO。
- 核心功用:PHP Data Objects (PDO) 提供輕量、彈性的統一界面供操作多種資料庫,
PHP 程式碼範例:連線與操作資料庫
下述範例說明如何利用 mysqli
與 PDO
擴充套件,在 PHP 中連接至 ServBay 所管理的資料庫(如 MariaDB 或 MySQL),並完成基本資料操作。
前置條件:
- 必須於 ServBay 中啟動 MySQL 或 MariaDB 服務。
- 假設已建立名為
servbay_db
的資料庫。 - 假設已建立用戶
servbay_user
,密碼為your_password
,並賦予其對servbay_db
的相應權限。 - 假設
servbay_db
資料庫中有一張表users
,欄位包含id
(INT, PK, AI),name
(VARCHAR),email
(VARCHAR),age
(INT)。
您可透過 ServBay 內建的 phpMyAdmin 或其他資料庫管理工具完成上述設定。
範例程式碼(mysqli
方法)
<?php
// --- mysqli 範例 ---
// 資料庫連線參數
$servername = "127.0.0.1"; // 或 'localhost'
$port = 3306; // ServBay 預設 MySQL/MariaDB 連接埠
$username = "servbay_user";
$password = "your_password"; // 請替換為您的實際密碼
$dbname = "servbay_db";
// 建立 mysqli 連線(物件導向)
$conn = new mysqli($servername, $username, $password, $dbname, $port);
// 檢查連線是否成功
if ($conn->connect_error) {
die("mysqli Connection failed: " . $conn->connect_error);
}
echo "mysqli Connected successfully<br>";
// 新增資料(使用預處理語句防止 SQL 注入)
$stmt = $conn->prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
$name = "ServBay Demo";
$email = "[email protected]";
$age = 5;
// "ssi" 代表 string, string, integer 型別
$stmt->bind_param("ssi", $name, $email, $age);
if ($stmt->execute()) {
echo "mysqli: New record created successfully<br>";
} else {
echo "mysqli Error: " . $stmt->error . "<br>";
}
$stmt->close();
// 查詢資料
$sql = "SELECT id, name, email, age FROM users WHERE name = 'ServBay Demo'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "mysqli Queried data:<br>";
// 輸出資料
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. " - Age: " . $row["age"]. "<br>";
}
} else {
echo "mysqli: 0 results found<br>";
}
// 關閉連線
$conn->close();
?>
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
範例程式碼(PDO
方法)
<?php
// --- PDO 範例 ---
// 資料庫連線參數
$host = '127.0.0.1'; // 或 'localhost'
$port = 3306; // ServBay 預設 MySQL/MariaDB 連接埠
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // 請替換為您的實際密碼
$charset = 'utf8mb4';
// 資料來源名稱 (DSN)
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=$charset";
// PDO 連線選項
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 異常處理(例外狀況)
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 預設取得關聯陣列
PDO::ATTR_EMULATE_PREPARES => false, // 使用原生預處理語句
];
try {
// 建立 PDO 連線實例
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO Connected successfully<br>";
// 新增資料(使用預處理語句)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Demo';
$email = '[email protected]';
$age = 10;
// 綁定參數並執行
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO: New record created successfully<br>";
// 查詢資料
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Demo']);
// 取得所有結果
$users = $stmt->fetchAll(); // 預設 FETCH_ASSOC
if ($users) {
echo "PDO Queried data:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO: 0 results found<br>";
}
} catch (\PDOException $e) {
// 捕捉並顯示連線或查詢錯誤
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// 通常 PDO 連線在腳本結束時會自動關閉,無需手動 close()
// $pdo = null; // 可明確設為 null 強制關閉連線
?>
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
61
62
63
64
65
66
放置程式碼說明: 請將上述任一程式碼另存為 .php
檔案(如 db_test_mysqli.php
或 db_test_pdo.php
),並放置於您的 ServBay 網站根目錄(如 /Applications/ServBay/www/myproject/
),接著使用瀏覽器造訪相對應的網址(如 http://myproject.servbay.demo/db_test_mysqli.php
)。請務必確認您的網站已於 ServBay 完成設定並正常運作。
常見問題解答 (FAQ)
Q: 我在 ServBay 需要手動安裝 PHP 的 MySQL 擴充套件嗎?
A: 不需要。ServBay 已經為所管理的所有 PHP 版本預裝並預設啟用了 mysqlnd
、mysqli
與 PDO_MySQL
三大關鍵 MySQL 資料庫擴充套件。您只需於 PHP 程式碼中直接使用,無需任何安裝或額外設定。
Q: 我該選擇 mysqli
還是 PDO
?
A:
- 優先推薦使用
PDO
:若您的應用程式有可能支援多種資料庫(不只 MySQL/MariaDB),或希望程式碼更現代、物件導向、可移植性佳,首選 PDO。PDO 強制預處理,非常有助於撰寫安全程式。 - 考慮使用
mysqli
:若您的專案僅限於 MySQL/MariaDB,且要發揮其專屬高階功能,mysqli
則為效能優異、功能齊全的選項,其同時支援物件導向與程序式語法。
對於新專案,一般建議採用 PDO。
Q: 如何取得 ServBay 資料庫(MySQL/MariaDB)的連線參數?
A:
- 主機名稱 (Host):通常為
127.0.0.1
或localhost
。 - 連接埠 (Port):ServBay MySQL 與 MariaDB 服務預設連接埠多為
3306
。您可於 ServBay 軟體包管理介面查詢實際埠號。 - 使用者名稱 / 密碼:請使用於 MySQL/MariaDB 中自建之資料庫帳號密碼。若是初次使用,可能需要新增一個專屬用戶,或短期內用 root(但不建議於正式專案中使用 root)。用戶與權限均可透過 ServBay 內建 phpMyAdmin 或其他資料庫工具管理。
- 資料庫名稱:請填您要連線之目標資料庫名稱。
Q4: 老專案使用舊式 mysql_*
函數,ServBay 還支援嗎?
A: 有的。為協助開發者維護與轉移老舊專案,ServBay 特別於PHP 5.6 環境中保留支援舊式 mysql_*
函數(如 mysql_connect
)。這些函數自 PHP 5.5 起標記為淘汰,並於 PHP 7.0 完全移除。利用 ServBay 的 PHP 5.6,您可直接運行仰賴這些函數的舊專案,無需再特意尋找更早期 PHP 版本。
但請強烈注意:
- 僅建議用於短期兼容或遺留系統維護。
- 新專案或要重構既有專案時,務必遷移採用現代且安全的
mysqli
或PDO
擴充套件。舊式mysql_*
不僅安全性低(極易遭 SQL 注入),且缺乏新式資料庫的重要功能。
結論
ServBay 提供所有 PHP 版本預裝且預設啟用的 mysqlnd
、mysqli
與 PDO_MySQL
擴充套件,以及 PHP 5.6 兼容舊式 mysql_*
函數,顯著簡化 PHP 開發者的資料庫架設流程。您無需煩惱擴充套件安裝或設定,可直接依專案需求選擇(推薦 PDO 或 mysqli)最合適的方式存取和管理 ServBay 環境內的 MySQL 或 MariaDB 資料庫。
這種即裝即用的便利特性,讓您能將心力專注在應用邏輯設計與功能開發,借力 ServBay 提供的穩定高效本機環境,加速您的 Web 服務建置、測試與維護作業。