如何正确处理 PDO 连接错误?

出于安全原因,我尝试使用 PHP/MySQL 处理或捕获可能的错误,并想知道我是否做得对。第一种情况:我将它用作函数,并在需要数据库连接时始终调用它。第二种情况:我不知道如何处理。我把所有准备好的语句放在if条件中,但这很尴尬。那么$stmt->execute呢?这也可能失败,并且在 if 条件下处理这个问题真的会让人困惑。我希望有更好的方法去。


第一的:


function pdo () {

  try {

    $pdo = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'pw');

  }

  catch(PDOException $e) {

    header("Location: handle_error.php");

    exit;

  }

  return ($pdo);

}

第二:


if ($stmt = $pdo->prepare("SELECT a FROM b WHERE c = :c")) {

  $stmt->execute(array(':c' => $c));

  $result = $stmt->fetch();

  echo 'All fine.';

}

else {

  echo 'Now we have a problem.';

}


临摹微笑
浏览 245回答 1
1回答

牧羊人nacy

您当前的代码有一些缺陷。让我给你一些提示。您不需要您创建的函数,至少在当前形式中不需要。每次调用此函数时,它都会创建一个新的 PDO 对象,这会影响脚本的性能。理想情况下,您希望在整个脚本的整个执行过程中只有一个连接。创建新的 PDO 连接时,您需要记住 3 件事:设置正确的连接字符集、启用错误报告和禁用模拟准备。完整的代码应该是这样的:正确的字符集很重要。没有它,您的数据可能会损坏,甚至容易受到 SQL 注入的影响。推荐的字符集是utf8mb4.启用错误报告可以省去手动检查每个函数调用是否失败的麻烦。您只需要告诉 PHP 在发生错误时触发异常并找到一种合适的方式在您的服务器上记录错误(阅读更多:我的 PDO 语句不起作用)默认情况下启用模拟准备,但事实是没有它们你会更好。如果您的数据库支持本机准备好的语句,并且大多数都支持,那么请改用它们。$options = [    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,    \PDO::ATTR_EMULATE_PREPARES => false,];$pdo = new \PDO('mysql:host=localhost;dbname=dbname;charset=utf8mb4', 'user', 'pw', $options);不要捕捉异常,除非您知道如何处理它们并且非常确定您需要这样做。最好保留例外;让 PHP 与其他异常/错误/警告一起处理它们。毕竟为什么只为 PHP 异常设置异常?所有 PHP 错误都应该以相同的方式处理。无论您做什么,都永远不会在屏幕上手动打印(包括die, exit, echo, var_dump)错误消息。如果此类代码进入生产环境,这将是一个巨大的安全问题。如果您的 PDO 连接设置为在出现错误时抛出异常,则您永远不需要使用if语句来检查prepare()或 的返回码execute()。
打开App,查看更多内容
随时随地看视频慕课网APP