PHP MySQL 常用擴展函數速查:連接、執行、結果集處理、事務、預處理
聚焦 PHP mysql_* 扩展(歷史版本)與現代 mysqli/PDO 的核心 API 對照,涵蓋連接建立、SQL 執行分類、結果集四種遍歷方式、結果集輔助函數、預處理語句、事務控制,適合維護舊項目與新項目技術選型對比。
一、連接與基礎操作 (mysql_* vs mysqli vs PDO)
| 操作 | mysql_* (棄用) | mysqli (OO) | PDO |
| 連接 | mysql_connect() | new mysqli() | new PDO() |
| 選庫 | mysql_select_db() | $mysqli->select_db() | DSN 中指定 |
| 字符集 | mysql_query('SET NAMES utf8') | $mysqli->set_charset('utf8mb4') | DSN charset=utf8mb4 |
| 執行 SQL | mysql_query() | $mysqli->query() / prepare() | $pdo->query() / prepare() |
| 影響行數 | mysql_affected_rows() | $mysqli->affected_rows | $stmt->rowCount() |
| 插入 ID | mysql_insert_id() | $mysqli->insert_id | $pdo->lastInsertId() |
| 錯誤碼/信息 | mysql_errno()/error() | $mysqli->errno/error | $stmt->errorCode()/errorInfo() |
| 關閉 | mysql_close() | $mysqli->close() | $pdo = null |
二、結果集遍歷四種風格 (mysqli 為例)
$result = $mysqli->query('SELECT id,name,email FROM user');
// 1. 關聯數組 (推薦)
while($row = $result->fetch_assoc()) { echo $row['name']; }
// 2. 索引數組
while($row = $result->fetch_row()) { echo $row[1]; }
// 3. 雙模式
while($row = $result->fetch_array(MYSQLI_ASSOC)) { ... }
// 4. 對象
while($obj = $result->fetch_object()) { echo $obj->name; }
三、結果集輔助函數
| 函數 | 說明 |
num_rows | 結果集行數 |
num_fields | 列數 |
fetch_field_direct() | 獲取列元數據 (名、類型、長度) |
data_seek(offset) | 移動內部指針到指定行 |
fetch_lengths() | 每列值長度數組 |
free() | 釋放結果集內存 |
四、預處理語句 (Prepared Statements) — 防注入核心
// mysqli
$stmt = $mysqli->prepare('INSERT INTO user(name,email) VALUES(?,?)');
$stmt->bind_param('ss', $name, $email);
$stmt->execute();
// PDO
$stmt = $pdo->prepare('INSERT INTO user(name,email) VALUES(:name,:email)');
$stmt->execute([':name'=>$name, ':email'=>$email]);
五、事務控制
// mysqli
$mysqli->begin_transaction();
try {
$mysqli->query('INSERT ...');
$mysqli->query('UPDATE ...');
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
}
// PDO
$pdo->beginTransaction();
try {
$pdo->exec('INSERT ...');
$pdo->exec('UPDATE ...');
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
}
六、啟用擴展檢查清單
php.ini 中啟用:extension=mysqli、extension=pdo_mysql (去掉分號)
extension_dir = "ext" 指向正確目錄
- 重啟 Web 服務 (Apache/Nginx+PHP-FPM)
- 驗證:
php -m | grep -E 'mysqli|pdo_mysql' 或 phpinfo()
七、phpMyAdmin 提示「未啟用 MySQL 擴展」解決