1

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

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

感谢您的建议。

4

3 回答 3

6

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

然而,从 DB 类扩展应用程序类是一个坏主意。这些类没有任何共同之处。数据库类只是一个服务 - 所以,将它用作服务。您的某些课程肯定也必须发送电子邮件 - 您是否也从电子邮件课程扩展您的课程?

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

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

于 2013-04-06T03:31:43.957 回答
1

如果使用 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');

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

不建议,由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

于 2013-04-06T00:47:43.630 回答
1

我认为在这种情况下使用单变量或全局变量是最好的。使用单例和全局变量被认为是一种不好的做法,因为它们很容易被滥用。但在这种情况下,好处克服了缺点。

此外,在开源平台上使用单例或全局进行数据库连接是一种常见的做法: - 在 Magento 中使用单例来获取/设置 PDO 对象 - 在 Wordpress 中使用全局来维护 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];
    }
}
于 2013-11-16T14:43:53.387 回答