CMS на PHP
Выпуск 1

Свой Querybuilder на PHP (построитель запросов)

Начинаем разрабатывать CMS на PHP. Готовим все части системы управления, а в этом выпуске напишем простой класс, построитель запросов Query Builder под PDO. По итогу получим данные из базы через созданный класс.

Всем привет! Это Николай, вы попали на серию видео уроков по созданию своей системы управления. Создавать систему управления мы будем на PHP без использования фреймворков. Всё по-старинке. Будем делать это через Open Server и система управления будет у нас для интернет-магазина. Это будет сама система управления и публичная часть. Я покажу от самого начала и до рабочей системы управления, постараюсь максимально объяснить вам каждый момент. Возможно что-то я буду говорить неправильно, если кто-то увидел ошибку напишите в комментариях я могу ошибаться. Так же я не абсолютный профессионал в PHP, какие-то приемы я могу использовать устаревшие или не совсем оптимальные, поэтому если у вас есть какие-то советы по улучшению прошу напишите в комментариях и если вам понравится ставьте лайк и погнали.

Потребуется нам всего четыре вещи: голова, текстовый редактор, Open Server и браузер. Всё, браузер я открыл, текстовый редактор тоже готов и Open Server у меня уже запущен. Вы скачаете неважно полный-неполный, он у вас должен быть запущен. Давайте его выключим сейчас, запускаем, все он работает. После этого вы создаете в папке у себя в domains необходимый домен я создал CMS. Открываем, он отображает нам список файлов, но у нас пока ничего нет. Я буду использовать текстовый редактор Atom, а вы ребята абсолютно не принципиально, можете писать в visual studio, sublime, как угодно, кому что нравится. Здесь хорошо увеличивается шрифт чтобы вам было лучше видно. Всё, давайте начинать.

В этом уроке мы создадим класс для работы с базой данных и посмотрим как он работает. Это основа. В любом случае система управления целиком и полностью работает на взаимодействии базы данных и нашего приложения, поэтому нам сначала нужно обязательно разобраться как работать с базой данных. Сейчас мы напишем класс с двумя, функциями которые будут выполнять какой-то нестандартный запрос и вторая функция будет получать данные из базы данных по нашим параметрам. Во-первых нам надо создать папку папку admin, в ней у нас будут основные сейчас файлы для работы. У нас папка libs, она у нас будет общая и для админской и для публичной части, потому что в публичной части тоже пользователи, которые будут регистрироваться для оформления заказа, они будут тоже использовать этот класс. Так дальше мы создаем в папке libs папку classes. Всё, папка у нас создана и внутри мы создадим сейчас два файлика: это будет database.php, сейчас откроем сразу файлики заранее создадим чтобы нам было понятно. В любом случае нам нужен будет файлик config или как угодно его называйте, где мы создадим константы для соединения с базой данных или укажем какие-то дополнительные параметры, в нашем случае мы подключим обработку ошибок, потому что у нас идет разработка и мы должны видеть все ошибки которые возникают. Пока с этого начнем дальше уже добавим если что-то необходимо.

Итак первый класс у нас будет Core — это будет самый главный класс, который объединит все наши дополнительные классы. Комментировать буду минимально, у нас цель не научиться комментировать код, мы разрабатываем систему управления. Пока будет одна публичная переменная это будет $db внутри у нас в констракте будет одна глобальная переменная, тоже $db и $this->db = $db. Пока всё, готово, мы сделали.

Дальше мы начинаем работать с базой данных. Тоже открываем PHP, внутри мы создаем класс для работы базы данных, аргументов у construct не будет, нужна публичная переменная, назовем её $con, там будет наше соединение. Будет функция приватная функция connect. Давайте сразу создадим константы для соединения с базой данных, так константы у нас будут такие: DB_HOST со значением localhost, DB_USER mysql или root, DB_NAME с названием нашей базы и DB_PASS с паролем mysql. Давайте сразу создадим базу данных, переходим в Open Server -> Дополнительные -> PhpMyAdmin. База данных называется CMS с кодировку utf8mb4. Дальше функция connect: мы создаем переменные отмененные нашему нашим контентом это будет $host, $name, $pass, $db_name, все константы мы сделали теперь у нас идет try catch мы пробуем соединиться с базы сразу пишем, если у нас соединение не установилась: ошибка соединения и добавляем сюда вывод ошибки $e->getMessage(). Если получилось мы обращаемся к нашему $con, обращаемся к классу PDO, указываем кодировку для соединения и символов, указываем режим обработки исключений:


$this->con = new PDO(
	"mysql:host=$host;dbname=$db_name",
	$user, $pass,
	array(
	  PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'"
	)
);
$this->con->exec("SET CHATACTER SET UTF-8");
$this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

После коннекта мы создаем новую публичную функцию query, как я вам и говорил в самом начале у нас будут функция для нестандартного запроса и функция для выборки из базы данных. Из аргументов: $query, $parameters и $limit для ограничения нашей выборки. Так разделим отступом и начинаем писать нашу функцию. Готовим соединение, устанавливаем FetchMode, связываем параметры со значениями и выполняем запрос:


$run_query = $this->con->prepare($query);
$run_query->setFetchMode(PDO::FETCH_OBJ);
if(!empty($limit)){
	foreach ($limit as $key => $value) {
	  $run_query->bindValue("$key", $value, PDO::PARAM_INT);
	}
}
if(!empty($parameters)){
	foreach ($parameters as $key => $value) {
	  $run_query->bindValue("$key", $value);
	}
}
if($run_query->execute()){
	return $run_query;
} else {
	return false;
}

С query мы разобрались, теперь мы создаем функцию для select. У select'а будет тоже try catch, ошибка выборки и то же сообщение. Здесь уже не $query, а $table, также параметры и тут уже не $limit, а тут важен $order, направлении выборки, то есть какую сортировку выбрать. Создаем переменные, в которые будем складывать запрос и значения. В цикле проходимся по параметрам и добавляем их в $where и $values для связки ключ-значение в SQL-запросе, готовим запрос и выполняем со значениями или без, в зависимости от количества параметров.


$where = "";
$order_by = (!empty($order)) ? "order by" . $order : "";

if(!empty($parameters)){
  $i = 1;
  $where = "WHERE ";
  $values = [];

  foreach ($parameters as $key => $value) {
    if($i > 1){$where .= " AND ";}
    $where .= "$key=:$key";
    $values[":$key"] = $value;
    $i++;
  }
}

try {
  $run_query = $this->con->prepare("SELECT * FROM $table $where $order_by");
  $run_query->setFetchMode(PDO::FETCH_OBJ);
  if(!empty($parameters)) {
    if($run_query->execute($values)) {return $run_query;}
  } else {
    if($run_query->execute()) {return $run_query;}
  }
} catch (PDOException $e) {
  echo "Ошибка выборки: " . $e->getMessage();
}

Мы закончили с этими функциями. После этого нам надо создать экземпляр нашего класса. Теперь мы можем его легко использовать, для этого мы создадим в папке admin папку libs, т.к для административной и публичной части будут разный набор получаемых из БД данных, поэтому мы для каждой части создаем отдельный файлик db.php который будет объединять все наши классы и из базы выцеплять необходимые параметры. Подключаем нашу сессию, после этого мы создадим две переменных $adminroot для получения директории и $rootdir. Всё готово, теперь нам надо подключить require_once для наших библиотек: config.php где у нас соединение с базой данных и database.php. Пока у нас больше ничего не будет. Мы можем уже создать нашу переменную $core и вызывать наш класс Core. После этого мы можем уже создать табличку settings нашей базе данных, например с четырьмя параметрами. После этого мы можем взять и получить наши настройки, пусть это будет settings затем мы просто возьмем и к нашему $db, где записался класс Database, вызовем функцию select. Первым аргументом выступает таблица. Дальше просто получаем данные из БД.


$core = new Core;

$settings = $db->select("settings");
$settings = $settings->fetch();

$site_name = $settings->site_name;

Если вы повторили всё и у вас получилось, то вы большие молодцы. По факту мы с вами сделали построитель запросов за небольшой урок. Приложение уже может получать и выполнять нестандартные запросы без каких-то дополнительных настроек. На данный момент мы закончили этот класс, а в следующем уроке мы создадим класс для фильтрации $_GET и $_POST данных и на этом наверное всё. Всем спасибо, что смотрели. Если было интересно ставьте лайк, делитесь, подписывайтесь на канал, а если что-то непонятно обязательно спрашивайте в комментариях отвечу на каждый комментарий.

Лучший хостинг для вашего сайта

Используем для всех своих проектов, советуем и вам.
Обращайтесь, перенесём сайт на Beget.

Icon