Other How to read and write into the database - Cách đọc và ghi vào cơ sở dữ liệu (với một trang)

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
17,142
Được Like
12,745
How to read and write into the database - Cách đọc và ghi vào cơ sở dữ liệu (với một trang) 1.0

Bước 1 - Thiết lập các bảng

Để bắt đầu, chúng ta phải biết các lĩnh vực mà chúng ta sử dụng để đọc/viết là gì trong cơ sở dữ liệu. Đó là, các lĩnh vực mà sẽ lưu trữ các thông tin chúng ta muốn đọc sau.

Tôi sẽ bắt đầu thiết lập tên bảng, lĩnh vực và loại:

Table:
xf_simple_text

Fields:

simple_id -> Lĩnh vực tự động tăng mỗi hàng.
simple_text -> Đây là lĩnh vực mà sẽ chứa một đoạn văn bản của bạn. Type: varchar; Lenght: 200;
simple_date -> Đây là ngày mà chúng ta viết văn bản. Type: INT; Lenght: 10;

- Bất cứ khi nào bạn cần phải tạo một bảng trong cơ sở dữ liệu, theo một khuôn mẫu. Đặt tên add-on của bạn cùng với các tiền tố của các bảng khác trong XenForo của bạn.
- Chính xác hơn bạn xác định các loại của từng lĩnh vực trong bảng của bạn, hiệu suất tốt hơn.

Bước 2 - Tạo bộ cài đặt

Khi tạo một add-on cho XenForo bạn nên làm theo một cấu trúc chuẩn, cả trong việc tạo ra các thư mục như cách đặt tên của các class.

Tất cả các file trong add-on cần được tạo ra trong thư mục forumroot/library/. Thư mục này cũng sẽ chứa tất cả các tiện ích khác mà bạn đã cài đặt trên diễn đàn của bạn.

Trước hết, chúng ta hãy tạo một thư mục cho add-on. "Nhưng ở đâu?" Bạn phải tự hỏi. Bên trong thư mục forumroot/library/. Vì vậy, bắt đầu bằng cách tạo ra một thư mục với tên của add-on: "Simple".

Đây là bộ khung của thư mục (lưu ý rằng tôi chỉ liệt kê các thư mục XenForo để tham khảo):

forumroot
--library
----SimpleText -> our new folder!
----XenForo

Bây giờ chúng ta đã tạo ra thư mục, chúng ta phải tạo ra một tập tin gọi là Installer.php sẽ chứa hai phương pháp: install() tạo ra bảng và uninstall() sẽ xóa bảng (khi bạn gỡ bỏ cài đặt).

forumroot
--library
---SimpleText
-----Installer.php -> Tập tin mới!
---XenForo

Chúng ta có thư mục đầu tiên và tập tin trong PHP. Nhưng chúng ta làm gì với nó? Xem các bước tiếp theo.

Bước 3 - Installer.php

Installer.php trong file này sẽ có hai chức năng: install()uninstall(). Tương ứng, cả hai sẽ được sử dụng để cài đặt và gỡ bỏ cài đặt add-on.
Vì vậy, mở file Installer.php và chúng ta sẽ bắt đầu phát triển bằng cách tạo ra một class:
Mã:
<?php
class SimpleText_Installer
{
}
?>

Lưu ý rằng chúng ta sử dụng một mô hình chúng ta nên làm theo: SimpleText_Installer. Điều đó nói điều gì đó với bạn?

Vâng! Hãy xem:

SimpleText -> Tên của thư mục.
Installer -> Tên của tập tin.

Do đó, chúng ta sẽ luôn luôn làm theo mô hình này. Nếu chúng ta có một cấu trúc như thế này:

library
---SimpleText -> folder
----Installer -> folder
-----Installer.php -> file
---XenForo

Tên class của tập tin Installer.php sẽ như thếnào?

Trả lời: SimpleText_Installer_Installer

SimpleText -> Folder!
Installer -> Folder!
Installer -> File!

Vì vậy, tôi luôn luôn làm theo cấu trúc này. Trong tập tin tiếp theo, bạn sẽ được sử dụng nhiều đến nó.

Trở lại vào tập tin cài đặt, bây giờ chúng ta sẽ tạo ra một biến sẽ chứa các định nghĩa của bảng, cùng với các lĩnh vực bạn muốn tạo và các loại. Đối với điều này, chúng ta tạo ra một biến gọi là "$table". Biến này chứa một SQL CREATE lệnh ai sẽ chịu trách nhiệm cho việc tạo bảng trong cơ sở dữ liệu.
Mã:
protected static $table = array(
    'createQuery' => 'CREATE TABLE IF NOT EXISTS `xf_simple_text` (            
                `simple_id` INT( 10 ) NOT **** AUTO_INCREMENT,
                `simple_text` VARCHAR ( 200 ),
                `simple_date` INT( 10 ) UNSIGNED,
                PRIMARY KEY (`simple_id`)
                )
            ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;',
    'dropQuery' => 'DROP TABLE IF EXISTS `xf_simple_text`'
);

Bạn có thể nhận thấy rằng biến $table thực sự là một mảng với hai khóa:

createQuery -> lệnh SQL để tạo bảng.
dropQuery -> lệnh SQL để xóa bảng.

Hãy phân tích các lệnh khóa createQuery SQL:

CREATE TABLE IF NOT EXISTS - Tạo bảng nếu nó không tồn tại. Nếu nó tồn tại, bỏ qua bước này và tiếp tục tiếp theo (nếu có). Để biết chi tiết về điều kiện IF NOT EXISTS, bấm vào đây.

xf_simple_text - Đây là tên của bảng, tôi muốn tạo ra cơ sở dữ liệu.

`simple_id` INT ( 10 ) - Lĩnh vực tự động tăng của bảng này.

`simple_text` VARCHAR ( 200 ) - Đầu tiên chúng ta sẽ tạo các lĩnh vực được gọi là 'simple_text'. Các lĩnh vực mà sẽ lưu trữ các văn bản chúng ta đã viết và sau đó được lưu trong bảng. Loại nó là VARCHAR và chiều dài là 200.

`simple_date` INT UNSIGNED ( 10 ) - Lĩnh vực này sẽ lưu trữ ngày bạn gửi văn bản đến các cơ sở dữ liệu. Sẽ được thay đổi mỗi khi bạn viết một văn bản mới và lưu bảng. Đó là một kiểu INT UNSIGNED chiều dài là 10.

ENGINE = InnoDB - Chúng ta sẽ sử dụng một bảng InnoDB. Thông tin chi tiết tại đây.

SET utf8 COLLATE utf8_general_ci - Thông tin chi tiết tại đây.

Và khóa dropQuery có lệnh sau đây:

DROP TABLE IF EXISTS `xf_simple_text` - Điều này sẽ xóa các bảng cơ sở dữ liệu, nếu nó tồn tại. Nếu không, không có gì được thực hiện. Thông tin thêm về các DROP TABLE tại đây.

Tất cả mọi thứ nhìn thấy ở đây? Ok, bây giờ chúng ta có hai câu hỏi cho việc tạo và xóa bảng, chúng ta tạo ra hai chức năng mà sẽ chạy hai câu lệnh SQL.

install()

Đây sẽ là phương pháp để cài đặt add-on. Đoạn mã sau đây:
Mã:
/**
* This is the function to create a table in the database so our addon will work.
*
* @since Version 1.0.0
* @version 1.0.0
* @author Fuhrmann
*/
public static function install()
{
    $db = XenForo_Application::get('db');
    $db->query(self::$table['createQuery']);
}

Giải trình:
Mã:
$db = XenForo_Application::get('db');

Chúng ta đã lấy đối tượng từ cơ sở dữ liệu bằng cách đặt nó trong biến $db do vậy chúng ta có thể sử dụng nó và gọi truy vấn để tạo bảng. Chúng ta đang sử dụng class XenForo_Application và phương pháp get().
Mã:
$db->query(self::$table['createQuery']);

Chúng ta sử dụng đối tượng db, đó là cơ sở dữ liệu, và chạy truy vấn 'createQuery' mà là trong mảng $table, được xác định trước đó.

uninstall()

Đây là phương pháp để gỡ bỏ add-on trên của bạn. Đoạn mã sau đây:
Mã:
/**
* This is the function to DELETE the table of our addon in the database.
*
* @since Version 1.0.0
* @version 1.0.0
* @author Fuhrmann
*/
public static function uninstall()
{
    $db = XenForo_Application::get('db');
    $db->query(self::$table['dropQuery']);
}

Như bạn có thể thấy, hai dòng mã gần như cùng một phương pháp install().
Và đây là mã cuối cùng:
Mã:
<?php
class SimpleText_Installer
{
    protected static $table = array(
        'createQuery' => 'CREATE TABLE IF NOT EXISTS `xf_simple_text` (            
                    `simple_id` INT( 10 ) NOT **** AUTO_INCREMENT,
                    `simple_text` VARCHAR ( 200 ),
                    `simple_date` INT( 10 ) UNSIGNED ,
                    PRIMARY KEY (`simple_id`)
                    )
                ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;',
        'dropQuery' => 'DROP TABLE IF EXISTS `xf_simple_text`'
    );
    /**
    * This is the function to create a table in the database so our addon will work.
    *
    * @since Version 1.0.0
    * @version 1.0.0
    * @author Fuhrmann
    */
    public static function install()
    {
        $db = XenForo_Application::get('db');
        $db->query(self::$table['createQuery']);
    }
    /**
    * This is the function to DELETE the table of our addon in the database.
    *
    * @since Version 1.0.0
    * @version 1.0.0
    * @author Fuhrmann
    */
    public static function uninstall()
    {
        $db = XenForo_Application::get('db');
        $db->query(self::$table['dropQuery']);
    }
}
?>

Nếu bạn không nhớ, class XenForo theo mô hình tên của thư mục và tập tin. Do đó, class XenForo_Application[/ i] là trong thư mục đó?

Thử đoán các thư mục và tập tin của các class sau:

Class-> XenForo_ControllerHelper_CacheRebuild
Folders-> ??
File-> ??


Class-> XenForo_DataWriter_Discussion_Thread
Folders-> ??
File-> ??


Class-> XenForo_Search_DataHandler_ProfilePost
Folders-> ??
File-> ??

Bước 4 - Model

Model chịu trách nhiệm cho việc đọc dữ liệu từ bảng. Một lời giải thích ngắn gọn:
Model (XenForo_Model) - Được sử dụng để giao tiếp với cơ sở dữ liệu, bạn sẽ có được dữ liệu trong đó, sử dụng nó để truy vấn cơ sở dữ liệu, và lấy dữ liệu ra khỏi đó. Trong XenForo này chỉ đơn giản là cung cấp helper phương pháp cho hành động chung. Ví dụ .: Khi chúng ta đang truy cập một chủ đề trong diễn đàn của chúng ta, model có trách nhiệm đưa các nội dung của chủ đề, bằng cách truy vấn cơ sở dữ liệu.

Đầu tiên, tạo một thư mục mới và một tập tin bên trong thư mục của addon:

forumroot
--library
---SimpleText
-----Model - new!
--------SimpleText.php - new!
-----Installer.php
---XenForo

Mở tập tin Model/SimpleText.php và hãy đặt tên cho class:
Mã:
<?php
class SimpleText_Model_SimpleText extends XenForo_Model
{
}
?>

Như bạn có thể thấy chúng ta làm theo cấu trúc thư mục (SimpleText/Model/SimpleText.php) để đặt tên cho class của chúng ta. Vì đây là một model, chúng ta mở rộng đến class XenForo_Model!
Với file được mở, chúng ta sẽ tạo ra một phương pháp để có được một hàng trong cơ sở dữ liệu:
Mã:
/**
* Get only one row using the data passed.
*/
public function getSimpleTextById($simpleId)
{
    return $this->_getDb()->fetchRow('
        SELECT * FROM xf_simple_text WHERE simple_id = ?', $simpleId);
}

Với truy vấn này, chúng ta sẽ chọn tất cả các lĩnh vực từ bảng WHERE của chúng ta lĩnh vực simple_id là bằng giá trị được truyền cho phương pháp này.
Bây giờ, phương pháp tiếp theo sẽ nhận được tất cả các hàng.
Mã:
/**
* Get all the rows of our table.
*
*/
public function getAllSimpleText()
{
    return $this->fetchAllKeyed('SELECT * FROM xf_simple_text ORDER BY simple_date DESC', 'simple_id');
}

Mã cuối cùng:
Mã:
<?php
class SimpleText_Model_SimpleText extends XenForo_Model
{
    /**
    * Get only one row using the data passed.
    */
    public function getSimpleTextById($simpleId)
    {
        return $this->_getDb()->fetchRow('
            SELECT * FROM xf_simple_text WHERE simple_id = ?', $simpleId);
    }
    /**
    * Get all the rows of our table.
    *
    */
    public function getAllSimpleText()
    {
        return $this->fetchAllKeyed('SELECT * FROM xf_simple_text ORDER BY simple_date DESC', 'simple_id');
    }
}
?>

Lưu file và bây giờ chúng ta hãy đi đến bước khác.


Bước 5 - DataWriter

DataWriter sẽ chịu trách nhiệm ghi dữ liệu của chúng ta vào bảng. Thông thường, khi bạn phát triển một add-on, bạn sẽ cần một DataWriter.

DataWriter là gì?
Mã:
DataWriter (XenForo_DataWriter) - DataWriter tập trung vào viết một đơn vị dữ liệu vào cơ sở dữ liệu, bao gồm cả kiểm tra tất cả các dữ liệu đến các quy tắc ứng dụng (bao gồm cả những thiết lập bởi các chủ sở hữu) và thực hiện cập nhật denormalized khi cần thiết. Writer cũng có thể tương tác với bộ nhớ cache, nếu có yêu cầu.

Vì vậy, hãy tạo một thư mục mới và một tập tin mới (luôn luôn tôn trọng cấu trúc tiêu chuẩn):

forumroot
--library
---SimpleText
-----DataWriter - new!
--------SimpleText.php - new!
-----Model
--------SimpleText.php
-----Installer.php
---XenForo

Mở file SimpleText.php và hãy cung cấp cho tập tin tên class:
Mã:
<?php
class SimpleText_DataWriter_SimpleText extends XenForo_DataWriter
{
}
?>

Bây giờ, chúng ta phải thực hiện một số chức năng sẽ làm cho công việc của DataWriter:
Mã:
protected function _getFields()

Như tên gọi chức năng này có được tất cả các lĩnh vực quy định cho bảng của chúng ta và xác định một số loại. Nếu bạn thêm một số lĩnh vực mới vào bảng, bạn phải chắc chắn rằng bạn sẽ cập nhật tập tin này.
Mã:
/**
* Gets the fields that are defined for the table. See parent for explanation.
*
* @return array
*/
protected function _getFields() {
    return array(
        'xf_simple_text' => array(
            'simple_id'    => array(
                'type' => self::TYPE_UINT,
                'autoIncrement' => true
            ),
            'simple_text'    => array(
                'type' => self::TYPE_STRING, 'required' => true
            ),
            'simple_date'    => array(
                'type'            => self::TYPE_UINT,
                'required'        => false,
                'default'        => XenForo_Application:$time
            ),
        )
    );
}

----------------- // -----------------

Mã:
protected function _getExistingData($data)

"Thiết lập các dữ liệu hiện có thực hiện các dữ liệu đã được thông qua." Vì vậy, khi chúng ta sử dụng một DataWriter chúng ta có thể cập nhật nhiều lĩnh vực hơn, thay vì chỉ cần chèn một hàng mới. Chức năng này đảm bảo rằng bạn có thể cập nhật một bản ghi đã tồn tại. Lấy nội dung cho các hồ sơ hiện có do vậy chúng ta có thể cập nhật.

Mã:
/**
* Gets the actual existing data out of data that was passed in. See parent for explanation.
*
* @param mixed
*
* @see XenForo_DataWriter::_getExistingData()
*
* @return array|false
*/
protected function _getExistingData($data)
{
    if (!$id = $this->_getExistingPrimaryKey($data, 'simple_id'))
    {
        return false;
    }
    return array('xf_simple_text' => $this->_getSimpleTextModel()->getSimpleTextById($id));
}

Bạn có thể nhận thấy rằng chúng ta có một chức năng mà không được định nghĩa _getSimpleTextModel(). Chúng ta sẽ xác định chúng sau này. Chức năng này sẽ đưa vào Model (bước 3) và gọi getSimpleTextById mà chúng ta đã tạo ra trong bước trước.

----------------- // -----------------

Mã:
protected function _getUpdateCondition($tableName)

Nếu bạn muốn cập nhật một hàng, bạn phải có một điều kiện cập nhật.
Mã:
/**
* Gets SQL condition to update the existing record.
*
* @see XenForo_DataWriter::_getUpdateCondition()
*
* @return string
*/
protected function _getUpdateCondition($tableName)
{
    return 'simple_id = ' . $this->_db->quote($this->getExisting('simple_id'));
}

----------------- // -----------------

Và cuối cùng, phương pháp để ra khỏi Model, vì vậy chúng ta có thể sử dụng nó bên DataWriter này:
Mã:
/**
* Get the simple text model.
*
* @return SimpleText_Model_SimpleText
*/
protected function _getSimpleTextModel()
{
    return $this->getModelFromCache ( 'SimpleText_Model_SimpleText' );
}

Làm xong! DataWriter là sẵn sàng:
Mã:
<?php
class SimpleText_DataWriter_SimpleText extends XenForo_DataWriter
{
    /**
    * Gets the fields that are defined for the table. See parent for explanation.
    *
    * @return array
    */
    protected function _getFields() {
        return array(
            'xf_simple_text' => array(
                'simple_id'    => array(
                    'type' => self::TYPE_UINT,
                    'autoIncrement' => true
                ),
                'simple_text'    => array(
                    'type' => self::TYPE_STRING, 'required' => true
                ),
                'simple_date'    => array(
                    'type'            => self::TYPE_UINT,
                    'required'        => false,
                    'default'        => XenForo_Application::$time
                ),
            )
        );
    }
    /**
    * Gets the actual existing data out of data that was passed in. See parent for explanation.
    *
    * @param mixed
    *
      * @see XenForo_DataWriter::_getExistingData()
      *
      * @return array|false
    */
    protected function _getExistingData($data)
    {
        if (!$id = $this->_getExistingPrimaryKey($data, 'simple_id'))
        {
            return false;
        }
    
        return array('xf_simple_text' => $this->_getSimpleTextModel()->getSimpleTextById($id));
    }
    /**
    * Gets SQL condition to update the existing record.
    *
    * @see XenForo_DataWriter::_getUpdateCondition()
    *
    * @return string
    */
    protected function _getUpdateCondition($tableName)
    {
        return 'simple_id = ' . $this->_db->quote($this->getExisting('simple_id'));
    }
    
    
    /**
    * Get the simple text model.
    *
    * @return SimpleText_Model_SimpleText
    */
    protected function _getSimpleTextModel()
    {
        return $this->getModelFromCache ( 'SimpleText_Model_SimpleText' );
    }
}
?>

Chúc các bạn thành công.


Nguồn: xenforo.com​
 

Đính kèm

  • Update.txt
    91 bytes · Lượt xem: 0

Top Bottom