【问题标题】:MySQL database config in a separate classMySQL 数据库配置在一个单独的类中
【发布时间】:2010-11-15 05:17:19
【问题描述】:

是否可以在单独的类中保留所有与数据库相关的配置(主机名、用户名、密码和数据库)以及连接和选择正确数据库的功能?

我尝试过这样的事情:

class Database
{
    var $config = array(
        'username' => 'someuser',
        'password' => 'somepassword',
        'hostname' => 'some_remote_host',
        'database' => 'a_database'
    );
    function __construct() {
        $this->connect();
    }
    function connect() {
        $db = $this->config;
        $conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
        if(!$conn) {
            die("Cannot connect to database server"); 
        }
        if(!mysql_select_db($db['database'])) {
            die("Cannot select database");
        }
    }
}

然后在另一个类中,我将在类中使用 __construct 函数:

require_once('database.php');
var $db_conn = new Database();

但这并没有保存连接,它最终默认为服务器本地数据库连接。还是每次执行一些数据库命令之前都要先执行数据库命令?

【问题讨论】:

标签: php mysql database oop mysql-connect


【解决方案1】:

我修改了您的课程,使其按您的预期工作:

<?php
class Database
{
    var $conn = null;
    var $config = array(
        'username' => 'someuser',
        'password' => 'somepassword',
        'hostname' => 'some_remote_host',
        'database' => 'a_database'
    );

    function __construct() {
        $this->connect();
    }

    function connect() {
        if (is_null($this->conn)) {
            $db = $this->config;
            $this->conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
            if(!$this->conn) {
                die("Cannot connect to database server"); 
            }
            if(!mysql_select_db($db['database'])) {
                die("Cannot select database");
            }
        }
        return $this->conn;
    }
}

用法:

$db = new Database();
$conn = $db->connect();

请注意,您可以根据需要多次调用 connect(),它将使用当前连接,如果不存在则创建一个。这是好事。

另外,请注意,每次您实例化数据库对象(使用 new)时,您都将创建到数据库的新连接。我建议您考虑将 Database 类实现为 Singleton 或将其存储在 Registry 中以供全局访问。

你也可以用肮脏的方式把它塞进 $GLOBALS。

编辑

我冒昧地修改了您的类以实现单例模式,并遵循 PHP5 OOP 约定。

<?php
class Database
{
    protected static $_instance = null;

    protected $_conn = null;

    protected $_config = array(
        'username' => 'someuser',
        'password' => 'somepassword',
        'hostname' => 'some_remote_host',
        'database' => 'a_database'
    );

    protected function __construct() {
    }

    public static function getInstance()
    {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function getConnection() {
        if (is_null($this->_conn)) {
            $db = $this->_config;
            $this->_conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
            if(!$this->_conn) {
                die("Cannot connect to database server"); 
            }
            if(!mysql_select_db($db['database'])) {
                die("Cannot select database");
            }
        }
        return $this->_conn;
    }

    public function query($query) {
        $conn = $this->getConnection();
        return mysql_query($query, $conn);
    }
}

用法:

$res = Database::getInstance()->query("SELECT * FROM foo;");

或

$db = Database::getInstance();
$db->query("UPDATE foo");
$db->query("DELETE FROM foo");

【讨论】:

    【解决方案2】:

    您当然可以将连接信息保存在单独的文件中。

    只需将您的连接对象 - $conn 在您的 connect() 函数中 - 保存在一个类变量中。然后,您将能够在调用之间重用它。

    【讨论】:

      【解决方案3】:

      在您的方法中,connect() $conn 只是一个仅存在于该方法范围内的局部变量。一旦该方法返回,将没有对连接资源的(其他)引用,它将被收集/处置。 你至少需要

      $this->conn = mysql_connect(...)
      

      【讨论】:

      • 我刚刚尝试将它添加到数据库类中:var $conn;以及 Database 类中的 connect() 方法: $this->conn = mysql($db['hostname'], $db['username'], $db['password']);在另一个类的 __construct 中,我有一个类变量 $db,它在该类的 __construct 中填充: $this->db = new Database();尝试进行查询时仍然出现此错误:无法通过套接字'/var/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器
      • 我已将我正在使用的整个数据库类以及一些测试文件发布在:gist.github.com/158389 如果有人可以看看他们是否能找到问题。
      【解决方案4】:

      这里是带有 PDO 的单例示例。感谢@hodobave

      <?php 
      
      /**
       * DB Connection class
       * Singleton pattern
       * An single instance of DB connection is created
      **/
      
      class Db{
      
          protected static $_instance = null;
          protected $_conn;
      
          protected $_config = [
              'username' => 'root',
              'password' => '',
              'hostname' => 'localhost',
              'database' => 'news',
          ];
          protected function __construct(){
      
          }
      
          public function getInstance(){
              if(null === self::$_instance){
                  self::$_instance = new self();
              }
              return self::$_instance;
          }
      
          public function getConnection(){
              if(is_null($this->_conn)){
                  //connect here
                  $db = $this->_config;
                  $dsn = "mysql:host={$db['hostname']};dbname={$db['database']}";
                  $this->_conn = new PDO($dsn, $db['username'], $db['password']);
              }
              return $this->_conn;
          }
      
          public function query($sql){
              $args = func_get_args();
              array_shift($args);
              $statement = $this->getConnection()->prepare($sql);
              $statement->execute($args);
              return $statement->fetchAll(PDO::FETCH_OBJ);
          }
      }
      
      
      
      $res = Db::getInstance();
      $users = $res->query("SELECT * FROM `user` WHERE id=?",1);
      print_r($users);
      ?> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-14
        • 1970-01-01
        • 2014-01-13
        • 2021-03-23
        • 2015-12-29
        • 1970-01-01
        • 2012-05-03
        • 2014-04-13
        相关资源
        最近更新 更多