首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 連線方式全解析:命令列二進制客戶端、PHP mysqli/PDO 程式化連線與連線池最佳實踐

     編輯:MySQL 資料庫相關知識

MySQL 連線是應用與資料庫交互的橋樑。本文系統對比 命令列二進制客戶端、PHP mysqli (程序/物件導向)、PHP PDO 三大連線範式,解析參數詳情、錯誤處理、連線池整合與安全最佳實踐,助您選對連線方式、寫出健壯代碼。

一、命令列二進制客戶端:mysql

官方提供的互動式/批次式客戶端,適用於管理運維、腳本自動化、快速驗證。

標準連線語法

mysql -u root -p -h 127.0.0.1 -P 3306
# -u 用戶名
# -p 密碼(不帶值互動輸入,帶值無空格 -pPass123)
# -h 主機 (127.0.0.1 強制 TCP,localhost 走 Socket)
# -P 連接埠 (大寫 P)
# --protocol=TCP|SOCKET|PIPE|MEMORY 強制協議

進階用法

# 執行單條 SQL 退出 (自動化腳本)
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';"

# 批次模式輸出 TSV (程式處理友善)
mysql -u root -p -B -e "SELECT * FROM users" > users.tsv

# 垂直顯示 (寬表閱讀)
mysql -u root -p -E -e "SHOW ENGINE INNODB STATUS\G"

# 指定字符集
mysql -u root -p --default-character-set=utf8mb4

# 讀取 SQL 檔執行
mysql -u root -p db_name < schema.sql

退出方式

mysql> exit;
mysql> quit;
mysql> \q

二、PHP 連線:棄用 mysql_*,擁抱 mysqli 與 PDO

⚠️ 關鍵警告: mysql_connect()、mysql_query() 等 mysql_* 函數 PHP 5.5 棄用、PHP 7.0 移除。存量專案必須遷移至 mysqli 或 PDO。

mysqli 物件導向 (推薦)

<?php
$host = '127.0.0.1';
$port = 3306;
$user = 'app_user';
$pass = 'StrongP@ssw0rd';
$db   = 'app_db';
$charset = 'utf8mb4';

$mysqli = new mysqli($host, $user, $pass, $db, $port);
if ($mysqli->connect_errno) {
    throw new Exception("連線失敗: " . $mysqli->connect_error);
}
$mysqli->set_charset($charset);
// 關鍵:關閉自動提交,手動控制交易
$mysqli->autocommit(false);

try {
    $mysqli->begin_transaction();
    // 業務 SQL...
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
    throw $e;
} finally {
    $mysqli->close();
}
?>

mysqli 預處理語句 (防 SQL 注入)

$stmt = $mysqli->prepare("SELECT id, name, email FROM users WHERE status = ? AND created_at > ?");
$stmt->bind_param("is", $status, $date);  // i=integer, s=string, d=double, b=blob
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // 處理行...
}
$stmt->close();

PDO (跨資料庫抽象層,推薦新專案)

<?php
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=app_db;charset=utf8mb4";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,  // 使用真實預處理
    PDO::MYSQL_ATTR_SSL_CA       => '/path/ca.pem',  // SSL 憑證 (生產必備)
];

try {
    $pdo = new PDO($dsn, 'app_user', 'StrongP@ssw0rd', $options);
    // 業務操作...
} catch (PDOException $e) {
    error_log("DB 連線失敗: " . $e->getMessage());
    throw new Exception("資料庫服務暫時不可用");
}

PDO 預處理與交易

$stmt = $pdo->prepare("INSERT INTO orders (user_id, amount, currency) VALUES (?, ?, ?)");
$stmt->execute([$userId, $amount, 'TWD']);

$pdo->beginTransaction();
try {
    $pdo->exec("UPDATE accounts SET balance = balance - $amount WHERE user_id = $userId");
    $pdo->exec("INSERT INTO transactions ... VALUES (...)");
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

三、連線參數對照表

參數mysqliPDO DSN說明
主機$hosthost=IP 或主機名
埠$portport=預設 3306
用戶$user用戶名參數
密碼$pass密碼參數
資料庫$db (建構子) / select_db()dbname=預設資料庫
字符集set_charset()charset=utf8mb4
SSLssl_set()MYSQL_ATTR_SSL_*生產必啟用
壓縮CLIENT_COMPRESSMYSQL_ATTR_COMPRESS跨網段大數據傳輸
超時options(MYSQLI_OPT_CONNECT_TIMEOUT)MYSQL_ATTR_INIT_COMMAND連線/讀寫超時控制

四、連線池整合:PHP-FPM + 持久連線

// mysqli 持久連線 (啟用 p: 前綴)
$mysqli = new mysqli('p:127.0.0.1', 'user', 'pass', 'db', 3306);

// PDO 持久連線
$pdo = new PDO($dsn, 'user', 'pass', [
    PDO::ATTR_PERSISTENT => true,
    // ...其他選項
]);

// php-fpm.conf 關鍵設定
; pm.max_children = 100
; pm.start_servers = 20
; pm.min_spare_servers = 10
; pm.max_spare_servers = 30
; 請確保 max_children × 連線數 ≤ MySQL max_connections

持久連線風險與對策

  • 風險: 連線洩漏、事務殘留、鎖持久、max_connections 耗盡
  • 對策:
    • 註冊 fastcgi_finish_request 或 register_shutdown_function 強制清理
    • 應用層連線池 (如 Doctrine DBAL, Laravel Database) 替代原生持久連線
    • MySQL 端 wait_timeout=300、interactive_timeout=300 定期回收

五、安全最佳實踐清單

  1. 最小權限帳號: 應用布號僅授 SELECT, INSERT, UPDATE, DELETE,無 DDL、無 GRANT、無 FILE
  2. SSL 強制: REQUIRE SSL,verify_server_cert=ON
  3. 密碼輪換: 90 天輪換,納入 Vault/Secrets Manager
  4. 連線錯誤不外洩: 生產環境捕獲異常轉為通用訊息,避免洩露結構資訊
  5. 審計日誌: 記錄連線建立/斷開、執行 SQL (慢查詢)、錯誤堆疊
💡 選型建議: 新專案 首選 PDO (抽象層、真實預處理、異常模型、跨資料庫遷移易);維護舊專案用 mysqli 物件導向;運維腳本用 mysql 命令列。三者分工明確,各司其職。

連線方式雖非業務核心,卻是穩定性、安全性、可維護性的基石。選對工具、用對模式、守住底線,讓資料庫連線成為最可靠的隱形基礎設施。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved