我有一个config.php文件,其中包含一些全局变量:基本上,它们中的大多数都与连接到我的数据库有关。
一个例子:
$WEBDBHOST = 'localhost';
$WEBDBPORT = '3306';
$WEBDBNAME = 'db';
$WEBDBUSERNAME = 'root';
$WEBDBPASSWORD = '' ;
大多数时候它的使用方式是:
$dbw = new PDO("mysql:host=$WEBDBHOST;port=$WEBDBPORT;dbname=$WEBDBNAME", $WEBDBUSERNAME, $WEBDBPASSWORD);
这在我看来一点效率都没有!如何改进我的代码?我应该创建一个包含全局变量的数据库层,并创建一个返回新pdo对象的getWEBDB()吗?
或者有更好的方法来处理这个问题吗?请记住,我有不止一个DB,所以我在考虑getWebDB()、getGameDB()等。
是的,您应该创建一个数据库层。每个人都应该。
不,不是因为"配置文件中有很多全局变量"。事实上,应该只有一个全局变量
$cfg['db']['game']['host'] = 'localhost';
$cfg['db']['game']['port'] = '3306';
$cfg['db']['game']['base'] = 'db';
$cfg['db']['game']['user'] = 'root';
$cfg['db']['game']['pass'] = '';
$cfg['db']['game']['charset'] = 'utf8';
现在,您可以将所需的配置选项传递给类似的类
$gamedb = new DBLayer($cfg['game']);
并且有像这个这样的构造函数
function __construct($db)
{
$dsn = "mysql:";
$dsn .= "host=". $db['host'].";";
$dsn .= "dbname=". $db['name'].";";
$dsn .= "port=". $db['port'].";";
$dsn .= "charset=".$db['charset'];
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
return new PDO($dsn,$db['user'],$db['pass'], $opt);
}