Правильно ли написан класс для работы с базой данных? Собственно сам класс:class DB {
private $dbprefix;
private $mysqli;
private $connect = true;
function __construct() {
$config = new Config();
$this->dbprefix = $config->dbprefix;
if ($this->connect) {
$mysqli = new mysqli($config->host, $config->user, $config->password, $config->db);
$mysqli->set_charset("utf8");
if ($mysqli->connect_errno) {
echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
exit();
}
$this->mysqli = $mysqli;
$this->connect = false;
}
}


public function query($data) {
$data = preg_replace('/#_/i', $this->dbprefix, $data);
return $this->mysqli->query($data);
}

public function insert_query($name, $data) {
foreach($data as $key => $val){
$field .= '`'.$this->result()->real_escape_string($key).'`, ';
if (is_numeric($val)) {
$value .=' '.$this->result()->real_escape_string($val).', ';
} else {
$value .=' \''.$this->result()->real_escape_string($val).'\', ';
}
}
$name = preg_replace('/#_/i', $this->dbprefix, $name);
$name = $this->result()->real_escape_string($name);
$this->mysqli->query('INSERT INTO `'.$name.'` ('.rtrim($field, ', ').') VALUES ('.rtrim($value, ', ').')');
return $this->mysqli->insert_id;
}

public function result() {
return $this->mysqli;
}
}
Готовые решения не интересны, хочу изучить данный вопрос самостоятельно.Вопросы:
1. Не создаёт ли такой класс несколько подключений к БД и если создаёт, как их предотвратить?
2. Данный функционал класса написан грамотно? (других функций для работы с бд мне ненужно, всё что нужно описано выше)

21 Авг 2019 в 07:03
174 +1
0
Ответы
1

Да, данный класс создает новое подключение к базе данных каждый раз, когда создается новый объект класса DB. Это может вызвать проблемы с производительностью и использованием ресурсов. Чтобы предотвратить создание нескольких подключений, можно использовать шаблон Singleton, который обеспечит наличие только одного экземпляра класса DB.

В целом функционал класса написан верно, но есть несколько моментов, которые можно улучшить:

В методе insert_query необходимо объявить переменные $field и $value перед их использованием.Для безопасности лучше использовать подготовленные запросы (prepared statements) вместо непосредственной вставки данных в запросы для защиты от SQL-инъекций.Необходимо добавить обработку ошибок и исключений при выполнении запросов к базе данных, чтобы обработать возможные ошибки.Можно добавить методы для закрытия соединения с базой данных и выполнения других операций, которые могут потребоваться в будущем.
20 Апр 2024 в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир