前言:連接是一切操作的起點
無論是 DBA 在命令行維護,還是 PHP 開發者編寫業務代碼,**建立連接、選擇庫、執行 SQL、關閉連接** 是不變的四步曲。本文系統整理 MySQL 二進制客戶端連接參數、PHP mysql_* 扩展 (舊版) 與 mysqli/PDO (現代) 的連接語法、常用函數對照表。
一、命令行客戶端連接
標準登入
mysql -u root -p
# Enter password: ******
常用參數
| 參數 | 說明 | 示例 |
-h | 主機 | -h 192.168.1.10 |
-P | 端口 | -P 3306 |
-u | 用戶 | -u admin |
-p | 密碼 (緊跟無空格或交互輸入) | -ppass / -p |
-D | 直接選擇庫 | -D testdb |
-e | 執行單條 SQL 後退出 | -e "SELECT VERSION();" |
--ssl-mode=REQUIRED | 強制 SSL | |
退出
exit
\q
Ctrl+D
二、PHP 連接 MySQL:三代 API 對比
| API | 狀態 | 連接函數 | 特點 |
mysql_* | ❌ PHP 7.0 移除 | mysql_connect() | 舊教程常見,新專案**禁用** |
mysqli | ✅ 推薦 | mysqli_connect() / new mysqli() | 面向過程/物件雙模式、支援預處理、多語句、事務 |
PDO_MySQL | ✅ 推薦 | new PDO('mysql:host=...;dbname=...', $user, $pass) | 資料庫抽象層、支援 12+ 驅動、預處理、異常處理 |
三、mysqli 連接完整示例 (物件風格)
$mysqli = new mysqli('localhost', 'guest', 'guest123', 'tutorials', 3306);
if ($mysqli->connect_errno) {
die("連接失敗: " . $mysqli->connect_error);
}
echo "連接成功";
// 執行查詢
$result = $mysqli->query("SELECT id, name FROM users WHERE status=1");
if ($result) {
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}, Name: {$row['name']}
";
}
$result->free();
}
// 預處理 (防注入、計劃複用)
$stmt = $mysqli->prepare("INSERT INTO logs (msg, created_at) VALUES (?, NOW())");
$stmt->bind_param("s", $message);
$message = "用戶登入";
$stmt->execute();
$stmt->close();
$mysqli->close();
四、PDO 連接完整示例
$dsn = 'mysql:host=localhost;dbname=tutorials;charset=utf8mb4';
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 真預處理
];
$pdo = new PDO($dsn, 'guest', 'guest123', $opt);
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE status=?");
$stmt->execute([1]);
while ($row = $stmt->fetch()) {
echo "ID: {$row['id']}, Name: {$row['name']}
";
}
五、常用 PHP MySQL 函數/方法對照表
| 功能 | mysqli (物件) | PDO | 舊 mysql_* (僅參考) |
| 連接 | new mysqli() | new PDO() | mysql_connect() |
| 查詢 | $mysqli->query() | $pdo->query() | mysql_query() |
| 預處理 | $mysqli->prepare() | $pdo->prepare() | 無 |
| 綁定參數 | $stmt->bind_param() | $stmt->bindValue() / execute([]) | 無 |
| 獲取關聯數組 | $result->fetch_assoc() | $stmt->fetch(PDO::FETCH_ASSOC) | mysql_fetch_assoc() |
| 獲取數字索引數組 | $result->fetch_row() | $stmt->fetch(PDO::FETCH_NUM) | mysql_fetch_row() |
| 釋放結果集 | $result->free() | $stmt->closeCursor() | mysql_free_result() |
| 關閉連接 | $mysqli->close() | $pdo = null | mysql_close() |
| 事務 | $mysqli->begin_transaction() / commit() / rollback() | $pdo->beginTransaction() / commit() / rollBack() | mysql_query("BEGIN") |
| 錯誤信息 | $mysqli->error | $pdo->errorInfo() | mysql_error() |
六、MySQL 常見數據類型速查 (建表時選型)
| 分類 | 類型 | 範圍/說明 |
| 數值 | TINYINT | -128~127 / 0~255 (UNSIGNED) |
SMALLINT | -32768~32767 |
MEDIUMINT | -8388608~8388607 |
INT | -2147483648~2147483647 |
BIGINT | -2^63~2^63-1 |
FLOAT | 單精度 |
DOUBLE | 雙精度 |
DECIMAL(M,D) | 精確定點數,金額必用 |
| 日期時間 | DATETIME | 1000-01-01 ~ 9999-12-31,無時區 |
TIMESTAMP | 1970-01-01 ~ 2038-01-19,UTC 存儲,會話時區轉換 |
DATE | 只存日期 |
TIME | 只存時間 |
YEAR | 1901~2155 |
| 字符串 | CHAR(N) | 定長,右側空格填充 |
VARCHAR(N) | 變長,建議優先用 |
TEXT | 長文本,65535 字符 |
BLOB | 二進制長數據 |
ENUM | 枚舉,單選 |
SET | 集合,多選 |
結語
**命令行用 mysql -u -p,PHP 新專案首選 mysqli 或 PDO (預處理+異常模式),舊 mysql_* 徹底淘汰**。掌握連接參數、預處理綁定、結果集遍歷、事務控制、錯誤處理五大核心,即可應對 99% 的 PHP+MySQL 開發場景。建議將對照表打印貼在工位,寫代碼時隨時查閱。