PHP MySQL 中的更新查询未更新,但 SELECT 和 INSERT 有效

PHP update query in MySQL not updating but SELECT and INSERT works

如果我尝试更新我数据库中的一个条目,它不起作用,就像不更新一样。但是当我尝试 select 来自同一数据库的值时,效果很好。我不确定为什么会这样。

更新查询:

$id = 1;

try {
    $conn = db();
    $sql = "UPDATE instagram SET token=?, expires=? WHERE id=$id";
    $stmt = mysqli_stmt_init($conn);

    if (!mysqli_stmt_prepare($stmt, $sql)) {
        throw new Exception($conn->error);
    }

    mysqli_stmt_bind_param($stmt, "si", $tokenAccess, $tokenExpires);
    mysqli_stmt_execute($stmt);

    // on error
    if (!mysqli_stmt_execute($stmt)) {
        throw new Exception($conn->error);
    }

    var_dump($stmt);

    $stmt->close();
    $conn->close();
}
catch (Exception $e) {
    print_r($e);
}

var_dump 对于 $stmt returns:

object(mysqli_stmt)#4 (10) { 
        ["affected_rows"]=> int(1) 
        ["insert_id"]=> int(0) 
        ["num_rows"]=> int(0)
        ["param_count"]=> int(2) 
        ["field_count"]=> int(0) 
        ["errno"]=> int(0) 
        ["error"]=> string(0) "" 
        ["error_list"]=> array(0) { } 
        ["sqlstate"]=> string(5) "00000" 
        ["id"]=> int(1) 
}

它可能很明显,但我错过了明显的地方。非常感谢指向正确方向的指针。

更新:

我的 table 设置如下:

它有一个条目,其中:

我试图通过以下方式访问 table:

$sql = "INSERT INTO instagram (token, expires) VALUES (?, ?)";

这与 SELECT 一样有效。

我还发现if (!mysqli_stmt_execute($stmt))发送了两次条目,所以我把它去掉了。仍然,更新条目不起作用。

我也附和了 $tokenAccess$tokenExpires 的值。正如预期的那样,结果包含 $tokenExpires60$tokenAccess 的长期访问令牌。

我几年前学习mysqli的时候也遇到过类似的问题。我猜没有人告诉您可以为 mysqli 函数启用错误报告。您可以通过在打开连接之前添加此行来完成此操作:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

我看到您添加了很多不必要的代码。您不需要所有这些 if 语句,也不需要手动抛出异常。 PHP 可以为您做到。

您不需要关闭语句,也不需要关闭连接。 永远不要为了打印出错误消息而捕获异常!

使用 OOP 还可以使您的代码更清晰,更容易发现错误。

我看不到你的 db() 函数是什么样的,但它应该看起来像这样。看看这段代码是多么简单:

function db(): \mysqli {
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli('localhost', 'username', 'password', 'testdb');
    $mysqli->set_charset('utf8mb4'); // always set the charset
    return $mysqli;
}

$conn = db();

$id = 1;
$sql = "UPDATE instagram SET token=?, expires=? WHERE id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('sss', $tokenAccess, $tokenExpires, $id);
$stmt->execute();

关于您的实际问题:
可能根本没有问题。 affected_rows表示更新了1行。