@NastyaG

Как правильно использвать базы данных на странице php?

Здравствуйте. Не могу разобраться, как правильно работать с БД.
У меня есть класс работы с БД:

class DataBase
{
    private $mysqli;
    private $dbConfig;

    public function __construct()
    {

        $this->dbConfig = require "db/database_config.php";
        $this->mysqli = mysqli_connect($this->dbConfig['host'], $this->dbConfig['username'], $this->dbConfig['password'], $this->dbConfig['db_name']);
        if (mysqli_connect_errno($this->mysqli)) {
            echo "Не удалось подключиться к MySQL: " . mysqli_connect_error();
        }
    }

  public function getEmployees($where='1',$start, $perPage){
        $sql="SELECT e.name,e.birthday,d.title_dep,p.title_pos,t.title_type,e.salary FROM `employees` AS e INNER JOIN departments AS d ON e.id_dep=d.id
INNER JOIN positions AS p ON e.id_pos=p.id
INNER JOIN payment_types AS t ON e.id_type=t.id  where $where LIMIT $start,$perPage";

        $res = $this->mysqli->query($sql);
        $row=$res->fetch_all(MYSQLI_ASSOC);
        return $row;
    }

....
}


И на php странице у меня вызываются методы этого класса:

$db=new DataBase();
$empl=$db->getEmployees($where,$start,$perPage);


Вопрос вот в чем: в каком месте нужно закрывать соединение с БД?
В каждом методе? Но если у меня на странице много методов вызываются от 1го соединения?

Или лучше просто в конце странице вызвать метод $db->closeConnection(); ?
  • Вопрос задан
  • 248 просмотров
Пригласить эксперта
Ответы на вопрос 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
в каком месте нужно закрывать соединение с БД?

Перед завершением процесса. Хотя оно и так закроется.

В каждом методе?

Нет, постоянные реконнекты будут дорого стоить.

--- Немножко Code Review ---

// Не давайте общие имена конкретным реализациям
// Почитайте, проникнитесь и используйте PSR-2 и PSR-4
class DataBase
{
    private $mysqli;
    private $dbConfig;

    public function __construct()
    {
// Класс по работе с БД не должен знать даже о существовании неких файлов, где-то там. Это не его забота.
// Передавайте в конструктор готовое подключение к БД, если нужно.
        $this->dbConfig = require "db/database_config.php";
// Вот никак понять не могу, за что так любят этот mysqli, ну что в нем прям такого раз такого, по сравнению с PDO?
        $this->mysqli = mysqli_connect($this->dbConfig['host'], $this->dbConfig['username'], $this->dbConfig['password'], $this->dbConfig['db_name']);
// Почему вдруг класс по работе с БД занимается операцией вывода?
// Если что-то не так - бросайте исключение, ни каких echo, die, exit, trigger_error
        if (mysqli_connect_errno($this->mysqli)) {
            echo "Не удалось подключиться к MySQL: " . mysqli_connect_error();
        }
    }
// Вы не проверяете аргументы, это плохо, очень.
// Что бы нагнуть ваш проект достаточно передать в любой из аргументов: '1; DROP TABLE employees;'
  public function getEmployees($where='1',$start, $perPage){
// ЗАБУДЬТЕ про подстановку данных через конкатенацию, используйте плейсхолдеры
// http://php.net/manual/ru/pdo.prepared-statements.php
        $sql="SELECT e.name,e.birthday,d.title_dep,p.title_pos,t.title_type,e.salary FROM `employees` AS e INNER JOIN departments AS d ON e.id_dep=d.id
INNER JOIN positions AS p ON e.id_pos=p.id
INNER JOIN payment_types AS t ON e.id_type=t.id  where $where LIMIT $start,$perPage";

// Вам ни переменная $res, ни $row не нужны
        $res = $this->mysqli->query($sql);
        $row=$res->fetch_all(MYSQLI_ASSOC);
        return $row;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы