Какой-нибудь более простой / лучший способ сделать MySQL синглтон-дБ класс в PHP? - PullRequest
3 голосов
/ 07 января 2010

Вот тот, который я использую:

<?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);

Предполагая, что я хочу, чтобы он только подключился и выполнил эту одну функцию запроса, есть ли какие-либо улучшения, которые я должен сделать в классе? Память или эффективность кода?

Кроме того, есть ли эффективный способ получить учетные данные БД из файла конфигурации? Я знаю, что не могу использовать включения в моем классе.

Ответы [ 4 ]

4 голосов
/ 07 января 2010

Я обычно использую ленивую инициализацию для такого рода ситуаций и имею только один открытый метод (в данном случае) с закрытым конструктором для предотвращения внешнего создания экземпляров (согласно шаблону 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;");, не вызывая вообще никакой инициализации.

2 голосов
/ 07 января 2010

Все просто, все будет хорошо.

Вы можете передать свои учетные данные в init ();

include(config.php);
$oDb = Database::init( DB_HOST, DB_NAME, DB_USER, DB_PASSWORD );
$sql = foo;
$oDb->query($sql);
1 голос
/ 07 января 2010

Для синглтон-классов модель, которой следует Дэн Брин , является самой чистой и очень распространенной. Однако в этом случае я бы также позволил методу getInstance принять некоторые параметры, чтобы вы могли переопределить конфигурацию по умолчанию во время создания экземпляра или просто получить ссылку без создания подключения (оба варианта использования происходят время от времени ).

database.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];
  }
}

.. конфиг / database.php:

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

Редактировать: я изменил его, чтобы он больше походил на муху, чтобы вы могли получить только один экземпляр для каждого места подключения / базы данных. Это решает ваши проблемы и поддерживает определенную степень гибкости.

1 голос
/ 07 января 2010

Вы можете использовать включение внутри функции внутри класса

<?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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...