重要警示:mysql_* 函數自 PHP 5.5 棄用,PHP 7.0 移除。新專案**必須使用 PDO 或 MySQLi(支援預處理、物件導向、事務控制)**。本文僅為維護歷史代碼提供速查。
| 分類 | 函數 | 用途 | 現代替代 |
|---|---|---|---|
| 連接管理 | mysql_connect(host, user, pass) | 建立非持久連接 | new mysqli() / new PDO() |
mysql_pconnect(...) | 建立持久連接(進程級復用) | PDO: PDO::ATTR_PERSISTENT | |
mysql_close([link]) | 關閉連接 | $mysqli->close() / $pdo=null | |
| 資料庫選擇 | mysql_select_db(db_name, [link]) | 選擇預設資料庫 | $mysqli->select_db() / DSN 指定 |
| 查詢執行 | mysql_query(sql, [link]) | 發送 SQL(SELECT 回資源,DML 回 bool) | $mysqli->query() / $pdo->query() |
mysql_unbuffered_query(sql) | 非緩存查詢(大結果集串流) | MYSQLI_USE_RESULT / PDO 游標 | |
mysql_db_query(db, sql) | 指定庫執行(已棄用) | 切換 DB 或完整表名 | |
| 結果集處理 | mysql_fetch_array(result, type) | 取一列關聯/數值/雙重陣列 | $stmt->fetch(PDO::FETCH_ASSOC|NUM|BOTH) |
mysql_fetch_assoc(result) | 取關聯陣列 | FETCH_ASSOC | |
mysql_fetch_row(result) | 取數值索引陣列 | FETCH_NUM | |
mysql_num_rows(result) | SELECT 結果列數 | $stmt->rowCount() (僅緩存) | |
mysql_affected_rows([link]) | INSERT/UPDATE/DELETE 影響列數 | $mysqli->affected_rows / $stmt->rowCount() | |
| 錯誤與資訊 | mysql_error([link]) | 上一操作錯誤訊息 | $mysqli->error / $pdo->errorInfo() |
mysql_errno([link]) | 錯誤代碼 | $mysqli->errno | |
mysql_insert_id([link]) | 上次 INSERT 產生的 AUTO_INCREMENT 值 | $mysqli->insert_id / $pdo->lastInsertId() | |
| 資訊 | mysql_get_server_info() | MySQL 版本字串 | $mysqli->server_info |
$link = mysql_connect("localhost", "root", "") or die("連線失敗: ".mysql_error());
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT id, name FROM users WHERE status=1", $link);
while ($row = mysql_fetch_assoc($result)) {
echo "ID: {$row['id']}, Name: {$row['name']}
";
}
mysql_free_result($result);
mysql_close($link);
$dsn = "mysql:host=localhost;dbname=mydb;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, "root", "", $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']}
";
}
// 無需手動 close,腳本結束自動釋放
$mysqli = new mysqli("localhost", "root", "", "mydb");
if ($mysqli->connect_errno) die("連線失敗: ".$mysqli->connect_error);
$mysqli->set_charset("utf8mb4");
$stmt = $mysqli->prepare("SELECT id, name FROM users WHERE status = ?");
$stmt->bind_param("i", 1);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}, Name: {$row['name']}
";
}
$stmt->close();
$mysqli->close();
mysql_,列出所有呼叫點。? / :name),消除 SQL 注入風險。fetch_assoc / fetch_all)。mysql_free_result、mysql_close 等手動資源管理(RAII 自動處理)。wait_timeout、連接池大小,反而導致「Too many connections」。mysql_affected_rows。