首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP MySQLi 資料庫查詢完整教學:從連線到斷線的五大步驟

     編輯:PHP 相關知識

前言:資料庫操作的標準化流程

PHP 搭配 MySQL 是動態網站開發的經典組合。本文梳理使用 MySQLi 擴展進行資料庫查詢的五大標準步驟,涵蓋資料過濾、連線建立、查詢執行、結果獲取與資源釋放,並說明物件導向與程序式兩種風格的差異。

步驟一:檢查與過濾使用者輸入

所有外部輸入($_GET、$_POST、$_COOKIE)皆視為不可信,必須過濾。

常用過濾函數

函數用途
trim()移除首尾空白字元
addslashes()在特殊字元前加反斜線(單引號、雙引號、NULL)
stripslashes()移除 addslashes() 加入的反斜線
get_magic_quotes_gpc()檢查魔術引號是否開啟(PHP 5.4+ 已移除)
htmlspecialchars()將 HTML 特殊字元轉為實體(防 XSS)

最佳實踐: 使用 Prepared Statements(預處理語句)徹底防止 SQL 注入,而非依賴轉義函數。

步驟二:建立資料庫連線

MySQLi 提供兩種介面:

物件導向風格

@$db = new mysqli('hostname', 'username', 'password', 'dbname');
if ($db->connect_errno) {
    die("連線失敗: " . $db->connect_error);
}

程序式風格

@$db = mysqli_connect('hostname', 'username', 'password', 'dbname');
if (mysqli_connect_errno()) {
    die("連線失敗: " . mysqli_connect_error());
}

錯誤抑制符 @: 防止預設錯誤訊息洩露敏感資訊,建議搭配自訂錯誤處理。

選擇資料庫: $db->select_db('dbname') 或 mysqli_select_db($db, 'dbname')。

步驟三:執行查詢

$query = "SELECT * FROM user";
$result = $db->query($query);           // OO 風格,回傳 mysqli_result 物件
// 或
$result = mysqli_query($db, $query);    // 程序式,回傳資源
if (!$result) die("查詢失敗: " . $db->error);

步驟四:獲取查詢結果

取得筆數

$num_rows = $result->num_rows;        // OO
$num_rows = mysqli_num_rows($result);   // 程序式

逐行讀取(關聯陣列)

while ($row = $result->fetch_assoc()) {  // OO
    // $row['欄位名'] = 值
}
// 或
while ($row = mysqli_fetch_assoc($result)) { ... }

其他獲取方式

  • fetch_row():數值索引陣列
  • fetch_object():物件屬性對應欄位
  • fetch_array(MYSQLI_BOTH):同時包含關聯與數值索引

步驟五:釋放資源與關閉連線

$result->free();        // 釋放結果集記憶體
$db->close();             // 關閉連線
// 程序式對應:mysqli_free_result($result); mysqli_close($db);

注意: 腳本結束時會自動釋放,但長時間運行的腳本(如 CLI)建議顯式釋放。

完整範例(物件導向)

<?php
$db = new mysqli('localhost', 'user', 'pass', 'testdb');
if ($db->connect_errno) die("連線失敗");

$keyword = $db->real_escape_string($_GET['q'] ?? '');
$sql = "SELECT id, title FROM articles WHERE title LIKE '%{$keyword}%'";
$result = $db->query($sql);

if ($result) {
    while ($row = $result->fetch_assoc()) {
        echo "{$row['id']}: {$row['title']}<br>";
    }
    $result->free();
}
$db->close();
?>

總結與建議

  • 優先使用物件導向風格,程式碼更清晰、易維護。
  • 務必使用 Prepared Statements(prepare()/bind_param())防禦 SQL 注入。
  • 生產環境關閉 display_errors,啟用錯誤日誌。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved