2

我在任何地方都找不到答案。也许它真的很简单

我有这样的mysql PDO连接:

try{
$DBH = new PDO("mysql:host=$db_hostname;dbname=$db_database", $db_username, $db_password);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
}
catch (PDOException $e){
echo $e->getMessage();
exit;
}

我只想测试连接是否有效,即。如果密码、用户名、数据库名和主机名拼写正确。

try, throw 似乎只是发现了基本错误,比如驱动程序拼写错误。如果说密码错误,它不会抛出错误。

谢谢

4

2 回答 2

13

只需单击此问题,即可在PDO 标签 wiki中找到确切的操作方法:

$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'root','', $opt);

以及警告

不要使用 try..catch运算符来处理错误消息。
未捕获的异常已经非常适合此用途,因为它将以与其他 PHP 错误相同的方式处理 PDO 错误 - 因此,您可以使用站点范围的设置来定义行为。稍后可以添加自定义异常处理程序,但不是必需的。特别是对于新用户,建议使用未处理的异常,因为它们非常有用、有用且安全。更多信息...

于 2013-08-14T15:41:35.380 回答
3

我使用以下代码进行连接:

    <?php
class dbConnection extends PDO{

public function __construct() {    
  switch(DB_TYPE){
    case "mysql":
        $dbconn = "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET;
        break;
    case "sqlite":
        $dbconn = "sqlite:".DB_PATH.";charset=".DB_CHARSET;
        break;
    case "postgresql":
        $dbconn = "pgsql:host=".DB_HOST." dbname=".DB_NAME.";charset=".DB_CHARSET;
        break;
    }

    parent::__construct($dbconn,DB_USER,DB_PASS,array(PDO::ATTR_EMULATE_PREPARES => false,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

   }
}
?>

如果我输入错误的密码,我会得到

连接错误,因为:SQLSTATE[28000] [1045] 用户 'microaid_logger'@'localhost' 的访问被拒绝(使用密码:YES)

正如你的常识所指出的,如果连接不成功,已经抛出异常,如果密码错误也会触发。如果要格式化错误消息的文本或对其进行处理,只需按照此处所述设置自定义错误处理程序

于 2013-08-14T15:36:27.493 回答