PHP MySQL 連線最基礎範例 (舊版 mysql_* 函數)
本文提供最精簡的 PHP 連接 MySQL 資料庫程式碼,使用已棄用的 mysql_* 函數族群。**僅供維護舊版 PHP (≤5.6) 專案參考,新專案請改用 mysqli 或 PDO。**
最精簡連線程式碼
完整版 (含選擇資料庫、設定編碼、錯誤處理)
";
// 4. 執行測試查詢
$result = mysql_query("SELECT VERSION() as version", $conn);
if ($result) {
$row = mysql_fetch_assoc($result);
echo "MySQL 版本: " . $row['version'] . "
";
mysql_free_result($result);
}
// 5. 關閉連線
mysql_close($conn);
echo "連線已關閉";
關鍵函數說明
| 函數 | 用途 | 備註 |
| mysql_connect() | 建立連線 | 回傳連線資源或 false |
| mysql_select_db() | 選擇預設資料庫 | 成功回傳 true |
| mysql_query() | 執行 SQL | SELECT 回傳資源,其他回傳 true/false |
| mysql_fetch_assoc() | 取得關聯陣列 | 逐行取得,無資料回傳 false |
| mysql_fetch_array() | 取得數字+關聯陣列 | 第二參數: MYSQL_ASSOC/MYSQL_NUM/MYSQL_BOTH |
| mysql_num_rows() | 取得結果筆數 | 僅適用 SELECT/SHOW/DESC/EXPLAIN |
| mysql_error() | 取得最後錯誤訊息 | 需在失敗操作後立即呼叫 |
| mysql_close() | 關閉連線 | 腳本結束會自動關閉,建議顯式呼叫 |
常見連線問題排查
- Q: Access denied for user 'root'@'localhost'
- A: 密碼錯誤、使用者不存在、或 root 禁止遠端登入。檢查 MySQL 使用者權限:
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
- Q: Can't connect to MySQL server on 'localhost'
- A: MySQL 服務未啟動、port 錯誤 (預設 3306)、防火牆阻擋、或 skip-networking 開啟。Windows:
net start mysql,Linux: systemctl start mysqld
- Q: 中文資料存入後變 ??? 或 亂碼
- A: 必須在連線後立即執行
SET NAMES utf8 (或 utf8mb4),且資料表/欄位 collation 為 utf8_general_ci 或 utf8mb4_unicode_ci,PHP 檔案儲存為 UTF-8 無 BOM。
⚠️ 重要警告:mysql_* 函數已移除
PHP 版本演進:
- PHP 5.5.0 (2013) - 標記為 Deprecated (棄用),產生 E_DEPRECATED 錯誤
- PHP 7.0.0 (2015) - 完全移除,呼叫會產生 Fatal Error
所有現代 PHP 專案 (PHP 7+) 都無法使用 mysql_* 函數。
現代替代方案對照
| 舊寫法 (mysql_*) | mysqli (程序式) | mysqli (物件導向) | PDO (推薦) |
| mysql_connect() | mysqli_connect() | new mysqli() | new PDO() |
| mysql_select_db() | mysqli_select_db() | $mysqli->select_db() | DSN 指定 dbname |
| mysql_query() | mysqli_query() | $mysqli->query() | $pdo->query()/prepare() |
| mysql_fetch_assoc() | mysqli_fetch_assoc() | $result->fetch_assoc() | $stmt->fetch(PDO::FETCH_ASSOC) |
| mysql_escape_string() | mysqli_real_escape_string() | $mysqli->real_escape_string() | Prepared Statements (不需跳脫) |
| mysql_error() | mysqli_error() | $mysqli->error | $pdo->errorInfo() / Exception |
| mysql_close() | mysqli_close() | $mysqli->close() | $pdo = null |
PDO 版最簡連線 (新專案標準寫法)
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
echo "PDO 連線成功!";
} catch (PDOException $e) {
die("連線失敗: " . $e->getMessage());
}
遷移檢查清單 (mysql_* → PDO)
- 將所有
mysql_connect() 改為 new PDO()
- 移除
mysql_select_db() (DSN 中指定)
- 將
mysql_query($sql) 改為 $pdo->query($sql) (查詢) 或 $pdo->exec($sql) (增刪改)
- 將參數化查詢改用
$pdo->prepare() + $stmt->execute([...])
- 移除所有
mysql_real_escape_string() (Prepared Statements 自動處理)
- 將
mysql_fetch_assoc() 改為 $stmt->fetch(PDO::FETCH_ASSOC)
- 將
mysql_error() 改為 try-catch 捕捉 PDOException
- 移除
mysql_close() (設為 null 或讓 GC 回收)