php - 我可以放心地假设此 INSERT 成功吗?

标签 php mysql error-handling

我正在使用启用了严格模式的 MySQL。我正在通过 HTML 表单插入用户提供的数据。我已经完成了所有验证,这是最后一步。

以下是我的 PHP 代码的摘录:

$sql = 'SET sql_mode = TRADITIONAL'; //last chance data validation
$mysqli->query($sql) or output_error('Database Error: Failed to set SQL mode');

$db_err_msg = 'Database Error: Failed to update profile summary';
$sql = "INSERT INTO {$tables['text']} (lngProfileId, memProfileText) VALUES(?, ?)
    ON DUPLICATE KEY UPDATE memProfileText = VALUES(memProfileText)";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);
$stmt->bind_param('is', $profile_id, $_POST['memProfileText'])
    or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);
$stmt->close();

//if code reaches this point, can it assume insert/update succeeded?

注意: output_error 是我的 fatal error 的错误处理程序。它不会返回;它退出。

我需要检查警告吗?或者我可以安全地假设插入/更新成功吗?即使打开了严格模式,是否存在某些情况也可能导致警告而不是错误?

编辑:我只关心那些应该被视为致命错误的事情。如果它是更新而不是插入,那与我无关。这不是一个错误。

此外,last_insert_idaffected_rows 在这种情况下毫无意义。如果用户没有进行任何更改,affected_rows将为0,并且last_insert_id的值不会更新。

在这种情况下我对成功的定义:

  • 它插入了记录或更新了记录,或者如果没有进行任何更改则不执行任何操作
  • 它没有“默默地破坏我的数据”

许多新手程序员都会犯这样的错误:假设查询成功,而没有检查返回值或警告。他们的代码可以工作...在正常条件下。

我的问题是: “考虑到我的代码,在打开严格模式的情况下,以及我所做的错误检查,可以安全地假设查询成功吗?这是正确的吗?或者不正确的假设?我还应该检查警告还是多余的?”

最佳答案

您应该检查 mysqli::info() 的值功能。

如果插入数据,字符串将如下所示,

Records: 1 Duplicates: 0 Warnings: 0

另一个函数是mysqli::affected_rows 。它返回上次插入/更新/删除查询受影响的行数。

关于php - 我可以放心地假设此 INSERT 成功吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13866009/

相关文章:

MYSQL 从 2 个表中选择一个 id 只在其中一个表中

asp.net - 部署到 IIS 7.5 后出现空白自定义 404 页面

php - Laravel 5 Socialite Facebook 登录用户取消应用程序请求后回调处理错误

php - 在 php 中从 ascii 转换为十六进制

php - 检查实体是否在外表中被引用并获取实体

mysql - 计算 MySQL 中的运行总和,当字段 = 1 时递增,当同一字段 = 0 时递减 1

Android 数据库设计,使用 SQLite 或直接使用 mySQL 和 JSON

php 从 mysql 结果建立链接

php - 每次刷新页面时,PHP表单都会在数据库中添加空白行

php - 如何在laravel中使用特殊消息管理特殊错误