0

我正在尝试学习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

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

4

4 回答 4

0

问题是

  1. 您试图在连接之前和尝试之外抛出异常。
  2. 没有必要抛出你自己的异常,因为如果连接失败,PDO 会抛出它自己的异常
  3. 你也会考虑异常类型
try {
    $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname.';charset=utf8', ''.$dbuser.'', ''.$dbpass.'');
} catch (PDOException $e) {
    echo "Caught exception : ", $e->getMessage();
}

此外,无需打开 PDO on exceptions 即可捕获异常。但是,如果您尝试处理异常错误,则必须在建立连接后立即打开该功能。

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
于 2013-07-04T00:21:30.957 回答
0

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

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

于 2013-07-04T05:43:13.167 回答
-1

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

} catch (MyFunkyException $e) {

MyFunkyException是您要捕获的异常类型的类名。
PDO 不会引发MyFunkyException异常 -文档声明它会引发PDOException异常。

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

} catch (PDOException $e) {

或者通过捕获所有异常而不考虑类型,如下所示:

} catch (Exception $e) {
于 2013-07-04T00:37:02.853 回答
-2

尝试使用下面的代码

<?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();
}
?>
于 2013-07-04T00:20:25.480 回答