Missing database Connectionこのエントリをはてなブックマークに追加

10 月 14, 2008

今日cakeで、DBに接続できなかったときのエラー処理がしたくて四苦八苦していたときのメモ。
なんか「これバグじゃね?」的な感じ。

config/database.phpで適当なホスト名を入れるとエラーで終了するんだけど、app_model.phpで受け取れないかなーなんて思ってたんだけど、そういうレベルじゃないみたい。
問題は、cakeの本体/libs/model/model.php L.2509あたりのsetDataSource。

<?php
function setDataSource($dataSource = null) {
    $oldConfig = $this->useDbConfig;

    if ($dataSource != null) {
        $this->useDbConfig = $dataSource;
    }
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    if (!empty($oldConfig) && isset($db->config['prefix'])) {
         $oldDb =& ConnectionManager::getDataSource($oldConfig);
         if (!isset($this->tablePrefix) || (!isset($oldDb->config['prefix']) || $this->tablePrefix == $oldDb->config['prefix'])) {
             $this->tablePrefix = $db->config['prefix'];
         }
    } elseif (isset($db->config['prefix'])) {
         $this->tablePrefix = $db->config['prefix'];
    }
    if (empty($db) || $db == null || !is_object($db)) {
        return $this->cakeError('missingConnection', array(array('className' => $this->alias)));
    }
}
?>

一見なんともなさそうなんだけど、このプログラム今日見たところだと、cakeErrorの部分通らない。
$dbの値はMysqlのDriverがobjectとして返ってくるから、エラーのままースルーする。
から、ここにこんな感じで追加する。

<?php
    if (empty($db) || $db == null || !is_object($db) || empty($db->connection)) {
        return $this->cakeError('missingConnection', array(array('className' => $this->alias)));
    }
?>

最後の、emptyのところね。
成功したときと、しないときでそこの値しか変わりないみたい。
まぁ本体修正するのはどうかと思うけど、これで適当な名前のホスト名でつなげば、「Missing Database Connection」のエラー画面が出るはず。

しかし!このエラー画面罠があります。

こういうエラーメッセージが出ると思う。

If you want to customize this error message, create ****/views/errors/<strong>missing_database.ctp</strong>

これうそだから!マジだから!いくら作っても読み込まないから!

正解はmissing_connection.ctp
もう本体のエラーメッセージが間違えてるから・・・んもう。まいったぜ。

Categories: php
Tags:

コメントはまだありません »

このコメント欄の RSS フィードトラックバック URL

コメントはまだありません。

コメントをどうぞ