5

Db に接続し、ページを提供する前に権限をチェックする CI インスタンスがあります。現在のユーザーがページにアクセスできない場合は、ログイン ページにリダイレクトされます。

ログイン ページには、明らかに、すべてのユーザーがアクセスできるようにアクセス許可が設定されています。

最近の不具合の後、データベース サーバーは別の IP アドレスで復旧しました (Amazon、EC2 に感謝します)。これにより、CI はログインを含むどのページの権限もチェックできなくなりました。このコードは、Yes 以外は No であると想定しているため、Login にリダイレクトされます。その結果、無限のリダイレクト ループが発生しました。

この正確な問題が再び発生することはありませんが (静的エラスティック IP)、Db 接続がいつダウンしたかを検出し、適切に処理したいと考えています。

私が達成しようとしているThis SO Questionを見てきましたが、どのコントローラーにもデータベースを明示的にロードしていません。それは autoload 構成ファイルにあります。

そう、

CI 内から Db 接続の状態を照会するにはどうすればよいですか? 役に立たないクエリを実行して、結果が返されるかどうかを確認する必要がありますか、それともより洗練された解決策がありますか?

編集:チェックは現在フックで実行されています:

$hook['post_controller_constructor'] = array(
                                'class'    => 'AuthHook',
                                'function' => 'ValidateCredentials',
                                'filename' => 'auth.php',
                                'filepath' => 'hooks'
                                );
4

2 に答える 2

6

コントローラを拡張し、そのコンストラクタにデータベースをロードできます。

    class My_Controller extends CI_Controller {
        public function __construct(){
            parent::__construct();
             if ( $this->load->database() === FALSE )
             {
                //do something
             }
         }
     }

すべてのコントローラーは新しいコントローラーを継承します。

于 2012-05-22T16:59:24.700 に答える
2

「コードは、はい以外はすべていいえであると想定しているため、ログインにリダイレクトされました。」

したがって、ログイン ロジック関数を変更して DB 接続を明確にチェックするだけで済みます (したがって、データベースを自動ロードします)。

次のようなものを使用します

 $result = $this->db->conn_id;  
于 2012-05-22T17:08:14.197 に答える