Kết Nối Database Động Với PHP, Dynamic Database Connection!

Hôm nay mình cùng trở lai với PHP nhé. Chắc hẳn chúng ta đều đã biết hầu hết các hệ thống/ứng dụng đều sử dụng ít nhất 1 hệ quản trị Cơ sở dữ liệu để lưu trữ dữ liệu cho ứng dụng của mình. Thông thường các hệ thống đó có thể sử dụng một hoặc nhiều Database. Tuy nhiên phần lớn chúng đều được khai báo cố định trước trong các file config. Một ngày đẹp trời, chúng ta cần xây dựng một hệ thống mà cần quản lý, kết nối tới nhiều Database khác nhau nhưng lại không được khai báo và xác đinh trước. Vậy chúng ta sẽ xử lý ra sao? Bài viết hôm nay mình sẽ chia sẻ phương án giải quyết cho việc kết nối động tới Database (dynamic database connection). Cụ thể mình sẽ minh họa đối với PHP CodeIgniter.

dynamic-database
Dynamic Database Connection

Giải pháp

Các bước thực hiện như sau:

  • Tạo helper xử lý việc trả về cấu hình chuẩn để kết nối Database
  • Load dữ liệu thông tin Database trước khi cần kết nối
  • Sử dụng helper để render dữ liệu config với Database trên
  • Load model với config Database mới

Tạo Helper

Tạo 1 file helper, đặt tên là db_dinamic_helper.php trong folder application/helpers

helper_demo
Code Helper demo

Sau khi tạo helper chúng ta cùng thêm function để render cấu trúc config PHP. Trên hình là code mình sử dụng với CodeIgniter. Một điệu đặc biệt quan trọng là thêm helper trên vào Autoload.

Load thông tin kết nối Database

Ở bước này, các bạn load thông tin kết nối của Database bạn đang muốn kết nối tới. Dữ liệu này có thể nhập liệu từ trên hệ thống, hoặc đi theo thông tin của khách hàng, hoặc đến từ bất kỳ nguồn nào. Miễn sao đảm bảo đủ các thông tin bắt buộc sau:

  • Host: IP Database server / localhost
  • Username+Password: Tài khoản có quyền truy cập Database
  • Database Name: Tên của Database
  • DB Driver: Phương thức kết nối tới Database (mysqli, sqlsrv….)

Kết nối model với Database mới

Sau khi đã có thông tin config để kết nối với Database mới, việc tiếp theo cần làm là sử dụng helper để render ra dữ liệu config chuẩn của DB sau đó load model với config đó.

Dưới đây là ví dụ: trabajador.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Trabajador extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
        $this->load->driver('cache');
        $this->load->helper(array('form', 'url','otros_helper','fechas_helper','imagen_helper','config_helper','permisos_helper'));
        $this->abbost_hotel = @$this->session->userdata('sess_abbost_hotel_'.substr(base_url(),-8,7));
        if(!@$this->abbost_hotel->usuario_id) redirect ('acceso');

            $nombre_bd = $this->abbost_hotel->nombre_bd;
            $config_app = switch_db_dinamico($nombre_bd);
            $this->load->model(array('model_producto','model_trabajadores','model_habitacion','model_tareas','model_notif'));
            $this->model_trabajadores->app_db = $this->load->database($config_app,TRUE);
            $this->model_habitacion->app_db = $this->load->database($config_app,TRUE);
            $this->model_producto->app_db = $this->load->database($config_app,TRUE);
            $this->model_tareas->app_db = $this->load->database($config_app,TRUE);
            $this->model_notif->app_db = $this->load->database($config_app,TRUE);
         date_default_timezone_set("America/Lima");
        //if(!@$this->user) redirect ('inicio/login');
        //$permisos = cargar_permisos_del_usuario($this->user->idusuario);
    }
    public function index()
    {
        //...
    }

Và ở model cần chỉnh sửa như sau: Chúng ta cần khai báo $app_db và tất cả các hoạt động truy vấn dữ liệu tới Database đều sử dụng qua biến này.

<?php
class Model_tareas extends CI_Model {
    public $app_db;
    public function __construct()
    {
        parent::__construct();
    }
    public function m_cargar_tareas_activas()
    {
        $estado = 1;
        $this->app_db->select("tarea_id, prioridad");
        $this->app_db->from('tarea');
        $query = $this->app_db->get();
        return $query->result_array();
    }
}

Như vậy ở controller, sau khi load được config của Database cần kết nối, chúng ta sẽ load model theo config đó và thao tác dữ liệu với Database mới đó. Hệ thống lúc này có thể kết nối linh động tới nhiều Database mà không cần khai báo trước. Mọi người có góp ý thì cùng trao đổi dưới comment nhé.

kinhnghiemlaptrinh.com

Trả lời

Email của bạn sẽ không được hiển thị công khai.