How to switch dynamic DATABASE in Codeigniter?
ตัวอย่างการโหลดค่า config ของฐานข้อมูลเดิม เพื่อนำมาเชื่อมต่อใหม่ด้วยชื่อฐานข้อมูลใหม่ที่ต้องการ$this->config->load("new_database");ผลลัพธ์ที่ได้ จะเหมือนกับค่าใน application/config/database.php
$db_config = $this->config->item('new_db');
echo '<pre>';
print_r($db_config);
echo '</pre>';
มาดูตัวอย่างการสร้างไฟล์คอนฟิกใหม่สำหรับเรียกใช้ Dynamic Database ใน CodeIgniter
application/config/new_database.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
include(APPPATH. '/config/database.php');
$config['new_db'] = $db['default'];
โค้ดด้านบนนี้จะมีการ include ไฟล์คอนฟิกหลักมา และเซ็ตเข้าไปในตัวแปร $config['new_db']
ในส่วนของเปลี่ยนฐานข้อมูลเราจะแทรกใน __construct() ของไฟล์ Controller
โดยที่คำสั่ง $this->load->database($db_config, TRUE); คือการเชื่อมต่อฐานข้อมูลอีกครั้งด้วยค่าคอนฟิกใหม่ที่โหลดเก็บไว้ใน $db_config และจะเปลี่ยนชื่อฐานข้อมูลทุกครั้งตามค่า SESSION ที่ส่งเข้ามาในตัวแปร $session_new_db<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Dashboard extends MY_Controller {
public function __construct() {
parent::__construct();
$this->config->load("new_database");
$db_config = $this->config->item('new_db');
$session_new_db = $this->session->userdata('session_new_db');
if($session_new_db != ''){
$db_config['database'] = $session_new_db;
$this->db = $this->load->database($db_config, TRUE);
}
}
public function index() {
$tables = $this->db->list_tables();
echo '<pre>';
print_r($tables);
echo '</pre>';
}
}
// ------ END Controller Class ------
ผลลัพธ์ที่ได้เมื่อสั่งแสดงรายชื่อตารางทั้งหมดของ Database
มาดูการโหลดคอนฟิกอื่นๆ มาใช้กันบ้าง กรณีไม่ได้สร้างคอนฟิกที่เป็นอาร์เรย์หลายมิติแบบ [new_db][xxx]
$prev_config = $this->config->config;
$this->config->load("pagination");
$config = $this->config->config;
echo '<pre>';
print_r($config );
echo '</pre>';
สังเกตว่าผลลัพธ์จะได้ค่า config รวมกันทั้งหมด
ดังนั้นเราจะต้องทำการคัดค่าเดิมออกไป เอาเฉพาะค่าคอนฟิกใหม่
$result = array_diff_key($config, $prev_config);
echo '<pre>';
print_r($result);
echo '</pre>';
จะได้ผลลัพธ์ที่คัดค่าคอนฟิกเดิมออกไปแล้วดังนี้
สรุป
ถ้าจะสร้างไฟล์ config ให้สร้างเป็นอาร์เรย์หลายมิติ เพื่อเรียกใช้จะได้ง่ายต่อการ load แบบวิธีเชื่อมต่อฐานข้อมูลหลายตัว ดังที่ได้แนะนำไว้
$this->config->load("your_config_file");
$db_config = $this->config->item('your_config_array');
:: ฟังก์ชั่นที่เกี่ยวข้อง ::
คัดเฉพาะอาร์เรย์ที่ไม่ซ้ำกัน (ต้องการเฉพาะ Config ค่าใหม่ที่โหลดเข้ามาเท่านั้น)
http://php.net/manual/en/function.array-diff-key.php
วิธีโหลด config ของ CodeIgniter มาใช้งาน
https://www.codeigniter.com/userguide3/libraries/config.html
แสดงรายชื่อตารางทั้งหมดด้วยฟังก์ชั่น list_tables()
https://www.codeigniter.com/user_guide/database/metadata.html
วิธี include ไฟล์ config มาใช้งาน
https://www.sitepoint.com/community/t/basepath-apppath/3613/4
ความคิดเห็น
แสดงความคิดเห็น