Domanda

Ho giocato con il PDO negli ultimi giorni, sto lavorando a un piccolo sistema CMS per insegnarmi le abilità OOP, ma anche se è solo un piccolo CMS, voglio che sia in grado di gestire qualsiasi cosa il web può lanciarvi.

Questo è ciò che ho escogitato finora, aggiungerò il pool di connessioni al costruttore per abilitare grandi quantità di connessioni simultanee su richiesta. Sono molto nuovo con questa roba OOP, quindi voglio un piccolo consiglio e critiche, senza dubbio ho fatto qualcosa di terribilmente sbagliato qui.

Ho preso la risposta migliore a Global o Singleton per la connessione al database? come progetto di base, anche se ho aggiunto un costruttore privato poiché desidero utilizzare $ this- > dbConnectionInstance in tutta la classe per l'utilizzo di numerose funzioni di supporto.

Grazie mille per il tuo tempo, apprezzerò davvero qualsiasi consiglio tu mi possa dare,

-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;
    }

}

?>

Grazie a entrambi per i vostri suggerimenti, ora ho aggiunto il rollback e mi impegno nella gestione delle mie eccezioni, sto solo facendo ricerche sull'uso di query bufferizzate, non sono del tutto sicuro di cosa mi darà?

È stato utile?

Soluzione

Sembra buono, aggiungerei la funzionalità rollback , insieme a suggerimenti buffered query / errorInfo (se si utilizza un RDBMS che supporta le transazioni):

try {
    $this->dbConnectionInstance->beginTransaction();
    $stmt = $this->dbConnectionInstance->prepare($sql);
    $stmt->execute($params);
    $this->dbConnectionInstance->commit();
}catch(PDOException $e){
    $this->dbConnectionInstance->rollback();
}

commit () , beginTransaction ()

MODIFICA: collegamenti aggiunti di seguito per ulteriori informazioni sulle query con buffer:

Altri suggerimenti

Il codice che hai dosato sembra troppo male. tuttavia se potessi apportare un paio di piccole modifiche (principalmente alla gestione degli errori).

entrambe le istruzioni preparazione ed esecuzione restituiranno false in caso di errore. e puoi accedere all'errore da $ this- > dbConnectionInstance- > errorInfo () nel tuo esempio sopra.

anche se prevedi di utilizzare query di grandi dimensioni, ti suggerisco di utilizzare una query con buffer: PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY = > true

sembra un buon inizio. Buona fortuna per il tuo CMS.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top