如何向 PHP 中的 SQL UPDATE 函数添加错误处理?

How can I add error handling to my SQL UPDATE function in PHP?

问题概述

我有一个功能可以更新我的 SQL 数据库中的用户用户名。我正在尝试添加一些错误处理(例如 return true/false),但我不知道该怎么做。

当前函数

function updateUid($conn, $usersUid, $rowId) {
    $sql = "UPDATE users SET usersUid = ? WHERE usersId = ?";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        //error - bad SQL call
        exit();
    }
    mysqli_stmt_bind_param($stmt, "ss", $usersUid, $rowId);
    mysqli_stmt_execute($stmt);
    return true;
    mysqli_stmt_close($stmt);
}

如您所见,现在它只是 return 为真,不管天气是否正常。

我试过的

我尝试使用 mysqli_stmt_get_result($stmt),但我认为我没有正确使用它:

function updateUid($conn, $usersUid, $rowId) {
    $sql = "UPDATE users SET usersUid = ? WHERE usersId = ?";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        //error - bad SQL call
        exit();
    }
    mysqli_stmt_bind_param($stmt, "ss", $usersUid, $rowId);
    mysqli_stmt_execute($stmt);
    $resultData = mysqli_stmt_get_result($stmt);
    if ($row = mysqli_fetch_assoc($resultData)) {
        return $row;
    } else {
        $result = false;
        return $result;
    }
    mysqli_stmt_close($stmt);
}

据我所知,mysqli_stmt_get_result() return 什么都没有,这是有道理的,因为我不是在获取数据,而是在放置数据。

期望的结果

如前所述,我真的很希望能够 true/false return 了解该功能是否有效。在 PHP 中测试 SQL 注入结果的最佳方法是什么?

mysqli_stmt_affected_rows() 会告诉您更新了多少行。

<?php
function updateUid($conn, $usersUid, $rowId) {
    $sql = "UPDATE users SET usersUid = ? WHERE usersId = ?";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        //error - bad SQL call
        exit();
    }
    mysqli_stmt_bind_param($stmt, "ss", $usersUid, $rowId);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_affected_rows($stmt) > 0;
    mysqli_stmt_close($stmt);
    return $result;
}

请注意,这可能为 0,原因有二:

  1. 没有行匹配 $rowId
  2. 匹配行中的 usersUid 已经等于 $usersUid,所以没有任何变化。

请参阅 PHP, MySQL - can you distinguish between rows matched and rows affected? 了解如何更改连接到数据库的方式,以便此 returns 与 WHERE 条件匹配的行数而不是行数实际上已更新。