错误处理如果不存在pdo数据库连接?

时间:2017-07-21 04:38:22

标签: php mysql pdo

我将我的数据库连接参数设置在一个文件中,我将其包含在我需要的所有页面中。连接文件看起来像这样......叫做connect.php:

$db_host        = '111.111.111.111';
$db_database    = 'test';
$db_user        = 'test';
$db_pass        = 'test';
$db_port        = '3306';

//db connection
try {
    $db = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_database;charset=utf8", $db_user, $db_pass, 
        array(
            PDO::ATTR_EMULATE_PREPARES => false, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //PDO::ERRMODE_SILENT is default setting
            PDO::ATTR_PERSISTENT => false //when true 
            )
    );
}
catch(PDOException $e) {
    error_log("Failed to connect to database (/connect.php): ".$e->getMessage());
}

当我需要对db做一些事情时我会包含这个文件并最终得到这样的东西...叫做example.php:

require $_SERVER['DOCUMENT_ROOT'].'/assets/functions/connect.php';

$stmt = $db->prepare("
    SELECT 
        accounts.account_id,
    FROM accounts
    WHERE accounts.account_key = :account_key
");

//bindings
$binding = array(
    'account_key' => $_POST['account_key']
);
$stmt->execute($binding);   
//result (can only be one or none)
$result = $stmt->fetch(PDO::FETCH_ASSOC);

//if result
if($result)
{
    // result found so do something
}

偶尔数据库连接会失败(更新,我关闭它,它被锤击,无论如何)......当发生这种情况时,我在try / catch中的PDOException正常工作,并在我的错误日志中添加一个条目这么说。

我还想做的是添加一个'检查'在我的example.php中,如果没有连接(包含我的连接脚本的包含文件无法获得连接),它就不会尝试进行任何数据库工作。我该怎么做呢?这样做的首选方法是什么?

我不确定正确的方法来测试'我的$ stmt条目前的$ db。如果未设置连接,是否有办法重试连接?

我意识到我可以保留它并且没有问题,除了数据库查询失败并且代码没有执行,但是我希望有更多的选项,比如在错误日志中添加另一个条目这发生了。

1 个答案:

答案 0 :(得分:1)

要停止进一步处理,只需在每个exit()块的末尾添加catch,除非您要应用finally块。

try {
    //...   
} catch(PDOException $e) {
    // Display a message and log the exception.
    exit();
}

此外,必须通过涉及数据访问的整个connect / prepare / fetch / close操作来应用抛出异常和true / false / null验证。你可能想看一下我的帖子:

包含数据库连接文件的想法我也觉得很好。但是考虑使用require_once,以便只创建一次数据库连接,而不是任何包含。

注意:在我的示例中,我实现了一个解决方案,它以某种方式模拟了应该只在应用程序的入口点处理所有异常/错误的事实。因此,它更倾向于MVC概念,其中所有用户请求都通过单个文件发送:index.php。在这个文件中几乎应该处理所有try-catch情况(日志和显示)。在其他页面中,异常将被抛出并重新抛出到更高级别,直到它们到达入口点,例如index.php。

至于重新连接到db,它应该如何与try-catch相关联,我还不知道。但无论如何它应该意味着最多3步迭代。