PHP 5.5 棄用,7.0 移除。新項目嚴禁使用。僅作維護老代碼參考:
$link = mysql_connect('localhost', 'root', 'password') or die(mysql_error());
mysql_select_db('dbname', $link);
$result = mysql_query('SELECT * FROM users', $link);
while ($row = mysql_fetch_assoc($result)) { /* ... */ }
mysql_close($link);
$mysqli = new mysqli('localhost', 'root', 'password', 'dbname', 3306);
if ($mysqli->connect_errno) {
die("Connect failed: {$mysqli->connect_error}");
}
$mysqli->set_charset('utf8mb4'); // 關鍵:設置字符集
// 預處理語句(防注入、性能優)
$stmt = $mysqli->prepare('SELECT id, name FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { /* ... */ }
$stmt->close();
$mysqli->close();
$link = mysqli_connect('localhost', 'root', 'password', 'dbname', 3306);
mysqli_set_charset($link, 'utf8mb4');
$result = mysqli_query($link, 'SELECT * FROM users');
while ($row = mysqli_fetch_assoc($result)) { /* ... */ }
mysqli_close($link);
$dsn = 'mysql:host=localhost;dbname=dbname;charset=utf8mb4';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 真實預處理
];
try {
$pdo = new PDO($dsn, 'root', 'password', $options);
$stmt = $pdo->prepare('SELECT id, name FROM users WHERE email = ?');
$stmt->execute([$email]);
while ($row = $stmt->fetch()) { /* ... */ }
} catch (PDOException $e) {
error_log("DB Error: {$e->getMessage()}");
}
| 維度 | mysql (舊) | mysqli | PDO |
|---|---|---|---|
| 狀態 | ❌ 移除 | ✅ 維護中 | ✅ 推薦 |
| 預處理 | 無 | 支援 | 支援(統一 API) |
| 多數據庫 | 否 | 否 | 是 |
| 異常處理 | 無 | 可選 | 原生異常 |
| 事務 | 手動 SQL | API | API + 嵌套事務 |
| 性能 | 基準 | 略優 | 相當 |
utf8mb4(連接、庫、表、列),杜絕亂碼mysqli::persistent / PDO ATTR_PERSISTENT,配合 max_connections 評估error_log,不暴露用戶sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONPHP 操作 MySQL 現代棧:PDO 為首選,mysqli 為備選,mysql 絕對禁用。核心鐵律:utf8mb4 全鏈路、預處理防注入、異常捕獲記錄、連接池複用。新項目直接上 PDO + 嚴格模式,老項目逐步遷移,徹底告別 mysql_* 時代。