何时启动MySQLi连接(2个方案)

时间:2015-12-31 15:23:37

标签: php mysqli

我正在用mysqli做我的第一个PHP项目(直到今天我一直在使用mysql)。因为它非常简单,我不使用类,只是函数,我想知道何时以及如何实例化连接。即,我正在考虑这两种情况:

情景I:

$DBLink = new mysqli(...);

function foo($DBLink, $params, ...) {
    //Stuff.
}

foo($DBLink, ...);

情景二:

function getConnection() {
    $DBLink = new mysqli(...);
    return $DBLink;
}

function foo($params,...) {
    $DBLink = getConnection();
    //Stuff
}

foo(...);

使用DBLink会有多个功能(实际上很多)。

两种情况中哪一种更好,为什么?我更喜欢第二个,它看起来更干净,但也许它只是一次实例化它是一个更好的主意。

2 个答案:

答案 0 :(得分:1)

答案是第二种方法,尽管有更好的方法。

最好的选择是使用您可以从任何方法获得的单例类。一个不完整的例子是(这实际上不会自己工作,但是它可以让你知道像这样的单例内发生了什么);

class Database {
    private static $conn = NULL;

    public function __construct(...) {
        self::$conn = new mysqli(...);
    }

    public static function getInstance() {
        return self::$conn;
    }
}

您可以使用它来获取当前连接;

// initailise connection
$conn = new Database(...);

function foo() {
    $db = Database::getInstance();
    // do stuff
}

您可以获得MySQLi连接的完整包装类,例如this PHP-MySQLi-Database-Class,它们也有查询的辅助方法。这意味着您不必担心自己维护包装器类。

答案 1 :(得分:0)

您可以使用与Singleton设计模式非常相似的第一个示例。每次都避免创建新的数据库连接。

下面的例子显示了使用类,虽然不是你要问的,但可能你应该考虑。

singleton.php

<?php
        class Database
        {
            // Store the single instance of Database
            private static $m_pInstance;

            private $db_host='localhost';
            private $db_user = 'root';
            private $db_pass = '';
            private $db_name = 'databasename';

            // Private constructor to limit object instantiation to within the class
            private function __construct() 
            {
                mysql_connect($this->db_host,$this->db_user,$this->db_pass);
                mysql_select_db($this->db_name);
            }

            // Getter method for creating/returning the single instance of this class
            public static function getInstance()
            {
                if (!self::$m_pInstance)
                {
                    self::$m_pInstance = new Database();
                }
                return self::$m_pInstance;
            }

            public function query($query)
            {
               return mysql_query($query);
            }

         }
?>

&安培;我们可以从其他文件或函数中调用它:

<?php
       include 'singleton.php';
       $pDatabase = Database::getInstance();

       $result = $pDatabase->query('...');
?>