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

Php 如何正确处理PDO连接错误?,php,pdo,error-handling,Php,Pdo,Error Handling,出于安全原因,我尝试处理或捕获PHP/MySQL可能出现的错误,并想知道我是否做对了。 第一种情况:我将它用作函数,并在需要数据库连接时始终调用它。 第二种情况:我不知道如何处理。我把所有准备好的语句都放在if条件下,但这很尴尬。 那么$stmt->execute呢?这也可能会失败,在if条件下处理这一问题也会让人感到困惑。 我希望有更好的办法 第一: function pdo () { try { $pdo = new PDO('mysql:host=localhost;dbnam

出于安全原因,我尝试处理或捕获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.';
}

您当前的代码有一些缺陷。让我给你一些建议

  • 您不需要已创建的函数,至少不需要当前表单中的函数。每次调用此函数时,它都会创建一个新的PDO对象,这可能会妨碍脚本的性能。理想情况下,在整个脚本执行过程中,您希望只有一个连接

  • 在创建新的PDO连接时,您需要记住3件事:设置正确的连接字符集、启用错误报告和禁用模拟连接

    • 正确的字符集很重要。如果没有它,您的数据可能会损坏,甚至使您容易受到SQL注入的攻击。推荐的字符集是
      utf8mb4
    • 启用错误报告可以省去手动检查每个函数调用是否失败的麻烦。您只需要告诉PHP在发生错误时触发异常,并找到一种合适的方法将错误记录到服务器上(阅读更多:)
    • 默认情况下,会启用模拟准备,但事实是,如果没有它们,您会过得更好。如果您的数据库支持本机准备的语句,并且大多数都支持,那么请改用它们
    完整代码应如下所示:

    $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\u dump
    )。如果此类代码进入生产环境,这将是一个巨大的安全问题


  • 如果PDO连接设置为在出现错误时抛出异常,则无需使用
    If
    语句来检查
    prepare()
    execute()
    的返回代码!我已经有了一个第一类的答案,但您的提问方式表明,这与堆栈溢出的主题无关,您的问题更适合于。请在那里询问,或者将其改为“如何…”,如“如何正确连接PDO并处理错误”“感谢您详细解释pdo连接。现在我不再使用connenction函数,而是在每个php文件的顶部包含一个单独的database\u setting.php文件,其中包含正确的信息,这是需要的。我希望到目前为止这是正确的?