문제

나는 지난 며칠 동안 PDO를 가지고 놀았고, OOP 기술을 독학하기 위해 작은 CMS 시스템 작업을 하고 있습니다. 비록 작은 CMS일지라도 웹이 할 수 있는 모든 것을 처리할 수 있기를 바랍니다. 그것을 던져라.

이것이 제가 지금까지 생각해낸 것입니다. 요청 시 대량의 동시 연결을 활성화하기 위해 생성자에 연결 풀링을 추가하겠습니다.나는 이 OOP 분야에 대해 매우 익숙하지 않기 때문에 약간의 조언과 비판을 원합니다. 의심할 여지 없이 여기서 뭔가 심각한 잘못을 저질렀습니다.

나는 가장 높은 답변을 얻었습니다 데이터베이스 연결을 위한 글로벌 또는 싱글톤? 기본 디자인으로 사용하기 위해 클래스 전체에서 $this->dbConnectionInstance를 사용하고 싶기 때문에 개인 생성자를 추가했지만.

시간을 내주셔서 정말 감사합니다. 저에게 주시는 조언에 진심으로 감사드립니다.

-드류

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

}

?>

제안해 주신 두 분 모두에게 감사드립니다. 이제 롤백을 추가하고 예외 처리에 커밋했습니다. 버퍼링된 쿼리 사용을 연구 중입니다. 이것이 나에게 무엇을 줄지 완전히 확신할 수 없습니다.

도움이 되었습니까?

해결책

좋아보이네요 추가하겠습니다 롤백 버퍼링된 쿼리/errorInfo 제안과 함께 기능(트랜잭션을 지원하는 RDBMS를 사용하는 경우):

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

저지르다() , 트랜잭션 시작()

편집하다:버퍼링된 쿼리에 대한 자세한 내용을 보려면 아래 링크를 추가했습니다.

다른 팁

당신이 가지고 있는 코드가 너무 나빠 보입니다.하지만 몇 가지 작은 변경(주로 오류 처리)을 할 수 있다면 말이죠.

오류가 발생하면 준비 및 실행 문 모두 false를 반환합니다.다음에서 오류에 액세스할 수 있습니다. $this->dbConnectionInstance->errorInfo() 위의 예에서.

또한 대규모 쿼리를 사용할 계획이라면 버퍼링된 쿼리를 사용하는 것이 좋습니다. PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true

좋은 시작인 것 같습니다.CMS에서 행운을 빕니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top