PHP PDOException未捕获

时间:2018-03-03 23:32:41

标签: php pdo error-handling

我需要一些关于PDO错误处理的指导。

我收到了这段代码:

<?php
$config = include('config.php');

try{
    $handler = new PDO('mysql:host-127.0.0.1;dbname=not_a_valid_dbname', $config->username, $config->password);
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Yup!';
}catch(PDOException $e){
    echo 'Caught! '.$e->getMessage();
}

如您所见,我提供了无效的数据库名称。这个页面输出'Yup!'而不是让我知道没有这样的数据库。更改'mysql:not_valid_host'时也是如此。只有当我更改驱动程序名称时才会抛出错误,让我知道没有该名称的驱动程序。

我试过了:

检查php.ini的settigs(我很难解决这个问题)

添加

error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);

添加

ini_set('display_errors',true);

还尝试在catch param中添加反斜杠:

catch(\PDOException $e)

结果仍然相同。帮我打破我的代码:D

1 个答案:

答案 0 :(得分:2)

文档很不清楚,但我做了一些测试并得出了一些结论。 这是纯粹的猜测。如果我找到更多信息,我会尝试支持其中一些声明。

  • 如果host不存在,则假设为localhost
  • 数据库名称不是必需的。我想,这是您可以通过PDO连接到服务器并创建新数据库。
  • 如果您遇到语法错误,此后将停止考虑该字符串。

通过这些假设,我们可以假设您的代码按原样运行。您的DSN是:

mysql:host-127.0.0.1;dbname=not_a_valid_dbname

由于语法错误(-之后host),因此未考虑任何参数,并且未选择数据库,hostlocalhost。这就是为什么你没有错误。但是,如果删除host参数:

mysql:dbname=not_a_valid_dbname

localhost用作主机(默认选中),但not_a_valid_dbname尝试作为数据库,导致

  

捕获! SQLSTATE [HY000] [1049]未知数据库&#39; 1234&#39;

mysql:not_valid_host与第一个示例的情况相同。 DSN无效,因此假定localhost没有选择数据库。

此外,您没有收到错误,因为没有选择实际的数据库,但您没有尝试运行查询。一旦你这样做,

try {
    $handler = new PDO('mysql:', "root", "root");
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $handler->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $handler->query("SELECT * FROM test");
    echo 'Yup!';
} catch(PDOException $e) {
    echo 'Caught! '.$e->getMessage();
}

您将按预期获得PDOException

  

捕获! SQLSTATE [3D000]:无效的目录名称:1046未选择数据库

像我说的那样,所有这些都是猜测,因为我无法在大多数情况下找到具体的证据。我希望这能指导你朝着正确的方向前进。如果我发现任何问题,我会继续寻找更多信息和编辑。