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

标签 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());
}

当我需要使用数据库执行操作时,我会包含此文件并最终得到类似的内容...名为 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 的正确方法。如果未设置,是否可以重试连接?

我意识到我可以保留它,除了数据库查询失败并且代码不执行之外,不会有任何问题,但我希望有更多选项,例如在发生这种情况时向错误日志添加另一个条目.

最佳答案

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

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

此外,必须在涉及数据访问的整个连接/准备/获取/关闭操作中应用抛出异常和真/假/空验证。您可能想看我的帖子:

我觉得你的包含数据库连接文件的想法也很好。但请考虑使用 require_once,这样数据库连接仅创建一次,而不是在任何包含时创建。

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

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

关于php - 如果 pdo 数据库连接不存在,错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45229074/

相关文章:

php - SQLSTATE[HY093] : Invalid parameter number: parameter was not defined

php - 总是使用 MySQL 的项目应该使用 PDO 吗?

php - 提交输入正在向数据库登录检查器发送空答案

java - JPA 实体生成错误的数据库设计

php - 使用 CASE 比较 MySQL 中的日期

mysql - 使用 where 子句从另一个表中选择数据

postgresql - 从另一行更新postgres中的一行

php - 使用 PDO 预准备语句插入时 MySQL 性能极差

php - zsh: 错误的数学表达式:操作数预期在 `' HTTP_HOST...'

php - PHP 中的多维数组、乘法和加法