我将我的数据库连接参数设置在一个文件中,我将其包含在我需要的所有页面中。连接文件看起来像这样......叫做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。如果未设置连接,是否有办法重试连接?
我意识到我可以保留它并且没有问题,除了数据库查询失败并且代码没有执行,但是我希望有更多的选项,比如在错误日志中添加另一个条目这发生了。
答案 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步迭代。