核心步驟詳解
- 建立連接:
mysqli_connect() 或 new mysqli(),返回連接對象/標識符。
- 選擇數據庫:
mysqli_select_db() 或構造函數指定。
- 構造並執行 SQL:
mysqli_query() 執行 SELECT,返回結果集對象。
- 處理結果集:
mysqli_fetch_assoc() 逐行獲取關聯數組,配合循環遍歷。
- 釋放資源:
mysqli_free_result() 釋放內存,mysqli_close() 關閉連接。
現代 mysqli 面向對象完整示例
<?php
$host = 'localhost'; $user = 'root'; $pass = 'password'; $db = 'phpdev';
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) { die("連接失敗: " . $mysqli->connect_error); }
$mysqli->set_charset('utf8mb4');
$query = "SELECT id, country, animal, cname FROM symbols";
$result = $mysqli->query($query);
if ($result === false) {
die("查詢錯誤: " . $mysqli->error);
}
if ($result->num_rows > 0) {
echo "<table border='1' cellpadding='10'>";
echo "<tr><th>ID</th><th>國家</th><th>英文名</th><th>中文名</th></tr>";
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . htmlspecialchars($row['id']) . "</td>";
echo "<td>" . htmlspecialchars($row['country']) . "</td>";
echo "<td>" . htmlspecialchars($row['animal']) . "</td>";
echo "<td>" . htmlspecialchars($row['cname']) . "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "未找到記錄。";
}
$result->free();
$mysqli->close();
關鍵函數對照表
| 舊 mysql_* (已移除) | mysqli 面向對象 | mysqli 過程式 |
| mysql_connect() | $mysqli = new mysqli() | mysqli_connect() |
| mysql_select_db() | $mysqli->select_db() | mysqli_select_db() |
| mysql_query() | $mysqli->query() | mysqli_query() |
| mysql_fetch_assoc() | $result->fetch_assoc() | mysqli_fetch_assoc() |
| mysql_num_rows() | $result->num_rows | mysqli_num_rows() |
| mysql_free_result() | $result->free() | mysqli_free_result() |
| mysql_close() | $mysqli->close() | mysqli_close() |
| mysql_error() | $mysqli->error | mysqli_error() |
| mysql_insert_id() | $mysqli->insert_id | mysqli_insert_id() |
進階查詢技巧
- 預處理查詢: 涉及變量時必用
prepare() + bind_param() + execute() + get_result()。
- 分頁查詢:
LIMIT offset, count 配合 SQL_CALC_FOUND_ROWS 或單獨 COUNT(*) 獲取總數。
- 事務控制:
$mysqli->begin_transaction(), commit(), rollback()。
- 異步查詢:
mysqli::poll() 實現並發查詢(罕用)。
PDO 替代方案(推薦新項目)
<?php
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$stmt = $pdo->query("SELECT id, country, animal FROM symbols");
foreach ($stmt as $row) {
echo htmlspecialchars($row['country']) . "<br>";
}