完整示例代碼
共有 $numRows 位女性用戶";
// 6. 遍歷結果集
echo "";
echo "| ID | 域名 | 性別 | 註冊時間 |
";
while ($row = mysql_fetch_row($result)) {
echo "";
foreach ($row as $field) {
// stripslashes 處理魔術引號(舊版本需要)
echo "| " . htmlspecialchars(stripslashes($field)) . " | ";
}
echo "
";
}
echo "
";
// 7. 釋放結果集
mysql_free_result($result);
// 8. 關閉連接
mysql_close($link);
?>
核心函數詳解
| 函數 | 用途 | 返回值 |
| mysql_connect() | 建立數據庫連接 | 連接資源 / false |
| mysql_select_db() | 選擇默認數據庫 | bool |
| mysql_query() | 執行 SQL 語句 | 結果資源 / bool / false |
| mysql_num_rows() | 獲取 SELECT 結果行數 | int |
| mysql_fetch_row() | 獲取一行數值索引數組 | array / false |
| mysql_fetch_array() | 獲取一行關聯+數值數組 | array / false |
| mysql_fetch_assoc() | 獲取一行關聯數組 | array / false |
| mysql_fetch_object() | 獲取一行對象 | object / false |
| mysql_free_result() | 釋放結果集內存 | bool |
| mysql_close() | 關閉數據庫連接 | bool |
四種遍歷方式對比
, 'username'=>]
while ($row = mysql_fetch_assoc($result)) {
echo "ID: {$row['id']}, User: {$row['username']}";
}
// 3. mysql_fetch_array() - 兩者兼有(默認 MYSQL_BOTH)
while ($row = mysql_fetch_array($result)) {
// 同時可以用 $row[0] 和 $row['id']
// 內存佔用較大
}
// 4. mysql_fetch_object() - 對象屬性訪問
while ($row = mysql_fetch_object($result)) {
echo "ID: $row->id, User: $row->username";
// 字段名區分大小寫
}
常見錯誤與修正
| 錯誤代碼 | 問題 | 修正 |
| mysql_query() 後直接用 $row | 未遍歷結果集 | 必須用 while 循環 fetch |
| mysql_num_rows() 用在 INSERT/UPDATE | 僅適用 SELECT | 用 mysql_affected_rows() |
| 忘記 mysql_free_result() | 大結果集內存洩漏 | 用完及時釋放 |
| 直接輸出數據庫字段 | XSS 風險 | htmlspecialchars() 轉義 |
| SQL 拼接變量未轉義 | SQL 注入 | mysql_real_escape_string() |
現代化重寫:PDO 版本
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
try {
$stmt = $pdo->query("SELECT * FROM domains WHERE sex = 'F'");
$rows = $stmt->fetchAll();
echo "共有 " . count($rows) . " 位女性用戶
";
echo "| ID | 域名 | 性別 | 註冊時間 |
";
foreach ($rows as $row) {
echo "";
foreach ($row as $field) {
echo "| " . htmlspecialchars($field) . " | ";
}
echo "
";
}
echo "
";
} catch (PDOException $e) {
error_log("Database error: " . $e->getMessage());
die("查詢失敗,請稍後重試");
}
mysqli 版本(面向過程風格,易遷移)
connect_errno) {
die("連接失敗: " . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
$sql = "SELECT * FROM domains WHERE sex = 'F'";
$result = $mysqli->query($sql);
if ($result) {
echo "共有 $result->num_rows 位女性用戶
";
echo "| ID | 域名 | 性別 | 註冊時間 |
";
while ($row = $result->fetch_assoc()) {
echo "";
foreach ($row as $field) {
echo "| " . htmlspecialchars($field) . " | ";
}
echo "
";
}
echo "
";
$result->free();
}
$mysqli->close();
遷移建議
- 新項目:直接使用 PDO(面向對象、支持多數據庫、預處理)
- 舊項目維護:逐步替換 mysql_* 為 mysqli_*(函數名幾乎對應)
- 統一封裝:編寫 Database 類隱藏底層差異
- 測試覆蓋:遷移前編寫集成測試確保功能一致