Правильно ли у меня есть этот класс соединения PDO?
Вопрос
Я играюсь с 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.