質問
私はここ数日間PDOをいじっています。OOPスキルを習得するために小さなCMSシステムに取り組んでいますが、小さなCMSだけでも、何でも処理できるようにしたいのです。ウェブはそれを投げることができます。
これは私がこれまでに考え出したものです。大量の同時接続をオンデマンドで有効にするために、コンストラクタに接続プーリングを追加します。私はこのOOPに非常に慣れていないので、少しアドバイスと批評を望んでいます。間違いなくここで何かひどいことをしたのです。
グローバル接続またはデータベース接続用のシングルトンに対するトップの回答を取得しましたか基本設計として、クラス全体で$ this-> dbConnectionInstanceを使用して多数のヘルパー関数を使用したいので、プライベートコンストラクターを追加しました。
ご清聴ありがとうございました。アドバイスをいただければ幸いです。
-Drew
// 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();
}
編集:バッファリングされたクエリに関する詳細情報へのリンクを以下に追加しました:
他のヒント
dosentのコードは見た目が悪すぎます。ただし、いくつかの小さな変更(主にエラー処理)を行うことができる場合。
prepareステートメントとexecuteステートメントの両方がエラー時にfalseを返します。上記の例の $ this-&gt; dbConnectionInstance-&gt; errorInfo()
からエラーにアクセスできます。
また、大規模なクエリを使用する予定がある場合は、バッファ付きクエリを使用することをお勧めします。 PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY =&gt; true
良いスタートのようです。 CMSで頑張ってください。