我无法找到解决这个问题的好方法。我在我的网站上有多个类,它们都处理不同的事情。我有一个评论类,一个配置文件类,一个登录类等等。到目前为止,我对我的代码设计感到满意,因为基本上所有逻辑都不在我的html模板中。所以我的模板中只有非常小的逻辑。唯一的问题是,我有一个数据库连接类,我从数据库类扩展每个类,并使用父构造函数连接到数据库。唯一的问题是每个页面上至少有2个单独的类,现在网站变得越来越复杂,我每页有4或5个类,它显着影响加载时间,因为我必须重新连接到每个数据库时间。
我的问题是在类中使用数据库连接的最佳方法是什么。我想也许数据库查询必须在html中处理,或者我可以创建一个整个函数文件,它包含在每个加载了数据库连接的页面上。但是我想知道更有经验的程序员是如何做到这一点所以我能以正确的方式解决它。
感谢您的建议。
答案 0 :(得分:4)
虽然您可以使用单例来确保只使用一个连接,但似乎在Stack Overflow上声明了一个神圣的战争。
然而,从DB类扩展应用程序类是个坏主意。这些类没有任何共同之处。数据库类只是一种服务 - 因此,将其用作服务。你的一些课程也必须发送电子邮件 - 你是不是也要从电子邮件课程中扩展课程?
您必须实例化一次DB类,然后将此对象传递给其构造函数中的其他类。最简单的方法是使用global $db;
,或者你可以在构造函数参数中传递它们。或者使用那种广泛宣传的依赖注入方法。
无论如何,您应该在整个脚本执行过程中使用单个连接(使用相同的凭据)。多次打开和关闭连接并不比具有多个同时连接更好。
答案 1 :(得分:1)
我认为使用sinlgeton或global是最适合这种情况的。使用单例和全局变量被认为是一种不好的做法,因为它们很容易被滥用。但在这种情况下,好处克服了缺点。
此外,在开源平台上使用单例或全局进行数据库连接是一种常见做法: - 在Magento中使用Singleton来获取/设置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];
}
}
答案 2 :(得分:0)
如果使用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