[心得] CodeIgniter MySQL Database 使用教學

看板PHP作者 (小惡魔)時間15年前 (2009/04/20 15:37), 編輯推噓11(11013)
留言24則, 12人參與, 最新討論串1/1
網誌程式版:http://blog.wu-boy.com/2009/04/20/1180/ 繼上一篇 [PHP] 好用 Web Framework : CodeIgniter 安裝教學 之後,這次來紀錄一下 Database Class 的用法,我想官方網站都已經寫的很詳細了,就大概快速講一下我的一 些用法跟心得,其實最主要講的是內建的 Active Record Class,它可以快速撰寫 SQL 語法,不必打 where 或者是 From 這些字眼,insert update select 都可以利用 Active Record Class 很簡單的撰寫出來喔,它也幫忙簡單的檢查 escape SQL Injection,舉的簡單例子大概就知道了: 假設底下這個簡單的 join 一個表格的 select 語法 $query = $this->db->query("SELECT a.news_id, a.news_name, a.add_time FROM project_news a left join project_news_categories b on a.categories_id = b.categories_id where news_id = '".$id."' order by news_top DESC, a.add_time DESC "); 利用 Active Record Class 可以改寫成: $this->db->select('a.news_id, a.news_name, a.add_time'); $this->db->from('project_news a'); $this->db->join('project_news_categories b', 'a.categories_id = b.categories_id', 'left'); $this->db->order_by("news_top DESC, a.add_time DESC"); $this->db->where('news_id', $id); 是不是覺得在閱讀方面很容易瞭解呢,那之後要改 sql 語法,也可以快速找到要改的地 方,交接給其他程式組員,在學習或者是除錯方面都相當容易的喔。 首先介紹設定 database 的 config 檔案 Database Configuration $active_group = "default"; $active_record = TRUE; $db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = "1234"; $db['default']['database'] = "vbs"; $db['default']['dbdriver'] = "mysql"; $db['default']['dbprefix'] = ""; $db['default']['pconnect'] = FALSE; $db['default']['db_debug'] = TRUE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] = ""; $db['default']['char_set'] = "utf8"; $db['default']['dbcollat'] = "utf8_general_ci"; 上面可以在 application/config/ 底下找到 database.php 檔案裡面,$active_group 是用來設定預設 load 哪一個 DB config 檔案,那預設就是 default 這個 name 了, $active_record,用來設定啟動 Active Record Class。 連接 MySQL 資料庫,基本連接方式如下: $this->load->database(); 可以傳入三個參數,其實如果沒有要使用多重資料庫的話,就不用設定三個參數,第一個 參數,就是傳入 db 參數的 array 變數,第二個是傳入 TRUE/FALSE (boolean),用來設 定多重資料庫,第三個參數傳入TRUE/FALSE (boolean),用來設定 enable the Active Record class。 簡單的一些基本 sql 語法可以參考 線上手冊,我的建議可以使用 Active Record Class ,這樣方便防止 SQL Injection,不然就要利用內建的 $this->db->escape() 導入參數 ,其實用 Active Record Class 就會自動幫忙加入了喔,例如用了 $this->db->where(); 看說明文件後面會註明: Note: All values passed to this function are escaped automatically, producing safer queries. 撰寫一個範例測試看看,首先建立一個 model.php 檔案,命名為 news_model.php,放到 application/models 裡面: <?php class News_model extends Model { var $title = ''; var $content = ''; var $date = ''; function News_model() { // Call the Model constructor parent::Model(); /* load 資料庫 */ $this->load->database(); } function get_last_entries($count) { $this->db->select('a.news_id, a.news_name, a.add_time'); $this->db->from('project_news a'); $this->db->join('project_news_categories b', 'a.categories_id = b.categories_id', 'left'); $this->db->order_by("news_top DESC, a.add_time DESC"); $this->db->limit($count); $query = $this->db->get(''); $row = $query->result_array(); $query->free_result(); // The $query result object will no longer be available return $row; } ?> 檔案內容裡面 News_model 第一個字母必須命名為大寫,再來建立 Controller 檔案 <? class Vbs extends Controller { function __construct() { parent::Controller(); } function index() { $data['news_data'] = $this->news_model->get_last_entries('5'); $page_title = '首頁'; $this->header($page_title); $this->load->view('index_content', $data); $this->footer(); } } ?> 在 controller 裡面,我們沒有 load model,$this->load->model(’news_model’);, 可以在 config/autoload.php 加入: /* | ------------------------------------------------------------------- | Auto-load Models | ------------------------------------------------------------------- | Prototype: | | $autoload['model'] = array('model1', 'model2'); | */ $autoload['model'] = array("news_model"); 這樣我們每個 controller 就都可以使用 news_model,而不必在寫入底下這一行,有些 常用的的 model 都可以參考 Auto-loading Resources 方式加入即可 $this->load->model('news_model'); 這時候在建立 view 檔案就大致上完成了,放在 application/views 裡面,這樣基本的 DB 連接以及取出資料都會了,新增刪除修改都在文件裡面講的很清楚,這裡就不多說了 。 網頁版:http://blog.wu-boy.com/2009/04/20/1180/ -- MLB 美國職棒影片網站 ~ http://mlb.wu-boy.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.107.202

04/20 15:49, , 1F
頭推!!
04/20 15:49, 1F

04/20 15:54, , 2F
XD ... 版上有人在玩這套嗎?
04/20 15:54, 2F

04/20 15:54, , 3F
剛摸 不到一個禮拜,想說可以交流交流 XDDDDD
04/20 15:54, 3F

04/20 16:16, , 4F
有啊,我~~XD 我是 whatup 哇哈哈
04/20 16:16, 4F

04/20 16:18, , 5F
我在被這套玩,如果你想知道我的心得的話...
04/20 16:18, 5F

04/20 16:19, , 6F
三樓 XDDDDDD
04/20 16:19, 6F

04/20 16:19, , 7F
沒勇氣不要用 CI,最好連 PHP 都不要用 [被毆死]
04/20 16:19, 7F

04/20 16:35, , 8F
我覺得CI不錯啊,我是覺得沒勇氣不要用蛋糕 Q_Q
04/20 16:35, 8F

04/20 16:40, , 9F
XD 蛋糕的文件 我覺得 很 Orz.........
04/20 16:40, 9F

04/20 16:40, , 10F
待會該不會 Darkhero 會出現吧 XDDDDD
04/20 16:40, 10F

04/20 17:16, , 11F
四樓你好啊~~ ._.\~/
04/20 17:16, 11F

04/20 17:22, , 12F
小的覺得蛋糕的文件其實還不錯看啊 :)
04/20 17:22, 12F

04/20 17:59, , 13F
chrisQQ 大大你好阿
04/20 17:59, 13F

04/20 18:31, , 14F
我是覺得蛋糕有太多莫名其妙的規則..
04/20 18:31, 14F

04/20 18:46, , 15F
基本上各家的framework都有自已的convention啊
04/20 18:46, 15F

04/20 20:28, , 16F
XD 我是小小~ 不過我們幾個也太有緣了…
04/20 20:28, 16F

04/20 22:42, , 17F
CI 還不錯用,說明文件也算清楚~
04/20 22:42, 17F

04/21 02:35, , 18F
怎麼可以不推! 建構子沒要預先處理時 可以省略!
04/21 02:35, 18F

04/21 09:28, , 19F
appleboy 我來了,Cakephp 的文件很User Guild取向...
04/21 09:28, 19F

04/21 09:29, , 20F
反而是很多進階跟api 要自己挖.. CI 文件就很完整...
04/21 09:29, 20F

04/21 09:30, , 21F
我是Darkhero.. 撤退...
04/21 09:30, 21F

04/21 14:49, , 22F
XDDD 樓上出來報到了 哈哈 Sun 要被買了 囧
04/21 14:49, 22F

04/25 13:32, , 23F
ding
04/25 13:32, 23F

04/25 21:38, , 24F
CI不錯呀/_\不過我轉用Kohana了,最近又發現Yii
04/25 21:38, 24F
文章代碼(AID): #19x2OfIT (PHP)