Ben bu PDO Bağlantı Sınıf hakkım var mı?

2 Cevap php

Ben kendime cepten becerileri öğretmek için küçük bir CMS sistemi üzerinde çalışıyorum, son birkaç gündür PDO ile oynamak oldum, ama sadece küçük bir CMS olsa bile, ben idare edebilmek istiyorum ne olursa olsun web can ona atmak.

Bu şimdiye kadar, ben talep üzerine eşzamanlı bağlarla büyük miktarda etkinleştirmek için kurucusuna bağlantı havuzu eklemek için gidiyorum ile geldim budur. Ben burada çok yanlış bir şey yaptık biraz tavsiye ve eleştirilerden, hiç şüphesiz isteyen kulüpler bu yüzden bu OOP şeyler için çok yeniyim.

Ben çok sayıda yardımcı fonksiyonları kullanmak için $ this-> dbConnectionInstance sınıf genelinde kullanmak istediğiniz gibi özel bir kurucu ekledim rağmen, Global or Singleton for database connection? baz tasarım olarak en iyi cevabı aldı.

Zaman ayırdığınız için çok teşekkür ederiz, gerçekten, bana verebileceğiniz herhangi bir tavsiye takdir edecek

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

}

?>

Önerileriniz için teşekkür ederiz hem, ben şimdi geri alma eklendi ve benim istisna işleme içine taahhüt ettik, ben sadece tamponlu sorguları kullanımını araştırma yapıyorum, ben ths bana verecek ne tamamen emin değilim?

2 Cevap

(Eğer işlemleri destekleyen bir RDBMS'yi kullanıyorsanız) iyi görünüyor, ben tamponlu sorgu / errorInfo önerileri ile birlikte, rollback işlevsellik eklemek istiyorum:

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

commit(), beginTransaction()

EDIT: added links below for more info on buffered queries:

Çok kötü bir görünüm dosent var kodu. ben bir kaç küçük değişiklik (çoğunlukla hata işleme) yapabilir ancak eğer.

hazırlamak ve ifadeler hata false dönecektir yürütmek hem de. ve yukarıdaki örnekte $this->dbConnectionInstance->errorInfo() adlı hatayı erişebilirsiniz.

ayrıca tamponlu sorgu kullanarak öneririz herhangi bir büyük sorguları kullanmayı planlıyorsanız: PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true

iyi bir başlangıç ​​gibi görünüyor. İYS'niz iyi şanslar.