当CodeIgniter无法连接到数据库时如何检测

5
我有一个CI实例,它连接到数据库并在提供页面之前检查权限。如果当前用户无法访问该页面,则重定向到登录页面。
显然,登录页面的权限设置使其对所有用户都可访问。
最近出现了一个故障,导致数据库服务器在不同的IP地址上重新启动(感谢亚马逊EC2)。这导致CI无法检查任何页面的权限-包括登录。由于代码认为除了Yes以外的任何内容都是No,它会重定向到登录页面。结果是无限重定向循环。
虽然这个确切的问题不应该再次发生(静态弹性IP),但我想在Db连接断开时检测它并适当地处理它。
我看到了这个SO问题,这就是我想要实现的,但我没有在任何控制器中明确加载数据库,而是在autoload配置文件中加载。
那么,
如何从CI内部查询Db连接的状态?我必须运行一个无用的查询并检查是否返回结果,还是有更优雅的解决方案?
编辑:检查当前正在使用的钩子。
$hook['post_controller_constructor'] = array(
                                'class'    => 'AuthHook',
                                'function' => 'ValidateCredentials',
                                'filename' => 'auth.php',
                                'filepath' => 'hooks'
                                );
2个回答

6
您可以扩展控制器并在其构造函数中加载数据库:
    class My_Controller extends CI_Controller {
        public function __construct(){
            parent::__construct();
             if ( $this->load->database() === FALSE )
             {
                //do something
             }
         }
     }

所有的控制器都将继承这个新的控制器。


那似乎是一个不错的选择(我也可以看到其他功能被挤进去)。然而,由于权限检查目前正在钩子内部进行,可能无法以这种方式实现。我没有提到它,因为我认为它不相关。我会更新问题并提供更多信息。 - Basic
你可以将 ValidateCredentials 代码插入到 My_Controller 构造函数中,在 parent::__construct(); 之后。如果所有的控制器都继承自 MY_Controller,则功能将保持不变。 - Yan Berk
谢谢 - 这是我未来可能要做的事情,但目前我认为@Laurencai的答案更接近我所问的问题(尽管你的答案似乎更符合我长期需要的)。谢谢。 - Basic

2

由于代码假设除了“是”之外的任何内容都是“否”,因此它会重定向到登录页面。

因此,您只需要更改登录逻辑函数以特别检查数据库连接(因此仍然可以自动加载数据库)。

可以使用类似以下语句:

 $result = $this->db->conn_id;  

这看起来像我想要的测试 - 假设如果没有连接,那么这将是null/未设置的? - Basic
3
实际上这将是假的 - 因此您可以这样写:“if ( ! $this->db->conn_id))”。 - Laurence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接