首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

PHP mysqli 連接 MySQL 入門實戰:面向對象 API 完成連接、查詢、字段獲取、插入與預處理防注入

     編輯:MySQL 綜合教學

PHP mysqli 連接 MySQL 入門實戰

PHP 官方推薦使用 mysqli (MySQL Improved) 或 PDO 替代已移除的 mysql_* 系列函數。本文以面向對象風格演示:連接配置、錯誤處理、查詢執行、字段元數據獲取、結果集迭代、預處理語句防 SQL 注入。

1. 連接配置與錯誤處理

<?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");

2. 執行查詢並獲取字段元數據

$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";
}

3. 迭代結果集 (三種風格任選一)

// 風格 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();

4. 統計信息

echo "記錄數: " . $result->num_rows . "\n";
echo "字段數: " . $result->field_count . "\n";

5. 預處理語句插入 (防 SQL 注入、效能複用) — 核心最佳實踐

$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();

6. 關閉連接

$mysqli->close();
?>

關鍵對比:mysqli vs PDO

特性mysqliPDO
資料庫支援僅 MySQL12+ 種 (MySQL, PostgreSQL, SQLite...)
API 風格面向對象 + 面向過程純面向對象
預處理支援 (bind_param)支援 (bindValue/bindParam)
異步查詢支援 (mysqli::poll)不支援
命名參數不支援 (僅 ?)支援 (:name)

避坑指南

  • 🔴 **永遠用預處理** 處理用戶輸入,**拼接 SQL 字串是注入溫床**。
  • 🔴 **連接字符集必設 utf8mb4**,否則中文/Emoji 亂碼。
  • 🔴 **錯誤模式建議異常拋出**:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 讓失敗自動拋出 Exception,配合 try-catch 統一處理。
  • 🔴 **大結果集用無緩衝查詢**:$mysqli->query($sql, MYSQLI_USE_RESULT) 避免記憶體爆炸。

結語: mysqli 面向對象 API 結構清晰、功能完整、**預處理防注入是鐵律**。新項目若需跨資料庫建議直接上 PDO,純 MySQL 則 mysqli 極致輕量高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved