當前位置: 首頁> 最新文章列表> stmt_init 如何與num_rows 或affected_rows 配合獲取結果影響

stmt_init 如何與num_rows 或affected_rows 配合獲取結果影響

M66 2025-05-29

在使用PHP 的MySQLi 擴展進行數據庫操作時, mysqli::stmt_init()是一個重要的方法,它用於初始化一個語句對象( mysqli_stmt ),進而可以準備執行SQL 語句。為了確定查詢語句是否有結果返回,或者有多少行受到影響,可以結合使用num_rows (針對SELECT語句)或affected_rows (針對INSERTUPDATEDELETE )。

本文將通過示例說明如何使用mysqli::stmt_init()並結合num_rowsaffected_rows來獲取查詢結果的影響。

一、準備工作:數據庫連接

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");

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

二、使用stmt_init初始化語句並準備查詢

$stmt = $mysqli->stmt_init();

$sql = "SELECT id, name FROM users WHERE status = ?";
if ($stmt->prepare($sql)) {
    $status = 'active';
    $stmt->bind_param("s", $status);
    $stmt->execute();

    $stmt->store_result(); // 這一步是必須的,否則 num_rows 將總是返回 0
    echo "返回的行數:" . $stmt->num_rows . "<br>";

    if ($stmt->num_rows > 0) {
        $stmt->bind_result($id, $name);
        while ($stmt->fetch()) {
            echo "用戶ID: $id, 姓名: $name<br>";
        }
    } else {
        echo "沒有符合條件的記錄。";
    }

    $stmt->close();
} else {
    echo "預處理失敗:" . $stmt->error;
}

三、使用affected_rows獲取更新、插入或刪除影響的行數

$stmt = $mysqli->stmt_init();

$sql = "UPDATE users SET status = ? WHERE last_login < ?";
if ($stmt->prepare($sql)) {
    $new_status = 'inactive';
    $cutoff_date = '2024-01-01';
    $stmt->bind_param("ss", $new_status, $cutoff_date);
    $stmt->execute();

    echo "受影響的行數:" . $stmt->affected_rows;

    $stmt->close();
} else {
    echo "預處理失敗:" . $stmt->error;
}

四、注意事項

  1. 使用num_rows時,必須調用store_result()否則它將始終返回0。

  2. affected_rows可以直接讀取,不需要調用store_result()

  3. 在使用完語句對像後,請記得調用$stmt->close()釋放資源。

  4. 如需調試或查看錯誤信息,可使用$stmt->error$mysqli->error

五、結語

通過合理使用mysqli::stmt_init()並結合num_rowsaffected_rows ,我們可以更加高效地管理數據庫查詢的反饋與結果處理。這對於開發穩定且性能優良的PHP 應用程序非常關鍵。