Eu tenho este PDO Connection Classe certo?
Pergunta
Eu fui brincar com DOP para os últimos dias, eu estou trabalhando em um pequeno sistema CMS para ensinar-me OOP habilidades, mas mesmo que seja apenas uma pequena CMS, eu quero que ele seja capaz de lidar com qualquer a web pode jogar nele.
Este é o que eu vim acima com até agora, eu estou indo para adicionar o pool de conexão para o construtor para permitir grandes quantidades de Ligações simultâneas em demanda. Eu sou muito novo para este material OOP assim que eu estou querendo um pouco de aconselhar e critism, não duvido que eu tenha feito algo terrivelmente errado aqui.
Eu levei a resposta de cima para global ou Singleton para conexão com o banco? como o projeto base, embora eu adicionei um construtor privado como eu quero usar $ this-> dbConnectionInstance em toda a classe para inúmeras funções auxiliares para uso.
Muito obrigado pelo seu tempo, eu realmente aprecio qualquer conselho você pode me dar,
-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;
}
}
?>
Obrigado a ambos por suas sugestões, eu agora acrescentada a reversão e comprometer no meu tratamento de exceção, só estou pesquisando o uso de consultas em buffer, eu não sou inteiramente certo o que ths vai me dar?
Solução
Parece bom, gostaria de acrescentar reversão funcionalidade, juntamente com a consulta tamponada / sugestões ErrorInfo (Se você estiver usando um RDBMS que as transações suporta):
try {
$this->dbConnectionInstance->beginTransaction();
$stmt = $this->dbConnectionInstance->prepare($sql);
$stmt->execute($params);
$this->dbConnectionInstance->commit();
}catch(PDOException $e){
$this->dbConnectionInstance->rollback();
}
commit () , beginTransaction ()
Editar: adicionado links abaixo para mais informações sobre consultas buffer:
Outras dicas
O código que você tem dosent olhar muito ruim. no entanto, se eu poderia fazer algumas pequenas mudanças (principalmente manipulação de erros).
tanto a preparar e executar instruções retornará false em caso de erro. e você pode acessar o erro de $this->dbConnectionInstance->errorInfo()
no seu exemplo acima.
Além disso, se você planeja usar quaisquer consultas grandes Eu sugiro usar uma consulta tamponada: PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
parece um bom começo. Boa sorte no seu CMS.