抽離CodeIgniter的數據庫訪問類!

點擊查看原文章

好吧,因爲組織需要,最近又開始轉戰php了,業務邏輯都還好說,主要是老大要求在數據訪問層上加上登錄態驗證。
其實這種要求也是合理的,互聯網服務要求上層保護下層,但下層不能完全相信上層。但是問題也就來了,有如下兩種方案:

1.寫一個mysql proxy server,用來將調用方發來的請求拼裝,然後返回給調用側。這樣做的主要難度在於:

  • a)SQL語句的拼裝及序列化
  • b)數據集序列化,雖然有不少這方面的產品,但是終究還是太過複雜,而且沒有時間折騰

果斷放棄。
2.封裝一層mysql的api,調用方直接在本地調用即可。這樣的話,只需要考慮SQL語句的拼裝即可。現在就有很多選擇啦,

  • a)使用類似django裏面Model的模型類
  • b)使用ci中的Active Record

雖然說Model的方式,對數據層的屏蔽較好,但是小組成員普遍認爲這種方式過重,輕量的一點的話,最終還是選擇了CodeIgniter中的AR。
OK,那麼現在,考驗ci模塊拆分的好不好的時候到啦!
具體中間的種種辛苦就不說啦,直說我最終的實現把,拷貝system\database到一個單獨的目錄,x:/php/ 。
創建一個文件myconfig.php:

  1. <?php 
  2. define('BASEPATH', dirname(__FILE__).'/'); 
  3. define('EXT''.php'); 
  4. require_once(BASEPATH . 'database/DB' . EXT); 
  5.   
  6. function &instantiate_class(&$class_object
  7.     return $class_object
  8.   
  9. function log_message($level = 'error'$message$php_error = FALSE) 
  10.     echo($message); 
  11. function MYDB() 
  12.     $params = array
  13.         'dbdriver'  => 'mysql'
  14.         'hostname'  => 'localhost'
  15.         'username'  => 'root'
  16.         'password'  => ''
  17.         'database'  => 'dante'
  18.         'pconnect'  => TRUE, 
  19.         'db_debug'  => FALSE, 
  20.         'cache_on'  => FALSE, 
  21.         'char_set'  => 'utf-8'
  22.         'dbcollat'  => 'utf8_general_ci'
  23.     ); 
  24.     $db = DB($params,TRUE);     
  25.     return $db
  26. ?> 

創建一個測試文件test.php:

 

  1. <?php 
  2. require_once('myconfig.php'); 
  3. $db = MYDB(); 
  4. $db->select('ID,user_login,user_email'); 
  5. $query = $db->get('wp_users'); 
  6. echo "\n"
  7. foreach ($query->result() as $row
  8.     print $row->ID . "\n"
  9.     print $row->user_login . "\n"
  10.     print $row->user_email . "\n"
  11. ?> 

輸入結果如下:


  1. Database Driver Class Initialized 
  2. admin 
  3. [email protected] 

OK啦~~~ 這樣我們如果要在數據訪問前需要做權限校驗的話,只需要在MYDB函數中做判斷即可。
另外,不得不說ci模塊拆分的確實不錯,instantiate_class是來自於它的system\codeigniter\Common.php。 log_message我給重寫了一下,因爲對於每個調用者來說,希望寫log的方式是不一樣的。(比如我這次就直接打印在了屏幕上。。。。),最近正好 在看設計模式,這種方式也是符合模版方法模式的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章