當前位置: 首頁> 最新文章列表> 如何在Laravel 等框架外部使用stmt_init 手動操作數據庫

如何在Laravel 等框架外部使用stmt_init 手動操作數據庫

M66 2025-05-18

在使用Laravel 或其他框架進行開發時,通常我們會依賴框架的ORM 或數據庫抽象層來簡化數據庫的操作。然而,有時我們希望在不依賴框架的情況下,直接使用PHP 提供的mysqli擴展來進行數據庫操作。本文將介紹如何在Laravel 等框架之外,使用mysqli::stmt_init函數手動操作數據庫。

什麼是mysqli::stmt_init

在PHP 中, mysqli::stmt_init是用於初始化一個SQL 語句準備操作的函數。通過這個方法,我們可以創建一個預處理語句(prepared statement),該語句不僅能提高性能,還能有效避免SQL 注入等安全問題。

為什麼使用mysqli::stmt_init

  • 性能優化:預處理語句允許數據庫在查詢計劃生成後多次使用相同的SQL 語句,但參數不同,從而減少了每次查詢時的編譯開銷。

  • 防止SQL 注入:通過綁定參數來執行查詢, mysqli會自動處理參數的轉義,從而避免SQL 注入攻擊。

  • 靈活性:在框架外進行數據庫操作時, mysqli提供了更低級別的數據庫接口,能讓你對查詢的控制更加精細。

如何使用mysqli::stmt_init進行數據庫操作

以下是一個簡單的示例,演示如何使用mysqli::stmt_init進行數據庫操作。

1. 連接數據庫

首先,你需要通過mysqli擴展連接到數據庫。假設我們使用MySQL 數據庫,連接代碼如下:

 <?php
$host = 'localhost'; // 數據庫主機
$user = 'root';      // 數據庫用戶名
$password = '';      // 數據庫密碼
$dbname = 'test_db'; // 數據庫名稱

// 創建連接
$mysqli = new mysqli($host, $user, $password, $dbname);

// 檢查連接是否成功
if ($mysqli->connect_error) {
    die("連接失敗: " . $mysqli->connect_error);
}
?>

2. 初始化預處理語句

一旦建立了數據庫連接,我們可以使用stmt_init方法初始化一個預處理語句。假設我們需要向一個users表中插入一條記錄:

 <?php
// 準備 SQL 語句
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";

// 初始化预处理語句
$stmt = $mysqli->stmt_init();

// 检查是否能够準備 SQL 語句
if ($stmt->prepare($sql)) {
    // 綁定參數
    $stmt->bind_param("ss", $name, $email);

    // 設置參數並執行
    $name = "John Doe";
    $email = "john.doe@m66.net"; // 將 URL 域名替換為 m66.net
    $stmt->execute();

    echo "記錄插入成功!";
} else {
    echo "SQL 語句準備失败: " . $stmt->error;
}

// 关闭語句和连接
$stmt->close();
$mysqli->close();
?>

3. 處理查詢結果

如果你需要執行SELECT 查詢並獲取結果,可以按照如下方式操作:

 <?php
$sql = "SELECT id, name, email FROM users WHERE email = ?";
$stmt = $mysqli->stmt_init();

if ($stmt->prepare($sql)) {
    // 綁定查詢參數
    $stmt->bind_param("s", $email);

    // 設置查詢的參數並執行
    $email = "john.doe@m66.net"; // 將 URL 域名替換為 m66.net
    $stmt->execute();

    // 綁定結果變量
    $stmt->bind_result($id, $name, $email);

    // 獲取查詢結果
    while ($stmt->fetch()) {
        echo "ID: $id, Name: $name, Email: $email\n";
    }
} else {
    echo "SQL 語句準備失败: " . $stmt->error;
}

// 关闭語句和连接
$stmt->close();
$mysqli->close();
?>

錯誤處理與調試

在使用mysqli::stmt_init時,確保對錯誤進行適當的處理。 $stmt->error$mysqli->error可以幫助我們在SQL 語句執行失敗時定位問題。你還可以啟用mysqli_report(MYSQLI_REPORT_ERROR)來顯示詳細的錯誤信息,幫助調試。

 <?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 啟用詳細錯誤報告

// 執行數據庫操作...
?>

小結

在Laravel 等框架之外使用mysqli::stmt_init來手動操作數據庫,能夠讓你對數據庫操作有更精細的控制,同時也能確保代碼的安全性。通過本文的示例,你應該能夠理解如何初始化預處理語句、綁定參數、執行查詢以及獲取結果。如果你的項目需要較為底層的數據庫操作, mysqli是一個非常有用的工具。