[精讚] [會員登入]
911

[CodeIgniter 3] 資料庫的使用方法整理2/2

CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper

此文完整連結 http://n.sfs.tw/10174

複製連結 [CodeIgniter 3] 資料庫的使用方法整理2/2@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-04-03 22:59:51 最後編修
2016-11-05 20:25:29 By 張○○
 

此文分為兩個單元
1 Select 的使用
2 builder class/Insert/Update,Delete和其他的使用

Select使用Bulider Class(Query helper)

CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper。以下範例產生的$q是查詢物件:

範例1 select uid, uname from user;

 $q= $this->db->select('uid')->from('user')->get();

範例2 select count(uid) as cnt from user where state=1;

 $q= $this->db->select('count(uid) as cnt')->from('user')->where('state',1)->get();

範例3 select role, rolename, priv from user_role where uid=1 left join auth_role  on user_role.role= auth_role.roleID;

 $q=$this->db->select("role, rolename, priv") ->from('user_role') ->where('uid', 1) ->join('auth_role', 'user_role.role= auth_role.roleID')->get();

範例4 select email from user where email like '%john%' order by uid limit 10;

 $q= $this->db->select('`email`')->from("user")->like('email', 'john')->order_by('uid')->limit(10)->get();

範例5 select sum(`cnt`) from `counter` where module='index' and `dt`=subdate(current_date, 1) ;

 $q=$this->db->select('sum(`cnt`)')->from('counter')->where('module','index')->where('dt', 'subdate(current_date, 1)',false)->get();

...更多使用方可 以參考 CI3官網

我的Select Builder使用原則:

1. 簡單的查詢用Builder,複雜的直接寫sql防止邏輯錯誤。
2. 物件方法叫用順序有差,應照語法順序來, 例如
  ->from()->where()->order_by()->limit ()
  ->from()->or_where(A)->where(B)->where(C)   // where A and B and C 第一個or_where視同為 where
  ->from()->or_where(A)->or_where(B)->or_where(C)   // where A or B or C
  ->from()->where(A)->or_where(B)->or_where(C)   // where A or B or C
  ->from()->where(A)->or_where(B)->where(C)   // where A or B and C,等於 A or (B and C)
  ->from()->where(A)->where(B)->or_where(C)   // where A and B or C,等於 (A and B) or C
3. 善用get_compiled_select() (未查詢)或 last_query() (已查詢)去查看字串輸出是否正確:

  $q= $this->db->select('uid')->from('user')->where('uid >',1)->or_where('state',2)->or_where('item',3); 

  //印出sql字串,本身這行並不會執行
  print $q->get_compiled_select();

  * 使用get_compiled_select 要注意不能先使用 get 方法,否則會錯誤

  //如果已經有執行過查詢,則印出最後執行的sql字串
  print $this->db->last_query();

  * 使用 last_query 要注意在 config/database.php 中要把  'save_queries' 設為 true,才會有作用:
        'save_queries' => true

like[3]

$this->db->like('body', 'match'); // `body` LIKE '%match%

$this->db->like('title', 'match', 'before'); //  WHERE `title` LIKE '%match' ESCAPE '!'

$this->db->like('title', 'match', 'after'); // WHERE `title` LIKE 'match%' ESCAPE '!'

$this->db->like('title', 'match', 'both'); // WHERE `title` LIKE '%match%' ESCAPE '!'

 

 Insert 

法一,使用sql字串|

  $sql = "insert into role(rolename, item)  values ( 'role1', 1)";
  $ok= $this->db->simple_query($sql);  //成功回傳 true,否則 false

法二,使用陣列(推薦)

  $ok= $this->db->insert('role', array('rolename'=>$rolename, 'item'=>1));  //成功回傳 true,否則 false

查錯或輔助

1. 查看新增資料的主鍵編號
   $lastid= $this->db->insert_id();

2. 查看影響列數
   $affn= $this->db->affected_rows();

3. 查看所下的指令字串(推薦)
   $str = $this->db->last_query();
  * 使用 last_query 要注意在 config/database.php 中要把  'save_queries' 設為 true,才會有作用:
        'save_queries' => true

4. 使用 insert_string,這個指令並不會真正的執行insert,只是產生插入的SQL字串。

  $data = array('name' => $name, 'email' => $email, 'url' => $url);
  $str = $this->db->insert_string('table_name', $data);

 

Update

法一,使用sql字串|

  $sql = "updaet role set rolename='role1', item=1  where sn =3";
  $ok= $this->db->simple_query($sql);  //成功回傳 true,否則 false

法二,使用陣列(推薦)

  $row= array(''rolename'=>$rolename, 'item'=>1);
  $ok= $this->db->where('sn', 3)->update( $row); //成功回傳 true,否則 false

查錯或輔助

1. 查看影響列數
   $affn= $this->db->affected_rows();

2. 查看所下的指令字串(推薦)
   $str = $this->db->last_query();
  * 使用 last_query 要注意在 config/database.php 中要把  'save_queries' 設為 true,才會有作用:
        'save_queries' => true

3. 使用 update_string,這個指令並不會真正的執行update,只是產生插入的SQL字串
  $data = array('name' => $name, 'email' => $email, 'url' => $url);
  $where = "author_id = 1 AND status = 'active'";
  $str = $this->db->update_string('table_name', $data, $where);

自己數值加減1的寫法

 content點擊數加1 ,在set 的部分第三個參數要設為 false
  $this->db->set('clicked', '`clicked`+1', false)->where('nID',20)->limit(1)->update('content');

 

Delete

使用delete函數

單筆刪除資料

$this->db->where('id', $id)->delete('mytable');

$this->db->delete('mytable', array('id' => 1));

 

刪除多表格資料

CI3可以快速刪除多個表格相同條件的資料,只要把表格名放到陣列即可:

$tables = array('table1', 'table2', 'table3');

$this->db->where('id', '5')->delete($tables);

 

清空表格

軟性作法,相當於 delete * from mytable;

$this->db->empty_table('mytable');

硬性作法,也會清除表格的計數器等資訊

$this->db->truncate('mytable');

 

刪除的筆數

$this->db->affected_rows();

參考資料

[1] CI3 DATABASE官網文件 Query Helper Methods

[2] Delete https://codeigniter.org.tw/userguide3/database/query_builder.html

[3] https://codeigniter.jp/user_guide/3/database/query_builder.html

你可能感興趣的文章

[CodeIgniter 3] 資料庫的使用方法整理1/2 --Select的使用 [CodeIgniter 3] 資料庫的使用方法整理:Select的使用

[phpmyadmin] 設定預設語言(Language) phpmyadmin預設進來是會選擇你瀏覽器預設的語系,改成正體中文

作業上傳程式 提供學生作業上傳的程式

使用strcmp來判斷日期是否介於某日期之間 要比較現在日期是否在兩個日期之間,使用字串比對的方法

Smarty安裝 smarty 是著名的樣版引擎,非常的好用,用多了突然發現拿掉smarty反而不會寫php了,以下是安裝過程..

[CodeIgniter 3] COOKIE的使用 PHP CodeIgniter 3 中COOKIE的使用超簡單

[PHP] 檢查IP是否在某個網段內 mtachcidr 要檢查IP是否在某個網段內,要寫幾行?10行?5行? 不用,只要2行。以下是我寫的 code /** * matchCI

[phpmyadmin] 錯誤:您應升級到 MySQL 5.5.0 或更新版本 使用phpmyadmin4出現錯誤:您應升級到 MySQL 5.5.0 或更新版本的解決方式

[PHP] 字串拆解函數substr 奇異的錯誤(札記) 偶然發現一個 substr函數拆解上的怪異之處

[PHP] CodeIgniter 3+pure+smarty安裝及環境設置2/2 PHP framework CodeIgniter 3+ pure CSS +smarty Template Engine的整合#2

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[jQuery] 利用load()來達成ajax的寫法 jQuery中利用load()來達成ajax的寫法,也有人稱他是假的ajax,作法就是..

[HP DL380G7] 生效啟動第3,4片網卡/開啟或關閉內建的網卡 HP DL380G7 預設第3,4片網卡裝完系統後找不到,難道是壞了?要怎麼辦?

[bc] linux 的計算機 bc 設定小數位數、計算π、次方根 linux 的計算機 bc 設定小數位數、計算π、次方根

[JAVA] JWS, JWT, JWE, JOSE是什麼? [JAVA] JWS, JWT, JWE, JOSE是什麼?非常的複雜,儘量來搞清楚..

最值得學的電腦技能 什麼是最值得學的電腦技能?程式設計?美工繪圖?系統網路?還是…? 都不是!個人覺得一個最值得學的電腦技能就