Missing database Connection
10 月 14, 2008
今日cakeで、DBに接続できなかったときのエラー処理がしたくて四苦八苦していたときのメモ。
なんか「これバグじゃね?」的な感じ。
config/database.phpで適当なホスト名を入れるとエラーで終了するんだけど、app_model.phpで受け取れないかなーなんて思ってたんだけど、そういうレベルじゃないみたい。
問題は、cakeの本体/libs/model/model.php L.2509あたりのsetDataSource。
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として返ってくるから、エラーのままースルーする。
から、ここにこんな感じで追加する。
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。
もう本体のエラーメッセージが間違えてるから・・・んもう。まいったぜ。
Tags: cakephp
コメントはまだありません »
このコメント欄の RSS フィード — トラックバック URL
コメントはまだありません。
コメントをどうぞ