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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top