[CI Day 4] อย่าไปใช้เลย db มัน มา plug adodb กันเองดีกว่า

เอ้ามาเร้ว มาต่อกันๆ ก่อนที่จะขี้เกียจเขียน อิอิ ที่เกริ่นมาว่าอย่าไปใช้เลย ส่วน db ของ CI ไม่ใช่ว่าของเค้าไม่ดีนะครับ แต่ว่าของคนอื่นมันดีกว่า 555+

ก็ adodb ไงครับ สุดยอด lib จัดการเกี่ยวกับ db ที่โลกรู้จักกันมานาน (ว่าไปนั่น) ของเค้าดีจริงๆ ครับ ตัวนี้เล่นเอาลืมคำสั่ง SQL พื้นๆ ไปหมดเลย 555+

วันนี้ผมไม่ขออธิบายถึงการใช้งาน adodb นะครับ เพราะว่า มันมี manual ของมันอยู่แล้ว ไปนั่งทำความเข้าใจที่เวบมัน วันเดียวก็เป็นแล้ว (ยกเว้นเรื่อง active record ไว้เรื่อง -*-) แล้วก็การ plug วันนี้ก็จะไม่เหมือนกับ 2 บทความก่อนหน้านี้ แต่จะเป็นการเอาไปแทนที่ $thid->db ของเดิมเลย โดยจะอาศัยหลักการ pass by references

เอ้าๆ มาเริ่ม plug กันเลยละกัน ง่วงนอนแล้วล่ะ….

ก่อนอื่นต้องไปโหลดตัว lib มันมาก่อน: download [PHP 5]

จากนั้นจับมันยัดเข้าไปใน [CI]/application/libraries/ เหมือนเดิม (ทั้ง folder นั่นล่ะ)

แล้วไปเขียน lib เพื่อ เรียกมันเข้ามาตามแบบนี้…

1. สร้างไฟล์
[CI]/application/libraries/Adodb.php

เขียนโคดตามนี้

  1. <?php
  2. class Adodb {
  3.  
  4.         function __construct()
  5.         {
  6.                 require_once(APPPATH.‘config/database.php’);
  7.  
  8.                 $this->dbConf = $db[$active_group];
  9.  
  10.                 if ($this->dbConf[‘cache_on’] && is_dir(APPPATH.$this->dbConf[‘cachedir’]))
  11.                 {
  12.                         GLOBAL $ADODB_CACHE_DIR;
  13.                         $ADODB_CACHE_DIR = APPPATH.$this->dbConf[‘cachedir’];
  14.                 }
  15.  
  16.                 require_once(dirname(__FILE__).‘/adodb5/adodb.inc.php’);
  17.  
  18.                 $this->obj =& get_instance();
  19.                 $this->obj->db =& NewADOConnection($this->dbConf[‘dbdriver’]);
  20.  
  21.                 if ($this->dbConf[‘db_debug’]) { $this->conn->debug = true; }
  22.  
  23.                 $this->obj->db->Connect(
  24.                         $this->dbConf[‘hostname’],
  25.                         $this->dbConf[‘username’],
  26.                         $this->dbConf[‘password’],
  27.                         $this->dbConf[‘database’]
  28.                 );
  29.  
  30.                 if ($this->dbConf[‘char_set’] && $this->dbConf[‘dbcollat’])
  31.                 {
  32.                         $this->obj->db->Execute(‘SET character_set_results=’.$this->dbConf[‘char_set’]);
  33.                         $this->obj->db->Execute(‘SET collation_connection=’.$this->dbConf[‘dbcollat’]);
  34.                         $this->obj->db->Execute(‘SET NAMES ‘.$this->dbConf[‘char_set’]);
  35.                 }
  36.  
  37.                 return true;
  38.         }
  39.  
  40. }
  41. ?>

เท่านี้ก็สามารถใช้ $this->db->Execute หรือ $this->db->AutoExecute ตาม รูปแบบ ของ adodb ได้แล้ว โดย หัวใจของการ plug librariy แบบนี้มันอยู่ที่ บรรทัดตรงนี้ครับ

  1. $this->obj =& get_instance();
  2. $this->obj->db =& NewADOConnection($this->dbConf[‘dbdriver’]);

คือการ instance ci ขึ้นมา แล้วใช้ =& เพื่อเปลี่ยนค่ที่อยู่หลังจากการทำงานทั้งหมด (อธิยบายยาก หาอ่านเรื่อง php pass by references เอาเองนะ -*-)

เอาล่ะทีนี้มาลองเทสกันเล่นๆ ดูว่ามันทำงานได้แล้วจริงๆ รึเปล่า

ก่อนอื่นอย่าลืมไป config db ที่ [CI]/application/config/database.php ให้เรียบร้อยก่อน

จากนั้นกลับมาที่ controller ทีเราเขียนเทสทุกๆ ที ที่
[CI]/application/controllers/home.php

เขียนตามผมนี่ …

  1. <?php
  2. class Home extends Controller {
  3.  
  4.         function __construct()
  5.         {
  6.                 parent::Controller();
  7.         }
  8.  
  9.         function index()
  10.         {
  11.                 echo "This is my first page.";
  12.         }
  13.  
  14.         function test_adodb()
  15.         {
  16.                 $this->load->library(‘adodb’);
  17.                 print_r($this->db);
  18.         }
  19.  
  20. }
  21. ?>

ถ้าเรารันที่ http://localhost/codeigniter/home/test_adodb แล้วมีค่าออกมาจากคำสั่ง print_r (ไม่ใช่ค่า error นะ) ก็ถือว่าเรา plug ได้เสร็จเรียบร้อยดีแล้วล่ะครับ ที่เหลืออยู่ที่ว่าเราจะศึกษา ประยุกต์ใช้งานมันต่อ ยังไงมากกว่า

เอาล่ะครับ วันนี้ขอจบมันดื้อๆ แบบนี้เลยละกัน สำหรับเรื่อง Zend ที่ผมเคยบอกจะ plug ให้ดูนั้น ผมขอติดไว้เป็นบบทความหลังๆ หน่อยแล้วกันนะครับ เพราะมันติดปัญหาเรื่องที่ว่า ผมยังไม่ได้ปู พื้น CI อะไรให้เลย การจะ plug Zend นั้นมันจะต้องไปเกี่ยวข้อง กับเรื่อง hooks และ การ set include path ไรอีก 2-3 อย่าง ดังนั้น ตั้งแต่คราวหน้าไป ผมจะมา พูดถึง structure ส่วนอื่นๆ ของมันก่อนนะครับ

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

11 Comments »

 
  • developer says:

    ขอบคุณสำหรับบทความดีๆ นะครับ
    ยังไงก็ขอเป็นกำลังใจให้เขียนบทความดีๆ แบบนี้อีกเยอะๆ เลยนะครับ
    ขอบคุณครับ

  • figaro says:

    zend นี่มีดียังไงหรอครับ

  • albek says:

    เวลาทำเว็บไซต์ด้วย CI เสร็จแล้ว

    วิธีอัพโหลดเว็บนี่เราต้องอัพไปหมดเลยใช่ไหมครับ ทั้ง folder CI เลยรึเปล่า

  • tom says:

    ใช่ครับ

  • DominixZ says:

    ดูๆไปแล้วผมดันชอบของ CI ที่ให้มามากกว่าแหะ

  • ball says:

    ผมเซต CI+adodb+smarty ตามที่พี่บอกแล้ว แต่ที่นี้ผมจะ
    select ข้อมูลขึ้นมาแสดงออกเป็นตาราง ไม่ทราบว่าต้องทำไง

    พอจะยกตัวอย่างให้ดูสักนิดได้ไหมครับ ลองประยุกทำดูแล้วแต่ก็ไม่ได้ครับ

    พอดีผมก็ไม่เก่งแต่อยากหัดเขียน รบกวนหน่อยนะครับ

  • เท่าที่ลอง เจอ error บอกว่า ไม่พบตัวแปร ใน database.php เช่น $db และ $activegroup

  • [...] ADOdb มาใช้ซะเลย ไปเจอข้อมูลใน jQueryTips by Tee++ ดูแล้วน่าจะ work [...]

  • EuT^_^ says:

    ว้าวๆ ขอสมักเป็นสาวก CI อีกคนครับ หลงรักมันละ ยิ่งไปเจอ Active Record หุหุ สบายสุดยอด

  • Unknown says:

    ฟิวส์ :
    เท่าที่ลอง เจอ error บอกว่า ไม่พบตัวแปร ใน database.php เช่น $db และ $activegroup

    เป็นเหมือนกันครับ
    ผมเลยประกาศ GLOBAL ก็หายครับ

    แต่ของผม error แบบนี้ด้วยครับ ไม่รู้ว่ามันหาไม่เจอยังไง – -’

    ADONewConnection: Unable to load database driver ”

    Fatal error: Call to a member function Connect() on a non-object in C:\webservice\www\codeigniter\myapp\libraries\adodb.php on line 18

  • NGV says:

    ใช้ include(APPPATH.’config/database’.EXT);
    แทน require_once(APPPATH.’config/database.php’);
    เอา ครับ

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>