/**
* 连接数据库。
*
* @param string $dbOption 数据库配置项。
* @return void
*/
final public function connection($dbOption = '')
{
if (strlen($dbOption) > 0) {
$this->dbOption = $dbOption;
}
$registryName = "mysql_{$this->dbOption}";
// [1] 传统初始化MySQL方式。
$config = App::getDbConfig();
if (!isset($config[$dbOption])) {
throw new DbException("MySQL 配置:{$dbOption} 未设置");
}
$config = $config[$dbOption];
$host = $config['host'];
$port = $config['port'];
$username = $config['user'];
$password = $config['pwd'];
$charset = $config['charset'];
$dbname = $config['dbname'];
$pconnect = $config['pconnect'];
$dsn = "mysql:dbname={$dbname};host={$host};port={$port}";
$dbh = new \PDO($dsn, $username, $password, [\PDO::ATTR_PERSISTENT => $pconnect]);
// MySQL操作出错,抛出异常。
$dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(\PDO::ATTR_ORACLE_NULLS, \PDO::NULL_NATURAL);
$dbh->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, FALSE);
$dbh->setAttribute(\PDO::ATTR_EMULATE_PREPARES, FALSE);
// 以关联数组返回查询结果。
$dbh->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);
$dbh->query("SET NAMES {$charset}");
self::$connectedIdent[$registryName] = $dbOption; // 之所以以连接标识做键,是避免多次连接导致持续的增加。
Registry::set($registryName, $dbh);
}
配置如下
; MySQL 配置
mysql.default.host = 127.0.0.1
mysql.default.port = 3306
mysql.default.user = xxx
mysql.default.pwd = xxx
mysql.default.dbname = xxx
mysql.default.charset = utf8
mysql.default.pconnect = false
/**
* 构造方法。
*
* @param string $dbOption 数据库配置项。
* @return void
*/
public function __construct($dbOption = '')
{
if (strlen($dbOption) > 0) {
$this->dbOption = $dbOption;
$this->changeDb($this->dbOption);
}
}
/**
* 切换数据库连接。
*
* @param string $dbOption 数据库配置项。
* @return void
*/
final public function changeDb($dbOption)
{
$registryName = "mysql_{$dbOption}";
if (Registry::has($registryName) === false) {
$this->connection($dbOption);
}
$this->dbConnection = Registry::get($registryName);
}
初始化的时候,自动连接数据库。
然后就可以进行各种操作了。