14 Feb
Posted by: ชิตพงษ์ วุทธานันท์ in: Codeigniter, PHP
ไหนๆ ก็ทดลองเล่น Codeigniter 1.7.1 แล้ว ก็ลองจับ ADOdb มาใช้ซะเลย ไปเจอข้อมูลใน jQueryTips by Tee++ ดูแล้วน่าจะ work แต่ลองทำตามแล้วใช้ไม่ได้
รวมไปถึงมีข้อจำกัดว่า ถ้าผมจะใช้หลาย Database ก็จะเจอปัญหา เพราะของคุณ Tee++ จะระบุไปเลยว่าอ่านจาก $active_group ซึ่ง มันจะใช้ได้ตัวเดียวเท่านั้นคือ Database ตัวล่างสุดที่เราทำการ config ไว้
เลยลองไปค้นๆ ดูอีกที ที่ narisa.com ตัวนี้ก็ดีครับ แก้ปัญหาเรื่องจะใช้หลาย Database ได้ เพราะได้ส่ง parameter บอกไปด้วยว่าจะใช้ config group ไหน
ว่าแล้วก็จับเอาสองตัวนี้มาผสมกันเสียเลย ใครจะใช้ก็นำไปใช้ได้เลยนะครับ ทำตามนี้
1. โหลด ADOdb Lib มาก่อน ที่นี่ Download ADBDB Library (ที่ผมทดสอบเป็น ADOdb for php5)
2. คลาย zip ไว้ที่ /application/libraries/ ก็จะได้เป็น /application/libraries/adodb5
3. สร้างไฟล์ชื่อ Adodb.php นำโค้ดด้านล่างมาใส่ แล้วนำไปไว้ใน /application/libraries/
class Adodb {
function Adodb($params=null)
{
// check if adodb already loaded
if (!class_exists(‘ADONewConnection’))
{
require_once(APPPATH.’libraries/adodb5/adodb.inc.php’);
}// database handler’s name, defaults to ‘adodb’
$dbh = (isset($params['name'])) ? $params['name'] : ‘adodb’;// the db settings group from the database.php config
$db_group = (isset($params['group'])) ? $params['group'] : ”;$this->_init_adodb_library($dbh,$db_group);
}function _init_adodb_library($dbh,$db_group)
{
// get database config
include(APPPATH.’config/database.php’);// check which database group settings to use
// default to database setting default
$db_group = (!empty($db_group)) ? $db_group : $active_group;
$cfg = $db[$db_group];// check that driver is set
if (isset($cfg['dbdriver']))
{
$CI->$dbh =& ADONewConnection($cfg['dbdriver']);// set debug
$CI->$dbh->debug = $cfg['db_debug'];if ($cfg['cache_on'] && is_dir(APPPATH.$cfg['cachedir'])){
GLOBAL $ADODB_CACHE_DIR;
$ADODB_CACHE_DIR = APPPATH.$cfg['cachedir'];
}// check for persistent connection
if ($cfg['pconnect']) {
// persistent
$CI->$dbh->PConnect($cfg['hostname'],$cfg['username'],$cfg['password'],$cfg['database']) or die(“can’t do it: ” . $CI->$dbh->ErrorMsg());
} else {
//normal
$CI->$dbh->Connect($cfg['hostname'],$cfg['username'],$cfg['password'],$cfg['database']) or die(“can’t do it: ” . $CI->$dbh->ErrorMsg());
}if ($cfg['char_set'] && $cfg['dbcollat']) {
$CI->$dbh->Execute(‘SET character_set_results=’.$cfg['char_set']);
$CI->$dbh->Execute(‘SET collation_connection=’.$cfg['dbcollat']);
$CI->$dbh->Execute(‘SET NAMES ‘.$cfg['char_set']);
}
return true;
} else {
die(“database settings not set”);
return false;
}
}
}
?>
วิธีการใช้งานก็ลองตามนี้เลยครับ (เอาไว้ทดสอบว่าใช้ได้หรือไม่)
$this->load->library('adodb',array('name'=>'db1','group'=>'slave'));
print_r($this->db1);
- db1 คือ ชื่อ object ที่จะใช้งาน
- slave คือ ชื่อ group ของ database ที่เราจะใช้งาน ($active_group ใน config นั่นเอง)
ใครลองแล้วได้ความว่าไง แชร์ประสบการณ์หน่อยนะครับ
————-
เกร็ดเล็กๆ จากการทดสอบ
หากจะใช้ SQLite 3 ให้ทำการคั้ง driver เป็น ‘pdo’
จากนั้นเวลาระบุที่อยู่ไฟล์ ให้ใช้ระบุใน hostname ครับ ไม่ใช่ใน database
เพราะโค้ดมันนะ hostname มานำหน้า และนำ hostname ไปตัดเพื่อหา DNS อีกทีว่าเราใช้ PDO กับอะไร
รวมไปถึง char_set และ dbcollat ตั้งให้เป้น false ทั้งคู่
ดังนั้นเวลาระบุ จะต้องเป็นประมาณนี้ครับ ถึงจะใช้ได้
$active_group = “sqlite_test”;
$active_record = TRUE;
$db['sqlite_term']['hostname'] = “sqlite:/usr/sqlite_file/database.sqlite”;
$db['sqlite_term']['username'] = “”;
$db['sqlite_term']['password'] = “”;
$db['sqlite_term']['database'] = “”;
$db['sqlite_term']['dbdriver'] = “pdo”;
$db['sqlite_term']['dbprefix'] = “”;
$db['sqlite_term']['pconnect'] = FALSE;
$db['sqlite_term']['db_debug'] = TRUE;
$db['sqlite_term']['cache_on'] = FALSE;
$db['sqlite_term']['cachedir'] = “”;
$db['sqlite_term']['char_set'] = FALSE;
$db['sqlite_term']['dbcollat'] = FALSE;
3 Responses
Unknown
20|Jul|2009 1print_r($this->db1); error ครับ
paepod
29|Sep|2009 2Adobe.php หรือว่า Adodb.php ครับ
ชิตพงษ์ วุทธานันท์
05|Oct|2009 3อ๋าา ขอบคุณมากครับๆ แก้แล้วครับๆ Adodb.php
Leave a reply