繁体   English   中英

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

[英]How to handle PDO connection errors properly?

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

第一:

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.';
}

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

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

  2. 创建新的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); 
  3. 除非您知道如何处理异常,并且肯定要这样做,否则不要捕获异常。 最好是例外。 让PHP与其他异常/错误/警告一起处理它们。 毕竟为什么只为PHP异常创建一个异常? 所有PHP错误都应以相同的方式处理。 无论您做什么,都永远不会在屏幕上手动打印错误消息(包括dieexitechovar_dump )。 如果这样的代码投入生产,这将是一个巨大的安全问题。

如果您的PDO连接设置为引发错误异常,则无需使用if语句来检查prepare()execute()返回代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM