PDO连接测试

时间:2011-06-07 09:46:44

标签: php mysql pdo

我正在为我的某个应用编写一个安装程序,我希望能够测试一些默认的数据库设置。

使用PDO测试有效和无效的数据库连接是否可行?

我有以下代码:

try{
            $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb','admin','1234');
            die(json_encode(array('outcome' => true)));
        }catch(PDOException $ex){
            die(json_encode(array(
                'outcome' => false,
                'message' => 'Unable to connect'
            )));
        }

我遇到的问题是脚本试图连接,直到60秒的脚本执行时间用完,而不是说它无法连接到数据库。

由于

4 个答案:

答案 0 :(得分:43)

连接数据库时需要设置错误模式:

try{
    $dbh = new pdo( 'mysql:host=127.0.0.1:3308;dbname=axpdb',
                    'admin',
                    '1234',
                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    die(json_encode(array('outcome' => true)));
}
catch(PDOException $ex){
    die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));
}

了解更多信息,请参阅以下链接:

Using MySQL with PDO

Errors and error handling

答案 1 :(得分:10)

正如@Sascha Galley已经提到的那样,你应该将错误模式设置为异常模式。但是,您还应该设置PDO::ATTR_TIMEOUT属性,以防止在某些情况下长时间等待响应。

虽然文档说这个属性的行为在MySQL的情况下依赖于驱动程序,但它是连接超时。你找不到任何关于它的信息documentation但是这里有一个来自驱动程序源代码的简短片段:

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);

答案 2 :(得分:2)

如所见在this answer的评论中(但几乎没有其他地方,所以我在这里更加明显),"经典" PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION解决方案并不总是有效

PDO::ERRMODE_EXCEPTION is broken的实施,似乎是"泄漏"在某些情况下。

例如:

  

警告: PDO :: __ construct()[pdo .-- construct]:[2002]无法建立连接,因为目标计算机主动拒绝   它。 (尝试通过tcp:// localhost:3306连接)    [...] db.php 在线 34

那里的代码:

try {
    $this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch {
    echo("Can't open the database.");
}

异常抛出(并且正确:我可以看到我的消息)。

因此,作为必要的解决方法,您需要同时添加@ (让我们称之为"尿布运算符" in这种情况) new pdo(...) 之前实际保持清洁。

答案 3 :(得分:1)

在PDO :: ERRMODE_EXCEPTION结束时缺少右括号。

应该是:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));