iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 8
0
自我挑戰組

自學CodeIgniter跌跌撞撞30天系列 第 8

[ Day 8 ] CodeIgniter第二個手作:番外篇(1):Active Record——查詢資料 (Selecting)

新聞模組的結論

user guide

走完「查詢」與「新增」之後,CI教學手冊表示:

現在你已經完成了這個教學,我們建議你看一看手冊的其它部份。CodeIgniter 常常因為擁有完整的文件而被稱讚。?你可以好好的利用這個優勢,完整的閱讀"簡介"與"一般主題"。 當有需要時,你也應該閱讀類別參考與補助函式參考。
任何一個中階的 PHP 開發者應該都能夠在幾天內掌握使用 CodeIgniter 的訣竅。

我才不要這樣

所以,我完成一個里程碑了!好棒棒~才怪!沒有把「新刪修三部曲」都練一次我心裡不踏實(個人問題)。在開始剩下的二部曲之前,必須要先跟CI的資料庫使用方法培養感情,所以這篇會介紹Active Record的使用!

回頭來寫的題外話

本來這篇想要把三部曲兼查詢一次一網打盡,打到一半發現查詢要講的東西超級多,總不能都提到了查詢卻草草帶過,好吧,我只好拆篇了,絕對沒有拖台錢(X)

Active Record:查詢資料 (Selecting)

以下範例全部參考User Guide,會加上我的理解,當然,想要自己看手冊的朋友,可以點傳送門自己研究XD。

一般查詢(*)

一般查詢單一Table時會下的Query語法不外乎是SELECT * FROM XXX,在這裡,CI幫你簡化成只要輸入Table就可以了!代碼如下:

$query = $this->db->get('mytable');
// 產生: SELECT * FROM mytable

在Query語法後面設置limit控制資料數量:

$query = $this->db->get('mytable', 10, 20);
// 產生: SELECT * FROM mytable LIMIT 20, 10 (使用MySQL。其它資料庫有不太一樣的語法。)

將結果從$query取出(result我們跳到後面說):

$query = $this->db->get('mytable');
foreach ($query->result() as $row)
{
    echo $row->title;
}

條件查詢

最常用除了全部查詢外還有指定篩選條件的查詢方法,例如「我要找學號為D123555的學生」,這時候該怎麼做呢?

$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);

result()到底何許人也?

不詳其姓字,宅邊也沒有五柳樹,所以到底是誰?他是——負責將$query的結果以某種型態抓出來。
那,到底可以呈現的結果有哪些?單筆、多筆、數字、陣列、物件?沒錯,把拔買給你(這筆者廢話好多)

result(): 將結果回傳一個陣列物件(objects),失敗時回傳空陣列,別名result_object()。
result_array(): 將結果回傳一個陣列資料,失敗時回傳空陣列。
row(): 回傳單筆物件(object)資料,查詢的資料超過一筆,只會回傳第一筆資料。
row_array(): 回傳單筆陣列(array)資料,查詢的資料超過一筆,只會回傳第一筆資料。

result()體系的好朋友

$query->num_fields(): 回傳查詢結果所產生的欄位行數。
$query->free_result(): 釋放查詢結果所產生的記憶體,以及刪除物件變數ID。
這部分「初學者」可能需要理解一下:
一般做兩個查詢來說,查完的結果會放在$query及$query2,我們再分別依照需求去排版或者整理資料。這裡的free_result()的意思就是~「清掉」,也就是當你清完,後面的$query與$query2就等於不存在了。

引用user guide的解釋:

基本上PHP會在程式全部執行完成後自動釋放記憶體。 然而,假如您在單一PHP檔案執行了多個查詢,就必須要釋放每>一次查詢所消耗的記憶體空間。

查詢結果在用完後沒有清掉~就會留在記憶體裡!太多的話可是會對伺服器造成影響的!

$query = $this->db->query('SELECT title FROM my_table');

foreach ($query->result() as $row)
{
   echo $row->title;
}
$query->free_result(); // $query 物件將不再使用了

$query2 = $this->db->query('SELECT name FROM some_table');

$row = $query2->row();
echo $row->name;
$query2->free_result(); // $query2 物件將不再使用了

本篇結尾

下一篇會深入介紹Select()的其他家族用法,以及Where()的深入用法,雖說學東西求懂不求快,但~還是希望能控制在兩篇內把查詢給解決,以免學習進度與烏龜無異,我們一起加油吧!


上一篇
[ Day 7 ] CodeIgniter第二個手作:新聞列表 (3):新增內容。
下一篇
[ Day 9 ] CodeIgniter第二個手作:番外篇(2):Active Record——select() 、 from()、join()
系列文
自學CodeIgniter跌跌撞撞30天12

尚未有邦友留言

立即登入留言