Bài 44: Class xử lý database trong hướng đối tượng

Ngày đăng: 2024-04-14 16:00:42

Mục lục:

       1. Cấu trúc các lớp đối tượng xử lý database trong php

       2. Viết thư viện sử lý DB_business (Adapter)

       3. Một số cách sử dụng thư viện

       4. Cấu trúc lớp bussiness xử lý database

       5. Cách sử dụng thư viện xử lý database

 

1. Cấu trúc các lớp đối tượng xử lý database trong php

Vì mục đích của tôi sẽ trình bày các tính chất trong lập trình hướng đối tượng như tính kế thừa, tính trừu tượng ... nên trong bài này chúng ta sẽ xây dựng một mô hình các lớp như sau:

cấu trúc thư viện xử lý database

Trong đó file DB_driver đóng vai trò là adapter, nó sẽ chứa các hàm basic xử lý kết nối, xử lý câu truy vấn sql như insert, update, delete. File DB_business sẽ kế thừa file DB_driver và ngoài các hàm kế thừa có thể sử dụng thì nó sẽ có thêm các hàm bổ trợ như hàm select theo id, delete theo id, update theo id. Còn file demo sẽ chứa những đoạn code hướng dẫn cách sử dụng.

2. Viết thư viện sử lý DB_business (Adapter)

Trong file này chúng ta sẽ xây dựng một số hàm như sau:

 

// Thư Viện Xử Lý Database

class DB_driver

{

    // Biến lưu trữ kết nối

    private $__conn;

     

    // Hàm Kết Nối

    function connect(){

        // do some thing

    }

     

    // Hàm Ngắt Kết Nối

    function dis_connect(){

        // do some thing

    }

     

    // Hàm Insert

    function insert($table, $data){

        // do some thing

    }

     

    // Hàm Update

    function update($table, $data, $where){

        // do some thing

    }

     

    // Hàm delete

    function remove($table, $where){

        // do some thing

    }

     

    // Hàm lấy danh sách

    function get_list($table, $select, $where){

        // do some thing

    }

     

    // Hàm lấy 1 record dùng trong trường hợp lấy chi tiết tin

    function get_row($table, $select, $where){

        // do some thing

    }

}

 

Ý nghĩa của từng hàm mình đã comment rõ ràng rồi, bây giờ chúng ta sẽ xây dựng cho từng hàm nhé.

Hàm connect

 

// Hàm Kết Nối

function connect()

{

    // Nếu chưa kết nối thì thực hiện kết nối

    if (!$this->__conn){

        // Kết nối

        $this->__conn = mysqli_connect('localhost', 'root', 'vertrigo', 'demo') or die ('Lỗi kết nối');

 

        // Xử lý truy vấn UTF8 để tránh lỗi font

        mysqli_query($this->__conn, "SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

    }

}

 

Hàm dis_connect

 

// Hàm Ngắt Kết Nối

function dis_connect(){

    // Nếu đang kết nối thì ngắt

    if ($this->__conn){

        mysqli_close($this->__conn);

    }

}

 

Hàm insert

 

// Hàm Insert

function insert($table, $data)

{

    // Kết nối

    $this->connect();

 

    // Lưu trữ danh sách field

    $field_list = '';

    // Lưu trữ danh sách giá trị tương ứng với field

    $value_list = '';

 

    // Lặp qua data

    foreach ($data as $key => $value){

        $field_list .= ",$key";

        $value_list .= ",'".mysql_escape_string($value)."'";

    }

 

    // Vì sau vòng lặp các biến $field_list và $value_list sẽ thừa một dấu , nên ta sẽ dùng hàm trim để xóa đi

    $sql = 'INSERT INTO '.$table. '('.trim($field_list, ',').') VALUES ('.trim($value_list, ',').')';

 

    return mysqli_query($this->__conn, $sql);

}

 

Hàm update

 

// Hàm Update

function update($table, $data, $where)

{

    // Kết nối

    $this->connect();

    $sql = '';

    // Lặp qua data

    foreach ($data as $key => $value){

        $sql .= "$key = '".mysql_escape_string($value)."',";

    }

 

    // Vì sau vòng lặp biến $sql sẽ thừa một dấu , nên ta sẽ dùng hàm trim để xóa đi

    $sql = 'UPDATE '.$table. ' SET '.trim($sql, ',').' WHERE '.$where;

 

    return mysqli_query($this->__conn, $sql);

}

 

Hàm remove

 

// Hàm delete

function remove($table, $where){

    // Kết nối

    $this->connect();

 

    // Delete

    $sql = "DELETE FROM $table WHERE $where";

    return mysqli_query($this->__conn, $sql);

}

 

Hàm lấy danh sách

 

// Hàm lấy danh sách

function get_list($sql)

{

    // Kết nối

    $this->connect();

 

    $result = mysqli_query($this->__conn, $sql);

 

    if (!$result){

        die ('Câu truy vấn bị sai');

    }

 

    $return = array();

 

    // Lặp qua kết quả để đưa vào mảng

    while ($row = mysqli_fetch_assoc($result)){

        $return[] = $row;

    }

 

    // Xóa kết quả khỏi bộ nhớ

    mysqli_free_result($result);

 

    return $return;

}

 

Hàm lấy 1 row

 

// Hàm lấy 1 record dùng trong trường hợp lấy chi tiết tin

function get_row($sql)

{

    // Kết nối

    $this->connect();

 

    $result = mysqli_query($this->__conn, $sql);

 

    if (!$result){

        die ('Câu truy vấn bị sai');

    }

 

    $row = mysqli_fetch_assoc($result);

 

    // Xóa kết quả khỏi bộ nhớ

    mysqli_free_result($result);

 

    if ($row){

        return $row;

    }

 

    return false;

}

 

Trong mỗi hàm hy vọng các bạn hiểu được ý nghĩa của từng đoạn code :D. Sau đây là nội dung toàn file DB_driver:

Toàn File DB_driver.php

 

// Thư Viện Xử Lý Database

class DB_driver

{

    // Biến lưu trữ kết nối

    private $__conn;

     

    // Hàm Kết Nối

    function connect()

    {

        // Nếu chưa kết nối thì thực hiện kết nối

        if (!$this->__conn){

            // Kết nối

            $this->__conn = mysqli_connect('localhost', 'root', 'vertrigo', 'demo') or die ('Lỗi kết nối');

 

            // Xử lý truy vấn UTF8 để tránh lỗi font

            mysqli_query($this->__conn, "SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

        }

    }

 

    // Hàm Ngắt Kết Nối

    function dis_connect(){

        // Nếu đang kết nối thì ngắt

        if ($this->__conn){

            mysqli_close($this->__conn);

        }

    }

 

    // Hàm Insert

    function insert($table, $data)

    {

        // Kết nối

        $this->connect();

 

        // Lưu trữ danh sách field

        $field_list = '';

        // Lưu trữ danh sách giá trị tương ứng với field

        $value_list = '';

 

        // Lặp qua data

        foreach ($data as $key => $value){

            $field_list .= ",$key";

            $value_list .= ",'".mysql_escape_string($value)."'";

        }

 

        // Vì sau vòng lặp các biến $field_list và $value_list sẽ thừa một dấu , nên ta sẽ dùng hàm trim để xóa đi

        $sql = 'INSERT INTO '.$table. '('.trim($field_list, ',').') VALUES ('.trim($value_list, ',').')';

 

        return mysqli_query($this->__conn, $sql);

    }

 

    // Hàm Update

    function update($table, $data, $where)

    {

        // Kết nối

        $this->connect();

        $sql = '';

        // Lặp qua data

        foreach ($data as $key => $value){

            $sql .= "$key = '".mysql_escape_string($value)."',";

        }

 

        // Vì sau vòng lặp biến $sql sẽ thừa một dấu , nên ta sẽ dùng hàm trim để xóa đi

        $sql = 'UPDATE '.$table. ' SET '.trim($sql, ',').' WHERE '.$where;

 

        return mysqli_query($this->__conn, $sql);

    }

 

    // Hàm delete

    function remove($table, $where){

        // Kết nối

        $this->connect();

         

        // Delete

        $sql = "DELETE FROM $table WHERE $where";

        return mysqli_query($this->__conn, $sql);

    }

 

    // Hàm lấy danh sách

    function get_list($sql)

    {

        // Kết nối

        $this->connect();

         

        $result = mysqli_query($this->__conn, $sql);

 

        if (!$result){

            die ('Câu truy vấn bị sai');

        }

 

        $return = array();

 

        // Lặp qua kết quả để đưa vào mảng

        while ($row = mysqli_fetch_assoc($result)){

            $return[] = $row;

        }

 

        // Xóa kết quả khỏi bộ nhớ

        mysqli_free_result($result);

 

        return $return;

    }

 

    // Hàm lấy 1 record dùng trong trường hợp lấy chi tiết tin

    function get_row($sql)

    {

        // Kết nối

        $this->connect();

         

        $result = mysqli_query($this->__conn, $sql);

 

        if (!$result){

            die ('Câu truy vấn bị sai');

        }

 

        $row = mysqli_fetch_assoc($result);

 

        // Xóa kết quả khỏi bộ nhớ

        mysqli_free_result($result);

 

        if ($row){

            return $row;

        }

 

        return false;

    }

}

 

3. Một số cách sử dụng thư viện

Trước tiên bạn tạo một database tên demo và tạo một table như sau:

 

CREATE TABLE IF NOT EXISTS `customer` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,

  `phone` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Trong file demo.php bạn sẽ thực hiện lần lượt các đoạn code sau và xem trong db sẽ thấy tác dụng của thư viện này cheeky

 

 

require ('DB_driver.php');

 

// Tạo Mới Đối Tượng

$DB = new DB_driver();

 

/// INSERT

$DB->insert('customer', array(

    'name' => 'Nguyễn Văn Cường',

    'phone' => '0979306603'

));

 

// UPDATE

$DB->update('customer', array(

    'name' => 'TheHalfHeart'

), 'id = 1');

 

// DELETE

$DB->remove('customer', 'id = 1');

 

// GET LIST

var_dump($DB->get_list('select * from customer'));

 

// GET 1 ROW

var_dump($DB->get_row('select * from customer where id  = 2'));

 

4. Cấu trúc lớp bussiness xử lý database

Dưới đây là cấu trúc các hàm trong thư viện của chúng ta:

 

require "DB_driver.php";

 

 

class DB_business extends DB_driver

{

    // Tên Table

    protected $_table_name = '';

     

    // Tên Khóa Chính

    protected $_key = '';

     

    // Hàm Khởi Tạo

    function __construct() {

        parent::connect();

    }

     

    // Hàm ngắt kết nối

    function __destruct() {

        parent::dis_connect();

    }

     

    // Hàm xóa theo id

    function delete_by_id($table, $id){

         

    }

    // Hàm thêm mới

    function add_new($data){

    }   

 

    // Hàm cập nhật theo id

    function update_by_id($id){

         

    }

     

    // hàm select theo id

    function select_by_id($select, $id){

         

    }

}

Trong đó các bạn để ý rằng mình có khai báo 2 thuộc tính là $_table_name và $_key tương ứng với tên table và tên field khóa chính. Ngoài ra còn một số điểm như sau:

 

  • Hàm khởi tạo mình sẽ kết nối database luôn
  • Tại hàm hủy sẽ ngưng kết nối database
  • Có thêm ba hàm chính là insert, update, delete theo id

Hàm add_new

 

// Hàm thêm mới

function add_new($data){

    return parent::insert($this->_table_name, $data);

}

 

Hàm delete_by_id

 

// Hàm xóa theo id

function delete_by_id($id){

    return $this->remove($this->_table_name, $this->_key.'='.(int)$id);

}

 

Hàm update_by_id

 

// Hàm cập nhật theo id

function update_by_id($data, $id){

    return $this->update($this->_table_name, $data, $this->_key."=".(int)$id);

}

 

Hàm select_by_id

 

// hàm select theo id

function select_by_id($select, $id){

    $sql = "select $select from ".$this->_table_name." where ".$this->_key." = ".(int)$id;

    return $this->get_row($sql);

}

 

Như vậy thông qua lớp này mà ta đã ứng dụng được các tính chất trong lập trình hướng đối tượng, hàm khởi tạo và hàm hủy, tính kế thừa, ...

Sau đây là nội dung toàn file.

 

require "DB_driver.php";

 

 

class DB_business extends DB_driver

{

    // Tên Table

    protected $_table_name = '';

     

    // Tên Khóa Chính

    protected $_key = '';

     

    // Hàm Khởi Tạo

    function __construct() {

        parent::connect();

    }

     

    // Hàm ngắt kết nối

    function __destruct() {

        parent::dis_connect();

    }

     

    // Hàm thêm mới

    function add_new($data){

        return parent::insert($this->_table_name, $data);

    }

 

    // Hàm xóa theo id

    function delete_by_id($id){

        return $this->remove($this->_table_name, $this->_key.'='.(int)$id);

    }

 

    // Hàm cập nhật theo id

    function update_by_id($data, $id){

        return $this->update($this->_table_name, $data, $this->_key."=".(int)$id);

    }

 

    // hàm select theo id

    function select_by_id($select, $id){

        $sql = "select $select from ".$this->_table_name." where ".$this->_key." = ".(int)$id;

        return $this->get_row($sql);

    }

}

 

5. Cách sử dụng thư viện xử lý database

Vì ở lớp trên đại diện cho mỗi table nên bây giờ chúng ta phải tạo một lớp đại diện chính xác table nào đó  rồi kế thừa từ lớp trên. Trong ví dụ trước mình sử dụng table customer nên trong phần này ta tiếp tục sử dụng database đó luôn nhé. Nội dung của file demo.php như sau:

 

require ('DB_business.php');

 

// Lớp khách hàng

class Customer extends DB_business

{

    function __construct()

    {

        // Khai báo tên bảng

        $this->_table_name = 'customer';

         

        // Khai báo tên field id

        $this->_key = 'id';

         

        // Gọi hàm khởi tạo cha

        parent::__construct();

    }

}

 

// Khởi tạo lớp khách hàng

$customer = new Customer();

 

// Thêm khách hàng

$customer->add_new(array(

    'name' => 'Nguyễn Văn Cường',

    'phone' => '0970 306 603'

));

 

// Xóa khách hàng

$customer->delete_by_id(1);

 

// Update khách hàng

$customer->update_by_id(array(

    'name' => 'thehalfheart'

), 2);

 

// Lấy chi tiết khách hàng

var_dump($customer->select_by_id('*', 2));

 

Qua phần comment chắc hẳn bạn cũng hiểu được bài rồi nên mình sẽ không giải thích gì thêm. Chỉ có một phần lưu ý là trong phần này mình sử dụng rất nhiều các tính chất của OOP nên nếu bạn chưa hiểu bài thì coi lại mấy bài trước nhé.

 

Về bài trước...

                                Bài tiếp theo...

 

 


Tài liệu lập trình PHP

Bài viết trong cùng chuyên mục

Góc games giải trí (chơi trực tiếp trên web) Đăng nhập (chơi có thưởng)



Cờ caro


Butterfly


Lật hình (luyện trí nhớ)

Cờ tướng ONLINE

Xếp hình

Ghép hình

15_PUZZLE

Kill ghosts

Banchim

Planet Defense

Tower game

Bắn bóng

Plapy Bird (NH.Đông)

Vượt chướng ngại vật

Vẽ hình cứu người

Game Phases

Game vui chơi có thưởng

Game bắn cá



0379136392

Thông tin liên hệ: Lê Văn Thuyên - ĐT: 0379136392 ; Gmail: lethuyen0379136392@gmail.com

Comment

 +   Lê Văn Thuyên-0379136392:Cảm ơn quý vị và các bạn đã vào Website của Lê Thuyên! Lê thuyên rất mong nhận được sự góp ý của quý vị và các bạn cho sự phát triển của website này. Xin chân thành cảm ơn!

Trả lời

 *   Dũng Trung-090567448:Lê Văn Thuyên0379136392--->Ok.Anh!

Trả lời

 *   Bé Nguyễn-benguyen@gmail,com:Lê Văn Thuyên0379136392--->Good job!

Trả lời

 +   -:

Trả lời

 +   -:

Trả lời

7406