Как можно улучшить класс для работы с PDO? Доброго времени суток, некоторое время назад написал класс для работы с PDO. Прошу оценить знатаков, хотелось бы адекватной критики, почему плохо, и как исправить. Возможно где то лишний код, который можно заменить одной строкой, итд. true)); self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$db->exec('SET names utf8'); } catch(PDOException $e) { self::$connection_status = FALSE; self::$error_text = $e->getMessage(); } }
public static function GetConnectionStatus() { return self::$connection_status; }
public static function GetConnectionError() { return self::$error_text; }
public static function getInstance($db_host, $db_name, $db_user, $db_password) { if (!(self::$_instance instanceof self)) { self::$_instance = new self($db_host, $db_name, $db_user, $db_password); } return self::$_instance; }
public static function exec($query) { return self::$db->exec($query); }
public static function query($query) { return self::$db->query($query); }
public static function insert($table, $params) { foreach($params as $key => $value) { $keys[] = $key; $statemans[] = ":$key"; } $result = self::$db->prepare("INSERT INTO `".$table."` (".implode(', ', $keys).") VALUES (".implode(', ', $statemans).");"); return $result->execute($params); }
public static function update($table, $updating, $where) { $i = 0; $list = ''; foreach($updating as $key => $value) { $i++; if ($i $value) { $i++; if ($i prepare($sql); foreach($updating as $key => $value) { $result->bindValue(':'.$key, $value); } foreach($where as $key => $value) { $result->bindValue(':'.$key, $value); } return $result->execute(); }
public static function delete($table, $where) { $i = 0; $list = ''; foreach($where as $key => $value) { $i++; if ($i prepare("DELETE FROM `".$table."` WHERE $list"); return $result->execute($where); }
public static function select($table, $select, $params) { $i = 0; $list = ''; foreach($params as $key => $value) { $i++; if ($i prepare("SELECT ".$select." FROM `".$table."` WHERE $list"); $result->execute($params); return $result->fetchAll(); }
public static function count($query) { $result = self::$db->query($query); return $result->rowCount(); }
public static function addslashes($str) { return addslashes($str); }
private function __clone() {} private function __wakeup() {} }
// Подключение к БД $object = PdoDatabase::getInstance('localhost', 'laravel', 'root', 'root');
// Проверка статуса подключения $result = PdoDatabase::GetConnectionStatus(); if ($result) { echo 'Connection sucsess ';
// Использование любомого метода echo PdoDatabase::delete('articles', array('id' => 16)); } else { // Получение ошибки подключения, в случае ее наличия echo PdoDatabase::GetConnectionError(); }
Избавиться от статических методов и переменных. Использование статики делает класс менее гибким и затрудняет тестирование. Вместо этого, можно создать экземпляр класса в методе getInstance и работать с ним.
Добавить возможность передавать параметры запроса через подготовленные запросы, чтобы избежать SQL инъекций. Для этого нужно использовать методы bindParam или bindValue.
Разделить код на более мелкие методы. Например, вынести формирование условий WHERE и SET в отдельные методы.
Обработать случаи, когда запрос не выполнен успешно (например, в методах insert, update, delete).
Обработать ошибки запросов в методе query и exec, чтобы возвращать более понятную информацию о возникшей проблеме.
Добавить возможность работы с транзакциями для обеспечения целостности данных.
Пересмотреть методы select и count, возможно, объединить их в один метод с параметрами, определяющими тип выполнения операции.
Добавить методы для работы с множественными INSERT и UPDATE запросами, чтобы улучшить производительность при массовом добавлении или обновлении данных.
Провести тестирование класса на различных сценариях использования, чтобы удостовериться в его надежности и эффективности.
Улучшить комментарии к методам класса, чтобы лучше понимать их функциональность.
Избавиться от статических методов и переменных. Использование статики делает класс менее гибким и затрудняет тестирование. Вместо этого, можно создать экземпляр класса в методе getInstance и работать с ним.
Добавить возможность передавать параметры запроса через подготовленные запросы, чтобы избежать SQL инъекций. Для этого нужно использовать методы bindParam или bindValue.
Разделить код на более мелкие методы. Например, вынести формирование условий WHERE и SET в отдельные методы.
Обработать случаи, когда запрос не выполнен успешно (например, в методах insert, update, delete).
Обработать ошибки запросов в методе query и exec, чтобы возвращать более понятную информацию о возникшей проблеме.
Добавить возможность работы с транзакциями для обеспечения целостности данных.
Пересмотреть методы select и count, возможно, объединить их в один метод с параметрами, определяющими тип выполнения операции.
Добавить методы для работы с множественными INSERT и UPDATE запросами, чтобы улучшить производительность при массовом добавлении или обновлении данных.
Провести тестирование класса на различных сценариях использования, чтобы удостовериться в его надежности и эффективности.
Улучшить комментарии к методам класса, чтобы лучше понимать их функциональность.