Php 多数据库连接

Php 多数据库连接,php,mysql,oop,pdo,Php,Mysql,Oop,Pdo,我很难想出解决这个问题的好办法。我的网站上有多个类,它们都处理不同的事情。我有一个comment类、profile类、login类等等。我到目前为止,我对我的代码设计很满意,因为基本上所有的逻辑都来自我的html模板。所以我的模板中只有非常小的逻辑。唯一的问题是,我有一个用于数据库连接的类,我从数据库类扩展了每个类,并使用父构造函数连接到数据库。唯一的问题是每个页面上至少有2个独立的类,现在网站变得越来越复杂,我每页有4到5个类,这明显影响了加载时间,因为我每次都必须重新连接到数据库 我的问题是

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

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

感谢您的建议。

如果使用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
$Query = mysql_query("",$Con_1);
$Query2 = mysql_query("",$Con_2);
如果使用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');
示例与MySQli示例大致相同

mysql不建议这样做

与:

$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
$Query = mysql_query("",$Con_1);
$Query2 = mysql_query("",$Con_2);
如果你想手写代码,你可以这样做。。但是可以使用PHP完成多个数据库实例,并且有可用的框架:

Codeigniter、CakePHP、Symphony、Wordpress

如果使用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
$Query = mysql_query("",$Con_1);
$Query2 = mysql_query("",$Con_2);
如果使用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');
示例与MySQli示例大致相同

mysql不建议这样做

与:

$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
$Query = mysql_query("",$Con_1);
$Query2 = mysql_query("",$Con_2);
如果你想手写代码,你可以这样做。。但是可以使用PHP完成多个数据库实例,并且有可用的框架:

Codeigniter、CakePHP、Symphony、Wordpress


尽管您可以使用单例来确保只使用一个连接,但对于这种诚实的模式,似乎在堆栈溢出上宣布了一场圣战

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

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


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

尽管您可以使用单例来确保只使用一个连接,但对于这种诚实的模式,似乎在堆栈溢出上宣布了一场圣战

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

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


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

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

此外,在开源平台上,使用单例或全局数据库连接是一种常见做法: -Singleton在Magento中用于获取/设置PDO对象 -Wordpress中使用Global来维护mysql\u 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];
    }
}

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

此外,在开源平台上,使用单例或全局数据库连接是一种常见做法: -Singleton在Magento中用于获取/设置 PDO对象 -Wordpress中使用Global来维护mysql\u 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];
    }
}


你有没有研究过框架是如何处理它的,比如,等等……老实说,我一直在试图找出wordpress是如何工作的,但我找不到连接到数据库的文件。如果你能告诉我这可能会有帮助。我检查了wp设置和wp config,但没有结果。根目录中的wp-config.php有数据库连接信息,我知道它有数据库信息。但我在wordpress中找不到真正的查询功能。我从来没有看过太多,但只要点击某些文件,有他们我不能。Idk也许是个愚蠢的问题,但我的代码其实很简单。我可以使用像zend这样的框架,但我没有99%的使用它。所以我想我会把它作为将类和PDO结合使用的最佳方式,因为现在我在类方法中进行所有查询。请参阅此和此:您是否研究过框架如何处理它,例如,等等……老实说,我一直在尝试了解wordpress是如何工作的,但我找不到连接到数据库的文件。如果你能告诉我这可能会有帮助。我检查了wp设置和wp config,但没有结果。根目录中的wp-config.php有数据库连接信息,我知道它有数据库信息。但我在wordpress中找不到真正的查询功能。我从来没有看过太多,但只要点击某些文件,有他们我不能。Idk也许是个愚蠢的问题,但我的代码其实很简单。我可以使用像zend这样的框架,但我没有99%的使用它。所以我想我会把它看作是同时使用类和PDO的最佳方式,因为现在我在类方法中做所有的查询。请参考这个和这个:我很感谢你花时间回答这个问题。实际上,我并没有尝试使用多个db连接,而是只使用一个。我的意思是我使用PDO,所以我知道在一个页面上可能有两个相同类的对象,但是连接到同一个数据库两次会显著降低速度。你能解释一下你的脚本是如何通过连接到同一个数据库来降低页面速度的吗?也许这是我的想象。但是一个页面不能被多个连接到同一个数据库的连接减慢。因为我现在每页可能有3到4个到同一个数据库的连接?在对同一数据库进行另一个查询之前,是否确定已正确关闭查询-连接到不同的数据库模式不应降低进程的速度PHP也只做您告诉它的事情。。您应该关闭您的查询以改进您的网站功能,同时我感谢您花时间回答这个问题。实际上,我并没有尝试使用多个db连接,而是只使用一个。我的意思是我使用PDO,所以我知道在一个页面上可能有两个相同类的对象,但是连接到同一个数据库两次会显著降低速度。你能解释一下你的脚本是如何通过连接到同一个数据库来降低页面速度的吗?也许这是我的想象。但是一个页面不能被多个连接到同一个数据库的连接减慢。因为我现在每页可能有3到4个到同一个数据库的连接?在对同一数据库进行另一个查询之前,是否确定已正确关闭查询-连接到不同的数据库模式不应降低进程的速度PHP也只做您告诉它的事情。。您应该关闭您的查询以改进您的网站功能非常感谢。我听说使用单例的明显的“坏习惯”。我不明白为什么这是个坏习惯。我切换了所有的类,通过引用传递pdo对象。非常感谢。我听说使用单例的明显的“坏习惯”。我不明白为什么这是个坏习惯。我切换了所有类,以通过引用传递pdo对象。