CodeIgniter Database DSN problem

這是針對 CodeIgniter 1.5.4 所寫的一個問題, 由於前幾天小雷開始自己用 CI 在寫程式, 不過這次小雷在 CodeIgniter 並不是設定檔的方式來設定資料庫的方式, 而是透過用 DSN 的方式來連線, 結果碰到了問題, 其實這是 CodeIgniter 的 bug。

dsn 應該是像下面這樣:

$dsn = 'mysql://username:[email protected]/database';

但是在執行的時候, 跑出來的錯誤訊息居然是抓錯了 database driver, 用這個 dsn, 當然 CI 的 DB driver 應該就是 mysql, 沒想到 CodeIgniter 抓出來的 database driver 居然是 m … 沒錯! 一個英文字母「m」, 像是下面這樣:

requireonce(/srv/www/vhosts/admitere/system/database/drivers/m/mdriver.php) [function.require-once]: failed to open stream: No such file or directory

本來小雷是問我說: 「CI 怎麼 debug ?」 我當時心理想說: 「小雷是指 php 怎麼 debug 嗎?」 不過其實不管是 CI 或是 php 都一樣是 php 嘛! 我就回小雷說:「就跟 php 一樣阿!」的確, open source 的東西有 bug 很正常, 發現了試著就去修, 修好了就 submit, 修不好或沒時間修就去找 forum, 或者是 report bug tracker, 不管是哪一個方法, 都對社群有幫助呀~

anyway, 後來小雷找不出來了, 就來找我, 當時我正在改某個程式, 弄不出來, 所以也沒辦法靜下心來找 bug, 所以隨便測一下, 我就跑去 CI 的 forum 找, 馬上找到這一篇:「n00b needs help connecting」, 直接拉到最後一則就是了!

ok, 解決方式就是在 DB.php 的第 40 行, 找到「}」 在後面加上下面這一段即可:

``` else {
$parsedURL = parse_url ($params);

$params = array ();
$params["dbdriver"] = $parsedURL["scheme"];
$params["hostname"] = (! isset ($parsedURL['host'])) ? '' : rawurldecode ($parsedURL['host']);
$params["username"] = (! isset ($parsedURL['user'])) ? '' : rawurldecode ($parsedURL['user']);
$params["password"] = (! isset ($parsedURL['pass'])) ? '' : rawurldecode ($parsedURL['pass']);
$params["database"] = (! isset ($parsedURL['path'])) ? '' : rawurldecode (substr ($parsedURL['path'], 1));

}```

之後 dsn 抓到的 db driver 應該就是正確的了! 這是針對 CodeIgniter 1.5.4 以前的版本修正的問題。 有人在 forum 貼 code 出來, 那麼應該也有送到 CI 的 bug tracker 吧? 那就期待 1.5.5 吧!? XD

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!