多个数据库连接PHP



我很难想出一个解决这个问题的好办法。我有多个类在我的网站上,所有处理不同的事情。我有一个评论类,一个配置文件类,一个登录类等等。到目前为止,我对我的代码设计很满意,因为基本上所有的逻辑都不在我的html模板中。所以我的模板里只有很少的逻辑。唯一的问题是,我只有一个用于数据库连接的类,并且我从数据库类扩展每个类,并使用父构造函数连接到数据库。唯一的问题是每个页面上至少有2个独立的类,现在网站变得越来越复杂,我每页有4或5个类,它明显影响加载时间,因为我每次都要重新连接到数据库。

我的问题是在类中使用数据库连接的最佳方法是什么。我想也许数据库查询将不得不在html中处理,或者我可以创建一个完整的函数文件,包含在每个页面上,有一个数据库连接加载它。但是我想知道更有经验的程序员是怎么做的,这样我就可以用正确的方法修复它。

谢谢你的建议

虽然您可以使用单例来确保只使用一个连接,但似乎在Stack Overflow上宣布了一场针对这种诚实模式的圣战。

然而,从DB类扩展应用程序类是一个坏主意。这些类没有任何共同之处。数据库类只是一个服务——所以,把它当作服务来使用。你的一些类也必须发送电子邮件-你不也从电子邮件类扩展你的类吗?

您必须实例化您的DB类一次,然后将此对象传递给其他类的构造函数。最简单的方法是只使用global $db;,或者您可以在构造函数参数中传递它们。或者使用广为宣传的依赖注入方法。

无论如何,您应该在整个脚本执行过程中使用单个连接(具有相同的凭据)。多次打开和关闭连接并不比同时有多个连接好。

如果使用MySQli:

$Con_1 = new mysqli ("host","user","password","database");
$Con_2 = new mysqli ("host","user","password","database");
$Con_3 = new mysqli ("host","user","password","database");

然后与:

交互
$PreparedStatement_1 = $Con_1->prepare(); // Connect to database instance specified in $con_1
$PreparedStatement_1->bindparam('',);
$PreparedStatement_1->execute();
$PreparedStatemet_1->close(); // close to free up other statements
$PreparedStatement_2 = $Con_2->prepare(); // Connect to database instance specified in $con_2
$PreparedStatement_2->bindparam('',);
$PreparedStatement_2->execute();
$PreparedStatemet_2->close(); // close to free up other statements

如果使用PDOMysql

$Con_1 = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
$Con_2 = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
$Con_3 = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');

示例与mysql示例或多或少相同。

不建议,By mysql

$Con_1 = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$Con_2 = mysql_connect('localhost', 'mysql_user', 'mysql_password');

与:

$Query = mysql_query("",$Con_1);
$Query2 = mysql_query("",$Con_2);

如果你想手写代码,你可以这样做。但是多个数据库实例可以用PHP完成,并且有一些框架可用:

Codeigniter, CakePHP, Symphony, Wordpress

我认为在这种情况下使用单元素或全局元素是最好的。使用单例和全局被认为是一种不好的做法,因为它们很容易被滥用。但在这种情况下,利大于弊。

此外,在开源平台上使用单例或全局数据库连接是一种常见的做法:- Singleton在Magento中用于获取/设置PDO对象—在Wordpress中使用Global是为了维护mysql_connect函数返回的资源。

可以通过向连接器添加工厂行为来避免类依赖。因此,我建议您这样写:

class DBconnector
{
    private static $_connections = array();
    private static createConnection($type)
    {
        switch($type){
            case 'pdo':
            default:
                return new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
        }
    }
    public static getConnection($type)
    {
        if(!isset(self::_connections[$type])){
            self::_connections[$type] = self::createConnection($type);
        }
        return self::_connections[$type];
    }
}

最新更新