【问题标题】:PHP update query in MySQL not updating but SELECT and INSERT works [duplicate]MySQL 中的 PHP 更新查询未更新,但 SELECT 和 INSERT 有效
【发布时间】:2020-06-15 14:12:20
【问题描述】:

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

更新查询:

$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 for $stmt 返回:

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) 
}

这可能是显而易见的,我错过了明显的。非常感谢指向正确方向的指针。

更新:

我的表设置如下:

它有一个条目,其中:

  • token = ABCdefg123adc........
  • 过期 = 60
  • created_at = 2019-12-01 08:57:26
  • id = 1。

我尝试通过以下方式访问表格:

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

这就像SELECT 一样有效。

我还发现if (!mysqli_stmt_execute($stmt)) 发送了两次条目,所以我把它拿出来了。不过,更新条目不起作用。

我还回应了$tokenAccess$tokenExpires 的值。结果包含60$tokenExpires$tokenAccess 的长期访问令牌,正如预期的那样。

【问题讨论】:

  • 有什么错误吗?如果没有错误,则表示更新有效..也许没有更新价值?
  • 尝试调试你的id 可能你的数据库表没有id 值的行
  • 你能添加你的表格描述吗?
  • er,你怎么知道它没有更新? var_dump 表示它正在更新。如果您正在更新具有与已经存在的相同值的表,MySQL 将检测到这一点并且不会执行它(因为这是浪费时间)。
  • MySQL 不会每次都检查你是否发送相同的值,它只会一次又一次地更新数据库,直到你要求 MySQL 检查值并在匹配时返回错误。这需要一个 select 语句,我没有看到它有问题。我在回答中评论了受影响的行,只需取消注释并回显以查看您的行是否受到影响! (它将显示更新了多少行)。您正在执行语句两次,我在回答中将其降为 1。

标签: php mysql mysqli sql-update


【解决方案1】:

几年前我在学习 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 行。

【讨论】:

  • 谢谢!它确实在更新,现在正在工作。 :) 我一定会研究你的代码并努力改进我的。还要感谢其他所有回复并为我提供帮助的人!
【解决方案2】:

你正在使用准备好的语句,所以你在 where 子句中的代码应该是这样的WHERE id = ?";

$id = '1'; 
$tokenAccess = $_POST['token']; 
$tokenExpires = $_POST['expires'];
//Make sure you are passing these values to php 
try {
    $conn = db();
    $sql = "UPDATE instagram SET token=?, expires=? WHERE id = ?";
    $stmt = mysqli_stmt_init($conn);

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

    mysqli_stmt_bind_param($stmt, "ssi", $tokenAccess, $tokenExpires, $id);
    //If $tokenExpires uses - OR / OR ETC.. you need to set it to varchar 
    // on error
    if (!mysqli_stmt_execute($stmt)) {
        throw new Exception($conn->error);
    }
    //you can return affected rows mysqli_stmt_affected_rows($stmt);
    var_dump($stmt);

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

请看这里:How to debug Php code?

这里是你可以使用的方法:https://www.php.net/manual/en/mysqli-stmt.affected-rows.php

【讨论】:

  • 我不明白这是怎么回事,尽管他使用的是准备好的语句,但支持将文字值放入查询中。 expires 也是一个整数,而不是字符串(应该使用 sii 而不是 ssi)。
  • MySQL 也接受整数作为字符串,MySQL 不在乎您发送的内容将接受为字符串,我在手机上无法给您链接,但您可以选择搜索 MySQL 是否接受整数作为字符串。我知道 OP 正在使用准备好的语句,但没有正确使用! where 子句是过程类型应该是绑定 id。 OP 正在执行两次查询。再次检查代码。我只是纠正了错误。
  • 还为 OP 添加了受影响的行选项以检查行是否受到影响。它在答案中被评论,OP只需要取消评论并回显结果。看看是否可以将整数作为字符串插入php.net/manual/en/…
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多