簡體   English   中英

在php中制作mysql單例db類的任何更簡單/更好的方法?

[英]Any simpler / better way of making a mysql singleton db class in php?

這是我正在使用的一個:

<?php
final class Database {
    private static $oDb;
    public static function init() {
        if(self::$oDb == NULL)
        {
            self::$oDb = mysql_connect('localhost', 'mysql_user', 'mysql_password') or die(mysql_error());
            mysql_select_db('mysql_db_name', self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

用法:

$oDb = Database::init();
$sql = foo;
$oDb->query($sql);

假設我只希望它連接並執行此查詢功能,那么我應該對該類進行任何改進嗎? 內存還是代碼效率?

另外,有沒有一種有效的方法可以從配置文件中獲取數據庫憑據? 我知道我不能在課堂上使用包含。

我通常在這種情況下使用惰性初始化,並且只有一個公共方法(在這種情況下),並帶有一個私有構造函數來防止外部實例化(根據Singleton模式):

class Database {
  private static $instance;
  private $conn;

  private function Database() {
    // do init stuff
    require_once('dbconfig.php'); // contains define('DB_USER', 'webuser'); etc...
    $this->conn = mysql_connect(DB_HOST, DB_USER, DB_PASS); // do error checking
  }

  public static function getInstance() {
    if(!self::$instance) {
      self::$instance = new Database();
    }
    return self::$instance;
  }

  public static function query($sql) {
    $instance = self::getInstance();
    return mysql_query($sql, $instance->conn);
  }
}

然后,您可以隨時使用$dbHandle = Database::getInstance() 或者在這種情況下,由於定義了靜態查詢方法,因此可以使用Database::query("select * from xx;"); 無需調用任何類型的init。

這很簡單,可以正常工作。

您可以將憑據傳遞給init();。

include(config.php);
$oDb = Database::init( DB_HOST, DB_NAME, DB_USER, DB_PASSWORD );
$sql = foo;
$oDb->query($sql);

您可以在類內的函數內使用include

<?php
final class Database {
    private static $oDb;
    public static function init() {
        if(self::$oDb == NULL)
        {
            include('config.php')
            self::$oDb = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
            mysql_select_db(DB_NAME, self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

或者你可以只傳遞變量...

<?php
final class Database {
    private static $oDb;
    public static function init($host, $user, $pass, $name) {
        if(self::$oDb == NULL)
        {
            self::$oDb = mysql_connect($host,$user,$pass) or die(mysql_error());
            mysql_select_db($name, self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

或者您可以將憑據存儲在php.ini文件中

<?php
final class Database {
    private static $oDb;
    public static function init($db_name) {
        if(self::$oDb == NULL)
        {
            self::$oDb = mysql_connect() or die(mysql_error());
            mysql_select_db($db_name, self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

php.ini文件:

mysql.default_host="host"
mysql.default_user="user"
mysql.default_password="password"

對於單例課程, Dan Breen遵循的模型是最簡潔且非常普遍的模型。 但是,在這種情況下,我還將允許getInstance方法接受一些參數,以便您可以在實例化時覆蓋默認配置,或者僅獲取引用而不創建連接(這兩種用例會不時發生)。

數據庫.php

require_once("../path/to/config/database.php");

class Database {
  private static $instances = array();

  private function Database($host, $user, $password, $name) {
    // do init stuff
  }

  public static getInstance(
    $host=DB_HOST, $user=DB_USER, $password=DB_PASSWORD, $name=DB_NAME
  ) {
    $key = strtolower($host . $user . $password . $name);

    if ( !$self::instances[$key] ) {
      $self::instances[$key] = new Database($host, $user, $password, $name);
    }
    return $self::instances[$key];
  }
}

..config / database.php:

define("DB_HOST", "localhost");
define("DB_USER", "mrsqlguy");
define("DB_PASS", "!!!");
define("DB_NAME", "just_another_wordpress");

編輯:我已對其進行了更改,使其更像是一個舉重,以確保每個連接位置/數據庫僅獲得一個實例。 這可以解決您的問題並保持一定程度的靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM