Frage

Ich habe um für die letzten Tage mit PDO gespielt, ich arbeite an einem kleinen CMS-System selbst OOP Fähigkeiten zu lehren, sondern auch wenn es nur ein kleines CMS ist, möchte ich es in der Lage sein zu handhaben was auch immer die Bahn an ihn werfen.

Das ist, was ich mit so weit habe kommen, werde ich Verbindungspooling an den Konstruktor hinzuzufügen große Mengen von gleichzeitigen Verbindungen auf Anforderung zu ermöglichen. Ich bin sehr neu in diesem OOP Sachen so dass ich ein wenig Beratung und critism bin zu wollen, kein Zweifel ich etwas schrecklich falsch hier getan haben.

Ich habe die Top-Antwort href="https://stackoverflow.com/questions/130878/global-or-singleton-for-database-connection"> Globale oder Singleton für Datenbank-Verbindung zum als Basis-Design, obwohl ich einen privaten Konstruktor hinzugefügt habe, wie ich will $ this-> dbConnectionInstance in der gesamten Klasse verwenden, um eine Vielzahl von Funktionen Helfer zu verwenden.

Vielen Dank für Ihre Zeit, ich werde wirklich schätzen jede raten Sie mir geben können,

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

}

?>

Danke euch beide für Ihre Anregungen, ich habe jetzt die Rollback und Commit in meine Ausnahmebehandlung hinzugefügt, ich bin nur die Verwendung von gepufferten Abfragen der Erforschung, ich bin nicht ganz sicher, was ths mir geben werden?

War es hilfreich?

Lösung

Sieht gut aus, würde ich hinzufügen Rollback Funktionalität, zusammen mit die gepufferte Abfrage / errorinfo Vorschläge (Wenn Sie einen RDBMS verwenden, die Transaktionen unterstützt):

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

commit () begintransaction ()

EDIT: hinzugefügt Links unten für weitere Informationen auf gepufferte Abfragen:

Andere Tipps

Der Code, den Sie dosent Blick zu schlecht. aber wenn ich kleine Änderungen (vor allem Fehlerbehandlung) machen ein paar könnte.

sowohl die Vorbereitung und Ausführung Anweisungen auf Fehler false zurück. und Sie können den Fehler von $this->dbConnectionInstance->errorInfo() in Ihrem Beispiel Zugriff über.

Auch wenn Sie planen, um alle großen Abfragen zur Verwendung ich schlage vor, mit einer gepufferten Abfrage: PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true

sieht aus wie ein guter Anfang. Viel Glück auf Ihrem CMS.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top