Câu hỏi Làm thế nào để bạn quản lý các kết nối cơ sở dữ liệu trong php?


Vì vậy, gần đây tôi đã thực sự bắt đầu sử dụng php tích cực, và tôi cần một số hiểu biết về những cách khác nhau để sử dụng các kết nối cơ sở dữ liệu.

Lúc đầu, tôi chỉ sử dụng mysql_connect đơn giản ():

<?php
    $connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
    mysql_select_db(DB_DB, $connection);
?>

Sau một thời gian, tôi đã tạo một lớp cơ sở dữ liệu mà tôi bắt đầu bao gồm và khởi tạo trong mọi tệp - một cái gì đó như thế này:

<?php
class MySQL_DB {

var $connection;

function MySQL_DB(){
    $this->connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
    mysql_select_db(DB_DB, $this->connection);
}

function query($q){
    $res = mysql_query($q, $this->connection) or die(mysql_error());
    return $res;
}
}

$database = New MySQL_DB;
?>

Và đây là những gì tôi đang sử dụng vào thời điểm đó - và nó hoạt động tốt - nhưng luôn có những cách để cải thiện.

Vì vậy, câu hỏi của tôi với bạn là làm thế nào để bạn quản lý các kết nối cơ sở dữ liệu của bạn?

  • Bạn có sử dụng các lớp học không?
  • Các lớp học của bạn chứa gì (chỉ kết nối hoặc thậm chí chức năng?)
  • Bạn khuyên bạn nên thực hành những gì?

14
2017-10-16 22:28


gốc




Các câu trả lời:


Việc sử dụng các lớp là cách để tăng khả năng sử dụng lại tùy chỉnh.

Mang tất cả các triển khai chung vào lớp học. Bạn đang đi đúng hướng.

Trang web này có cách tiếp cận sạch sẽ sau đây.

class connection {
    // Possible Modules are as follows:
    // DBX_MYSQL, DBX_ODBC, DBX_PGSQL, DBX_MSSQL, DBX_FBSQL, DBX_SYBASECT, DBX_OCI8, DBX_SQLITE
    private $module = DBX_MYSQL; 

    private $host = "localhost";
    private $database = "test";
    private $username = "testuser";
    private $password = "testpass";

    private $link;
    private $result;
    public $sql;

    function __construct($database=""){
            if (!empty($database)){ $this->database = $database; }
            $this->link = dbx_connect($this->module,$this->host,$this->database,$this->username,$this->password);
            return $this->link;  // returns false if connection could not be made.
    }

    function query($sql){
            if (!empty($sql)){
                    $this->sql = $sql;
                    $this->result = dbx_query($this->link,$sql,DBX_RESULT_UNBUFFERED);
                    return $this->result;
            }else{
                    return false;
            }
    }

    function fetch($result=""){
            if (empty($result)){ $result = $this->result; }
            return dbx_fetch_row($result);
    }

    function __destruct(){
            dbx_close($this->link);
    }
}

3
2017-10-16 22:44



Tôi thực sự thích hàm tìm nạp trên hàm này - cũng như lưu kết quả dưới dạng biến mẫu. Cảm ơn bạn đã nhập +1 này - Fifth-Edition
-1, cho người dùng trong tương lai, KHÔNG BAO GIỜ Lưu trữ thông tin cấu hình của bạn trong cùng một lớp cơ sở dữ liệu. Đó là an toàn và cũng giết chết khả năng sử dụng lại. Tạo một lớp cấu hình / trang và sử dụng hằng số hoặc một cái gì đó để chuyển chúng vào lớp kết nối. - M H


Tôi khuyên bạn nên sử dụng PDO. Đừng sáng tạo lại con chíp. Đó là giao diện OO tốt đẹp nhiều cơ sở dữ liệu. Ngoài ra tôi tạo ra một hàm nhỏ mà chỉ cần khởi tạo đối tượng PDO. Vì vậy, tất cả các cài đặt kết nối có thể được thay đổi ở một nơi.


9
2017-10-16 22:39





Cách tiếp cận hiện tại của bạn khá chuẩn và hoạt động tốt. Tôi đã sử dụng nó trong một thời gian dài. Đúng là các mô-đun như PDO cung cấp các chức năng cơ bản như thế này bây giờ, cũng rất tốt và có thể giúp bạn thoát khỏi các vấn đề với mã sản xuất bia tại nhà.

Tuy nhiên, tôi đã tiến hành quản lý kết nối thêm một bước nữa. Nếu bạn gặp một ứng dụng phức tạp, bạn có thể gặp phải tình huống mà bạn có nhiều cơ sở dữ liệu, hoặc sử dụng cơ sở dữ liệu nặng. Bao gồm một tệp kết nối cơ sở dữ liệu duy nhất và có toàn cầu $database biến trở nên khó sử dụng cho nhiều cơ sở dữ liệu và không cần thiết cho các yêu cầu ứng dụng có thể không cần một kết nối cơ sở dữ liệu. Hãy nhớ rằng, kết nối với cơ sở dữ liệu là tốn kém.

Những gì tôi đã làm là tạo một lớp DatabaseManager đơn lẻ xử lý đối tượng cơ sở dữ liệu cho tôi và đảm bảo nhiều kết nối tới một DB đã cho không được khởi tạo. Thay vì khởi tạo một đối tượng cơ sở dữ liệu mới ở đầu ứng dụng của bạn, bạn chỉ cần gọi trên DatabaseManager mỗi khi bạn cần đối tượng.

$db = DatabaseManager::getDatabase();

Đây là một lớp ví dụ mà tôi đã đánh dấu cho một dự án CodeIgniter. Bạn có thể thấy trong getDatabase() chức năng nó đơn giản tải đối tượng cơ sở dữ liệu mặc định của CodeIgniter, mà bạn sẽ thay thế cho lớp của riêng bạn (và chạy thường trình kết nối cho nó) nếu bạn không sử dụng CI. Đây là một lớp quản lý khá đơn giản, và có thể được mở rộng để quản lý nhiều kết nối đến các cơ sở dữ liệu khác nhau khá dễ dàng.

<?php

/**
 * Implements the Singleton pattern to prevent multiple instantiations and connections
 * to the application database.
 *
 */
class Database_manager
{
    private static $instance;
    public $db;

    /**
     * Constructor function is declared private to prevent instantiation.
     *
     */
    protected function __construct()
    {
        parent::__construct();
    }

    /**
     * Returns an instance of a Database_manager.
     *
     * @return object Database_manager object
     */
    public static function getInstance()
    {
        if (self::$instance == null) {
            $className = __CLASS__;
            self::$instance = new $className();
        }
        return self::$instance;
    }

    public static function getDatabase()
    {
        $instance = self::getInstance();
        if ($instance->db == null) {
            //utilize CodeIgniter's database loader
            $instance->db = $instance->load->database('',true);
            if (! is_object($instance->db)) throw new Exception("Could not load database.");
        }
        return $instance->db;
    }
}

Có lẽ lợi thế phổ biến nhất mà tôi có được khi sử dụng kiểu quản lý kết nối này là khi tôi phải gỡ bỏ một ứng dụng để bảo trì cơ sở dữ liệu. Bằng cách không khởi tạo một kết nối cơ sở dữ liệu cho đến khi tôi cần, tôi có thể dễ dàng đưa ra một thông báo "bảo trì đang xử lý" trên một trang web (ngắn mạch thường gửi MVC), và không lo lắng về yêu cầu mở ứng dụng kết nối DB trong khi bảo trì phát triển.


4
2017-10-16 23:18





Trong ví dụ về trình quản lý cơ sở dữ liệu của bạn, bạn không định nghĩa một phụ huynh cho lớp của bạn. Vì vậy, gọi parent :: __ constructor () tạo ra một ngoại lệ, và cũng có thể, bạn không thể sử dụng thuộc tính tải của trình kích hoạt mã.

Bạn đã sử dụng lớp nào làm phần mở rộng cho DatabaseManager của mình?

Vì tôi không biết nơi bạn đặt mã databasemanager của bạn, cũng không phải lớp mà bạn đã sử dụng làm cha mẹ, tôi đã phá vỡ các ngoại lệ bằng cách làm cho phương thức getDatabase () nhận được một tham số đầu vào mà tôi gọi là bộ nạp $. Thông thường, đối tượng $ loader này sẽ là lớp mô hình yêu cầu truy cập vào cơ sở dữ liệu.

public static function getDatabase($loader)   
{  
    $instance = self::getInstance();  
    if ($instance->db == null) {  
            //utilize CodeIgniter's database loader  
            $instance->db = $loader->load->database('default',true);  
            if (! is_object($instance->db)) throw new Exception("Could not load database.");  
    }  
    return $instance->db;  
}  

Trân trọng.


0
2017-10-05 13:27