Правильно ли у меня есть этот класс соединения PDO?

StackOverflow https://stackoverflow.com/questions/1630588

  •  06-07-2019
  •  | 
  •  

Вопрос

Я играюсь с PDO последние несколько дней, работаю над небольшой системой CMS, чтобы освоить навыки ООП, но даже несмотря на то, что это всего лишь небольшая CMS, я хочу, чтобы она могла обрабатывать все, что может Интернет. бросить в это.

Это то, что я придумал на данный момент: я собираюсь добавить в конструктор пул соединений, чтобы обеспечить большое количество одновременных подключений по требованию.Я новичок в этом ООП, поэтому мне нужен небольшой совет и критика, без сомнения, я сделал здесь что-то ужасно неправильно.

Я взял лучший ответ на Global или Singleton для подключения к базе данных? в качестве базовой конструкции, хотя я добавил частный конструктор, поскольку хочу использовать $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 (если вы используете СУБД, поддерживающую транзакции):

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