PHP 官方已移除 `mysql_*` 函數 (PHP 7.0),現代開發應使用 `mysqli` (MySQL Improved) 或 `PDO` (PHP Data Objects)。
CREATE DATABASE test;
USE test;
CREATE TABLE user (name VARCHAR(50), age INT);
INSERT INTO user VALUES ('harry',20), ('tony',23), ('harry',24);
$conn = mysqli_connect('localhost', 'root', 'root', 'test');
mysqli_set_charset($conn, 'utf8');
$name = mysqli_real_escape_string($conn, 'harry');
$sql = "SELECT * FROM user WHERE name = '$name'";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
echo "Name: {$row['name']} Age: {$row['age']}\n";
}
mysqli_close($conn);
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT * FROM user WHERE name = ?");
$stmt->execute(['harry']);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "Name: {$row['name']} Age: {$row['age']}\n";
}
$pdo = null; // 關閉連線
| 特性 | mysqli | PDO |
|---|---|---|
| 資料庫支援 | 僅 MySQL | 12+ 驅動 (MySQL, PG, SQLite, Oracle...) |
| API 風格 | 面向過程 + 物件 | 純物件導向 |
| 預處理 | 支援 (`prepare`/`bind_param`) | 支援 (命名/問號佔位符) |
| 異常處理 | 需手動檢查返回值 | 可設 `ERRMODE_EXCEPTION` 自動拋出 |
| 事務 | `begin_transaction()`/`commit()` | `beginTransaction()`/`commit()` |
| 調試 | 較難打印完整 SQL | `debugDumpParams()` 顯示綁定參數 |