【问题标题】:connection to the database using PDO使用 PDO 连接到数据库
【发布时间】:2013-07-04 00:16:45
【问题描述】:

我正在努力学习PDO

我已经制作了这段代码来连接数据库

<?php
$dbhost = "localhost";
$dbname = "testcreate";
$dbuser = "root";
$dbpass = "mysql";

    if (!$db) {
        throw new Exception('failed to connect to mysql')
    }

try {
$db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname.';charset=utf8', ''.$dbuser.'', ''.$dbpass.'');

    } catch (MyFunkyException $e) {
        echo "Caught exception : ", $e->getMessage();
}
?>

连接正常,但是当我尝试出错并且我想捕获错误时

这个错误弹出窗口

Fatal error: Uncaught exception 'Exception' with message 'failed to connect to mysql' in C:\Program Files (x86)\Ampps\www\test.php:8 Stack trace: #0 {main} thrown in C:\Program Files (x86)\Ampps\www\test.php on line 8

你能帮我解决错误或告诉我正确的方法吗

【问题讨论】:

  • 这是PDO 不是POD - 更新问题:)
  • 为什么将''$dbuser$dbpass 连接起来?
  • 您正在检查$db 是否设置您尝试连接!
  • 没有人会费心解释异常,或者为什么这里真正的问题是MyFunkyException
  • 您目前遇到的错误有什么问题?

标签: php mysql database pdo mysqli


【解决方案1】:

问题是

  1. 您试图在连接之前和尝试之外引发异常。
  2. 没有必要抛出你自己的异常,因为 PDO throws its own exception if connection fails
  3. 你也可以考虑exception type
try {
    $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname.';charset=utf8', ''.$dbuser.'', ''.$dbpass.'');
} catch (PDOException $e) {
    echo "Caught exception : ", $e->getMessage();
}

此外,无需打开 PDO 异常即可捕获异常。但如果您尝试to handle errors with exceptions,则必须在建立连接后立即开启该功能。

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

【讨论】:

  • @YourCommonSense,我同意。在这个例子中,我必须在 catch 里面放什么?
  • 没什么。这里根本不应该有try catch。 PHP 会处理得更好。
【解决方案2】:

问题是您不想捕捉任何东西。
至少在您希望它只回显错误消息之前。

此外,异常与 PDO 语法无关。

【讨论】:

    【解决方案3】:

    这里真正的问题在于这一行:

    } catch (MyFunkyException $e) {
    

    MyFunkyException 是您要捕获的异常类型的类名。
    PDO 不会抛出 MyFunkyException 异常 - the docs 声明它会抛出 PDOException 异常。

    您可以通过更改以下行来解决此问题:

    } catch (PDOException $e) {
    

    或者通过捕获所有异常而不管类型如何,像这样:

    } catch (Exception $e) {
    

    【讨论】:

      【解决方案4】:

      尝试使用下面的代码

      <?php
      $dbhost = "localhost";
      $dbname = "testcreate";
      $dbuser = "root";
      $dbpass = "mysql";
      
      try {
      $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname.';charset=utf8', $dbuser, $dbpass);
      $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      } catch (PDOException $e) {
          echo 'Connection failed: ' . $e->getMessage();
      }
      ?>
      

      【讨论】:

      • 谢谢,这对我有用,但我不得不将 $dbh-&gt;setAttribute 更改为 $db-&gt;setAttribute
      • 你能解释一下你改变了什么,为什么?
      • @jcsanyi 我删除了if (!$db) { throw new Exception('failed to connect to mysql') } 因为没用,我添加了$db-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      • $db-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 在这种情况下也没用。
      • 特别是因为您是在引发异常的代码之后执行此操作的。
      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 2015-01-14
      • 2016-03-27
      • 2015-01-16
      • 2018-09-12
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多