PHP 官方推薦使用 mysqli (MySQL Improved) 或 PDO 替代已移除的 mysql_* 系列函數。本文以面向對象風格演示:連接配置、錯誤處理、查詢執行、字段元數據獲取、結果集迭代、預處理語句防 SQL 注入。
<?php
$host = "localhost";
$user = "root";
$pass = "123456";
$db = "lyz";
$port = 3306;
$mysqli = new mysqli($host, $user, $pass, $db, $port);
// 連接錯誤檢查
if ($mysqli->connect_errno) {
die("連接失敗: " . $mysqli->connect_error);
}
echo "連接成功\n";
// 設置字符集 (關鍵,防亂碼)
$mysqli->set_charset("utf8mb4");
$result = $mysqli->query("SELECT * FROM `test`");
if ($result) {
// 字段數
$fieldCount = $result->field_count;
echo "字段數: $fieldCount\n";
// 字段詳細信息 (name, type, length, flags...)
$fields = $result->fetch_fields();
echo "表名: " . $fields[0]->table . "\n";
foreach ($fields as $field) {
echo $field->name . "\t"; // 字段名
}
echo "\n";
}
// 風格 A: 面向對象 fetch_assoc (關聯數組,推薦)
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}, Name: {$row['name']}\n";
}
// 風格 B: 面向對象 fetch_row (索引數組)
while ($row = $result->fetch_row()) {
echo $row[0] . "\t" . $row[1] . "\n";
}
// 風格 C: 面向過程 mysqli_fetch_assoc($result)
// 釋放結果集
$result->free();
echo "記錄數: " . $result->num_rows . "\n";
echo "字段數: " . $result->field_count . "\n";
$sql = "INSERT INTO `test` (`b`, `a`) VALUES (?, ?)"; // 佔位符
$stmt = $mysqli->prepare($sql);
$b_val = 2;
$a_val = 'a';
// 綁定參數: 'i'=integer, 's'=string, 'd'=double, 'b'=blob
$stmt->bind_param("is", $b_val, $a_val);
if ($stmt->execute()) {
echo "插入成功,自增 ID: " . $stmt->insert_id . "\n";
} else {
echo "插入失敗: " . $stmt->error . "\n";
}
$stmt->close();
$mysqli->close();
?>
| 特性 | mysqli | PDO |
|---|---|---|
| 資料庫支援 | 僅 MySQL | 12+ 種 (MySQL, PostgreSQL, SQLite...) |
| API 風格 | 面向對象 + 面向過程 | 純面向對象 |
| 預處理 | 支援 (bind_param) | 支援 (bindValue/bindParam) |
| 異步查詢 | 支援 (mysqli::poll) | 不支援 |
| 命名參數 | 不支援 (僅 ?) | 支援 (:name) |
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 讓失敗自動拋出 Exception,配合 try-catch 統一處理。$mysqli->query($sql, MYSQLI_USE_RESULT) 避免記憶體爆炸。結語: mysqli 面向對象 API 結構清晰、功能完整、**預處理防注入是鐵律**。新項目若需跨資料庫建議直接上 PDO,純 MySQL 則 mysqli 極致輕量高效。