题
最近几天我一直在玩 PDO,我正在开发一个小型 CMS 系统来自学 OOP 技能,但即使它只是一个小型 CMS,我希望它能够处理 Web 上的任何内容扔向它。
这是我到目前为止所想到的,我将向构造函数添加连接池,以按需启用大量并发连接。我对 OOP 的东西很陌生,所以我需要一些建议和批评,毫无疑问我在这里做了一些非常错误的事情。
我采纳了最热门的答案 数据库连接是全局还是单例? 作为基本设计,尽管我添加了一个私有构造函数,因为我想在整个类中使用 $this->dbConnectionInstance 来使用许多辅助函数。
非常感谢您的宝贵时间,我真的很感激您给我的任何建议,
-德鲁
// Usage Example: $dbconn = dbManager::getConnection();
// $dbconn->query("SELECT * FROM accounts WHERE id=:id", "':id' => $id");
<?php
class dbManager {
private static $dbManagerInstance;
private $dbConnectionInstance;
private $stime;
private $etime;
public $timespent;
public $numqueries;
public $queries = array();
public static function getManager(){
if (!self::$dbManagerInstance){
self::$dbManagerInstance = new dbManager();
}
return self::$dbManagerInstance;
}
// Server details stored in definition file
private function __construct($db_server=DB_SERVER, $db_user=DB_USER, $db_pass=DB_PASS, $db_params=array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) {
if(!$this->dbConnectionInstance)
{
try{
$this->dbConnectionInstance = new PDO($db_server, $db_user, $db_pass, $db_params);
$this->dbConnectionInstance->setAttribute(PDO::ATTR_PERSISTENT, PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
$this->dbConnectionInstance = null;
die($e->getMessage());
}
}
return $this->dbConnectionInstance;
}
private function __destruct(){
$this->dbConnectionInstance = null;
}
private function query($sql, $params = array()) {
$this->queries[] = $sql;
$this->numqueries++;
$this->sTime = microtime();
$stmt = $this->dbConnectionInstance->prepare($sql);
$stmt->execute($params);
$this->eTime = microtime();
$this->timespent += round($this->eTime - $this->sTime, 4);
return $stmt;
}
}
?>
谢谢你们的建议,我现在已经将回滚和提交添加到我的异常处理中,我只是在研究缓冲查询的使用,我不完全确定这会给我带来什么?
解决方案
看起来不错,我想补充一下 回滚 功能,以及缓冲查询/错误信息建议(如果您使用的是支持事务的 RDBMS):
try {
$this->dbConnectionInstance->beginTransaction();
$stmt = $this->dbConnectionInstance->prepare($sql);
$stmt->execute($params);
$this->dbConnectionInstance->commit();
}catch(PDOException $e){
$this->dbConnectionInstance->rollback();
}
编辑:添加了以下链接以获取有关缓冲查询的更多信息:
其他提示
你的代码看起来太糟糕了。但是,如果我可以进行一些小的改动(主要是错误处理)。
prepare和execute语句都会在出错时返回false。您可以在上面的示例中从 $ this-&gt; dbConnectionInstance-&gt; errorInfo()
访问错误。
如果您打算使用任何大型查询,我建议使用缓冲查询: PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY =&gt;真代码>
看起来是一个好的开始。祝你的CMS好运。
不隶属于 StackOverflow