【问题标题】:How to manage Mysql constraint fail errors?如何管理 Mysql 约束失败错误?
【发布时间】:2021-04-21 12:32:50
【问题描述】:

我在 Mysql 中有一个 PHP 脚本和一些约束规则,以防止用户删除包含产品的类别。 但是当用户尝试删除禁止的类别时,他将面临致命错误而不是网站页面

Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails...

我需要显示如下错误而不是致命错误:

当它与产品相关时,您不能删除此类别。

编辑:请注意,try/catch 不适用于致命错误

【问题讨论】:

  • 根据您网站的逻辑,当某些内容无法删除时,最好禁用删除按钮(显示页面时检查依赖产品)。
  • 如果我每次都要检查相关产品,那为什么要使用约束规则?
  • 数据库规则是为了确保正确设置数据库,(恕我直言)业务规则更适合用户。
  • 您无法使用 try/catch 捕获致命错误。
  • 我需要阻止用户删除类别

标签: php mysql pdo error-handling constraints


【解决方案1】:

您可以将查询放在trycatch 语句中,并尝试捕获查询期间发生的所有错误:

try{
//query
}
catch(Error $error){
//do something
}

或者为整个文档放置一个错误处理程序:

function myCustomErrorHandler(int $errNo, string $errMsg, string $file, int $line) {
//do something
}

set_error_handler('myCustomErrorHandler'); 

我的想法最初来自这个网站: https://netgen.io/blog/modern-error-handling-in-php

【讨论】:

  • 全局错误处理程序很难提供一些有意义的错误。
  • true,但如果您只想将用户中继到特定站点(如果发生错误),则很有用。在这种情况下,如果他想显示错误消息,那将是不可行的。
  • 我使用了 try catch 但我又遇到了致命错误
  • 那么请使用error_handler,我刚刚读到try catch方法不能处理致命错误(link),很抱歉造成混乱
  • 他从字面上粘贴了错误,上面写着fatal error。代码一点问题都没有
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2016-05-26
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多