PDO 异常问题 - 如何捕获它们 不要抓住它们。

2022-08-30 17:48:25

我正在使用PDO为数据库重写网站界面。我曾经使用mysql扩展,但我从未为错误处理而烦恼,我拥有的几个错误处理程序基本上是复制粘贴。

现在我想把这件事做好。但是,我在捕获错误时遇到问题(MySQL中的“重复条目”,“空值”等错误)。我的语句需要有多少内容在 try 块中?它应该全部在那里吗?我正在使用 连接到我的数据库(它有自己的错误处理),所以只有查询执行在这个代码中有错误。我无法弄清楚为什么在执行以下代码时它没有捕获错误:Include()

try {
  $stmt = $db->prepare("INSERT INTO tbl_user (id, name, password, question, answer)    VALUES (NULL, :name, :password, :question, :answer)");
  $stmt->bindValue(":name", $_POST['name']);
  $stmt->bindValue(":password", $_POST['password']);
  $stmt->bindValue(":question", $_POST['question']);
  $stmt->bindValue(":answer", $_POST['answer']);
  $stmt->execute();
  echo "Successfully added the new user " . $_POST['name'];
} catch (PDOException $e) {
  echo "The user could not be added.<br>".$e->getMessage();
}

所以我的问题是:所有这些都必须在尝试块中吗?我可以直接将执行放在 try 块中吗?它应该捕获错误,但会传递成功消息。(尝试添加两个“John”用户时)。我签入了PHPMyAdmin;索引是唯一的,并且会按预期抛出错误,只是没有使用此代码。Duplicate value "John" in key "name"


答案 1

您应该查看文档。但是,如果您找不到任何内容,则可以添加另一个捕获:

<?php
try {
  $stmt = $db->prepare("INSERT INTO tbl_user (id, name, password, question, answer)    VALUES (NULL, :name, :password, :question, :answer)");
  $stmt->bindValue(":name", $_POST['name']);
  $stmt->bindValue(":password", $_POST['password']);
  $stmt->bindValue(":question", $_POST['question']);
  $stmt->bindValue(":answer", $_POST['answer']);
  $stmt->execute();
  echo "Successfully added the new user " . $_POST['name'];
} catch (PDOException $e) {
  echo "DataBase Error: The user could not be added.<br>".$e->getMessage();
} catch (Exception $e) {
  echo "General Error: The user could not be added.<br>".$e->getMessage();
}
?>

这必须有效,因为PHP插件的所有异常都来自Exasional native PHP类(如果我的内存良好,则从5.0开始)。


答案 2

PDO 异常问题 - 如何捕获它们

通常 -

不要抓住它们

例如,您在此处的代码应以这种方式编写

$stmt = $db->prepare("INSERT INTO tbl_user (id, name, password, question, answer) VALUES (NULL, :name, :password, :question, :answer)");
$stmt->bindValue(":name", $_POST['name']);
$stmt->bindValue(":password", $_POST['password']);
$stmt->bindValue(":question", $_POST['question']);
$stmt->bindValue(":answer", $_POST['answer']);
$stmt->execute();
echo "Successfully added the new user " . $_POST['name'];

无需任何尝试或接听电话。因为您在这里没有处理异常的特定方案(简单的回显几乎不算作处理方案)。

相反,让它冒泡到应用程序范围的错误处理程序(不要被这个术语吓到,PHP已经有一个内置的)。

但是,我在捕获错误时遇到问题(MySQL中的“重复条目”,“空值”等错误)。

只有在遇到某种情况的情况下,您才必须使用try-catch运算符,但您必须始终检查您遇到的错误是否是您预期的错误。否则,必须重新引发异常:

try {
    $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Take some action if there is a key constraint violation, i.e. duplicate name
    } else {
        throw $e;
    }
}

当然(事实证明这是这个问题的vere问题),您必须在异常模式下设置PDO,无论是在构造函数参数中,只需添加代码即可

$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

连接后立即。


推荐