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 设置如下:
它有一个条目,其中:
- token = ABCdefg123adc ....... <-- 示例字符串,包含数字
和字母
- 过期 = 60
- created_at = 2019-12-01 08:57:26
- id = 1.
我试图通过以下方式访问 table:
$sql = "INSERT INTO instagram (token, expires) VALUES (?, ?)";
这与 SELECT
一样有效。
我还发现if (!mysqli_stmt_execute($stmt))
发送了两次条目,所以我把它去掉了。仍然,更新条目不起作用。
我也附和了 $tokenAccess
和 $tokenExpires
的值。正如预期的那样,结果包含 $tokenExpires
的 60
和 $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行。
如果我尝试更新我数据库中的一个条目,它不起作用,就像不更新一样。但是当我尝试 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 设置如下:
它有一个条目,其中:
- token = ABCdefg123adc ....... <-- 示例字符串,包含数字 和字母
- 过期 = 60
- created_at = 2019-12-01 08:57:26
- id = 1.
我试图通过以下方式访问 table:
$sql = "INSERT INTO instagram (token, expires) VALUES (?, ?)";
这与 SELECT
一样有效。
我还发现if (!mysqli_stmt_execute($stmt))
发送了两次条目,所以我把它去掉了。仍然,更新条目不起作用。
我也附和了 $tokenAccess
和 $tokenExpires
的值。正如预期的那样,结果包含 $tokenExpires
的 60
和 $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行。