雖然 ext/mysql 已於 PHP 7.0 移除,但大量存量專案仍在使用。本文提供經典 mysql_* 函數的標準用法,並**強烈建議新專案改用 PDO 或 MySQLi**(支援預處理語句、物件導向、更安全)。
<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '123456');
define('DB_NAME', 'my_database');
define('DB_CHARSET', 'utf8mb4');
require 'config.php';
$conn = mysql_connect(DB_HOST, DB_USER, DB_PASS)
or die('資料庫連線失敗: ' . mysql_error());
mysql_query("SET NAMES " . DB_CHARSET); // 關鍵:防止中文亂碼
mysql_select_db(DB_NAME, $conn) or die('選擇資料庫失敗');
$sql = "SELECT id, title, content, created_at FROM news ORDER BY id DESC";
$result = mysql_query($sql, $conn);
if (!$result) {
die('查詢失敗: ' . mysql_error());
}
while ($row = mysql_fetch_assoc($result)) { // 關聯陣列,語意清晰
echo "<div class='news-item'>";
echo "<h3>" . htmlspecialchars($row['title']) . "</h3>";
echo "<div>" . $row['content'] . "</div>"; // 富文本內容直接輸出
echo "<span>" . date('Y-m-d H:i', strtotime($row['created_at'])) . "</span>";
echo "</div>";
}
mysql_free_result($result); // 釋放記憶體
$title = mysql_real_escape_string($_POST['title']);
$content = mysql_real_escape_string($_POST['content']); // 必須轉義防注入
$enabled = 1;
$date = date('Y-m-d');
$sql = "INSERT INTO messageboard (title, content, enabled, created_at)
VALUES ('$title', '$content', $enabled, '$date')";
if (mysql_query($sql, $conn)) {
$newId = mysql_insert_id($conn);
echo "新增成功,ID: $newId";
} else {
echo '新增失敗: ' . mysql_error();
}
mysql_close($conn);
mysql_real_escape_string(),或改用預處理語句 (PDO/MySQLi)display_errors,啟用錯誤日誌,避免洩露 SQL 結構mysql_free_result(),腳本結束前 mysql_close()$pdo = new PDO(
"mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET,
DB_USER, DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
// 查詢
$stmt = $pdo->query("SELECT * FROM news");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ... }
// 新增 (預處理)
$stmt = $pdo->prepare("INSERT INTO messageboard (title, content) VALUES (?, ?)");
$stmt->execute([$title, $content]);
$newId = $pdo->lastInsertId();
PDO 提供:預處理語句防注入、統一 API 支援多種資料庫、物件導向風格、更好的錯誤處理機制。
file_get_contents() 讀取 → explode("\r\n", $str) 分行 → 迴圈 INSERT 或組裝批次 INSERT ... VALUES (...), (...),注意轉義與交易控制。pconnect 建立持久連線,腳本結束不關閉,下次請求複用,減少連線開銷;但易導致連線數耗盡,現代高併發環境**不建議使用**。