Все ленты — последние статьи

Построение запросов на основе простого PHP класса

Построение запросов на основе простого PHP класса

Хотя обычно рекомендуется использовать какой-либо фреймворк или CMS, но иногда проекты настолько малы, что подобные решения могут только усложнить разработку. Однако, несмотря на малость проектов, не стоит игнорировать использование базы данных полностью. Данный урок проведет Вас по пути создания простого механизма запросов для MySQL на основе PHP.

 

Установки проекта

Сначала нужно сделать несколько специальных файлов и директорий. В данном разделе представлено то, что нужно сделать. Вы можете использовать свои собственные имена с учетом того, что в дальнейшем Вам надо будет соответствующим образом изменять их использование в коде.

Создаем директории

Нам нужна новая директория, которая будет содержать все. В данном случае она называется tut. Внутри этой директории располагаются файлы конфигурации в директории conf. Также есть директория inc (сокращение от include) и внутри нее расположена директория class.

Добавляем файлы

Внутри /conf создаем config.php. Внутри /inc/class мы создаем DAL.php. А в корневой директории создаем файл index.php.


DAL — это сокращение от "Data Access Layer"(слоя доступа к данным). В многослойной архитектуре он используется для перевода запросов баз данных в объекты и обратно.

Шаг 2. Установка базы данных.

Нам нужно создать базу данных и наполнить ее некоторыми данными. Для целей данного урока будет использоваться база данных с двумя таблицами с одной связью один-ко-многим. Данный пример сделан для демонстрации того, как наш механизм запросов будет подтягивать данные хотя бы для одной связи.

Создаем таблицы

Итак, в базе данных tut создаем таблицы makes и models. Таблица makes будет иметь поля id и name, а таблица models будет иметь поля id,make, и name.


Наполняем таблицы данными

Теперь добавим несколько названий (например, Ford, Chevy, и т.д.) в таблицу makes и несколько моделей автомобилей в таблицу models.


В рамках данного урока предполагается, что Вы имеете некоторый опыт работы с базами данных и SQL, поэтому подробного объяснения организации связей и ключей не будет.

Шаг 3. Соединение с базой данных

В нашем примере мы будем использовать константы PHP для организации соединения с базой данных.

Определение переменных соединения

В файле /conf/config.php определим переменные соединения с базой данных и подключим скрипт DAL.php.

<?php // Включаем DAL require_once(dirname(dirname(__FILE__)) . '/inc/class/DAL.php'); // База данных define ( 'DB_HOST', 'localhost' ); define ( 'DB_USER', 'root' ); define ( 'DB_PASSWORD', 'YOUR PASSWORD' ); define ( 'DB_DB', 'tut' ); ?>

Опции, используемые в примере, предполагают работу с MySQL с установками по умолчанию.

Создаем функцию соединения

Теперь в файле /inc/class/DAL.php определим функцию, которая будет устанавливать соединение с нашей базой.

Соединение, так же как и все последующие запросы будет действовать в классе DAL. Заключение всех операций с базой данных в один класс позволяет нам манипулировать запросами без использования скриптов других уровней. Хотя такой подход требует использовать фиктивное пространство имен.

В рамках данного урока мы добавим конструктор класса, хотя он и ничего не делает.

<?php class DAL { public function __construct(){} private function dbconnect() { $conn = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die ("<br/>Не могу подсоединиться к серверу MySQL"); mysql_select_db(DB_DB,$conn) or die ("<br/>Не могу получить указанную базу данных"); return $conn; } } ?>

Метод dbconnect определен как private, потому что не следует соединяться с базой данных вне контекста DAL. В действительности мы будем использовать несколько публичных функций, которые будут вызывать dbconnect из DAL. Немного смущает подход? Читайте дальше.

Шаг 4. Создаем обобщенные инструменты работы с запросами

Чтобы абстрагировать наши запросы так, чтобы мы могли использовать небольшие куски кода повторно, нам нужно выполнить два пункта. Первый, нам нужен некоторый обобщенный класс для результатов запроса. Второй, нам нужен обобщенный метод для запросов внутри DAL.

Создаем обобщенный класс результатов запроса

Назначение всех наших манипуляций — это возможность конвертировать запросы SQL в объекты и минимизировать использование корявого цикла while($row = mysql_fetch_array($result)). С объектами значительно проще работать, и они позволяют использовать свойства вместо индексов массива.

Мы хотим сделать класс, который будет создавать свойства "на лету" и хранить данные ассоциированные со свойствами

Мы разместим данный класс в скрипте /inc/class/DAL.php. Так как это новый класс, то он располагается вне класса DAL.

class DALQueryResult { private $_results = array(); public function __construct(){} public function __set($var,$val){ $this->_results[$var] = $val; } public function __get($var){ if (isset($this->_results[$var])){ return $this->_results[$var]; } else{ return null; } } }

Создаем обобщенный метод запросов

Теперь в классе DAL нужно создать обобщенный метод запросов, который будет конвертировать запросы SELECT в объекты DALQueryResult.

По существу, мы хотим конвертировать каждое возвращаемое имя поля в свойство объекта DALQueryResult.

private function query($sql){ $this->dbconnect(); $res = mysql_query($sql); if ($res){ if (strpos($sql,'SELECT') === false){ return true; } } else{ if (strpos($sql,'SELECT') === false){ return false; } else{ return null; } } $results = array(); while ($row = mysql_fetch_array($res)){ $result = new DALQueryResult(); foreach ($row as $k=>$v){ $result->$k = $v; } $results[] = $result; } return $results; }

Здесь имеется приватная функция, которая принимает запрос SQL. Она соединяется с базой данных и выполняет запрос. Затем, она проверяет, есть ли какой-нибудь результат. Если результата нет, то она возвращает null на запрос SELECT, и false на другие запросы. Если запрос был успешен и запрос не относится к типу SELECT, то функция возвращает true. Если же это был запрос SELECT, то функция конвертирует результат в массив объектов DALQueryResult. Таким образом имитируется результат, который обычно получается при использовании mysql_query.

Пишем запрос

Теперь мы готовы написать запрос SQL. Запросы DAL должны быть специфицированны и в имени и в назначении. Давайте сделаем один.

Это будет наш первый публичный метод.

public function get_models_by_make_name($name){ $sql = "SELECT models.id as id, models.name as name, makes.name as make FROM models INNER JOIN makes ON models.make=makes.id WHERE makes.name='$name'"; return $this->query($sql); } 

Здесь мы только пишем запрос и возвращаем результат в форме объекта DALQueryResult. Наш обобщенный метод query выполнит все итерации и решения.

Завершаем DAL

В этой точке скрипт DAL.php завершен. Код должен выглядеть так:

<?php class DALQueryResult { private $_results = array(); public function __construct(){} public function __set($var,$val){ $this->_results[$var] = $val; } public function __get($var){ if (isset($this->_results[$var])){ return $this->_results[$var]; } else{ return null; } } } class DAL { public function __construct(){} public function get_models_by_make_name($name){ $sql = "SELECT models.id as id, models.name as name, makes.name as make FROM models INNER JOIN makes ON models.make=makes.id WHERE makes.name='$name'"; return $this->query($sql); } private function dbconnect() { $conn = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die ("<br/>Не могу подсоединиться к серверу MySQL"); mysql_select_db(DB_DB,$conn) or die ("<br/>Не могу получить указанную базу данных"); return $conn; } private function query($sql){ $this->dbconnect(); $res = mysql_query($sql); if ($res){ if (strpos($sql,'SELECT') === false){ return true; } } else{ if (strpos($sql,'SELECT') === false){ return false; } else{ return null; } } $results = array(); while ($row = mysql_fetch_array($res)){ $result = new DALQueryResult(); foreach ($row as $k=>$v){ $result->$k = $v; } $results[] = $result; } return $results; } }

Использование DAL

Теперь посмотрим на результат использования DAL. Все, что нам нужно — включить файл /conf/config.php, присвоить значение DAL, и сделать что-нибудь с данными. Вот пример:

<?php require_once(dirname(__FILE__) . '/conf/config.php'); $dal = new DAL(); $makes = array('Ford','Chevy','Honda'); foreach ($makes as $make){ $results = $dal->get_models_by_make_name($make); echo "<h1>Модели $make</h1>"; if ($results){ echo "<ul>"; foreach ($results as $result){ echo "<li>$result->make $result->name (Database ID: $result->id)</li>"; } echo "</ul>"; } else{ echo "<p>Извините, у нас нет информации о производителе.</p>"; } } ?>

В результате мы используем имена полей как свойства объекта PHP.

Шаг 7. Делаем один шаг вперед

Часто быват полезно конвертировать обобщенный DALQueryResult в более специфический объект. В этом случае, вы можете написать объект, котрый будет использовать DALQueryResult как параметр конструктора. А затем Вам останется просто использовать его для построения нового объекта.

<?php class CarModel{ private $_id; private $_make; private $_name; public function __construct(DALQueryResult $result){ $this->_id = $result->id; $this->_make = $result->make; $this->_name = $result->name; } public function __get($var){ switch ($var){ case 'id': return $this->_id; break; case 'make': return $this->_make; break; case 'name': return $this->_name; break; default: return null; break; } } public function __toString(){ return $this->_name; } } ?>

Затем пишете запрос, который возвращает массив Ваших объектов вместо массива обобщенных объектов DALQueryResult.

public function get_models_by_make_name_as_CarModel($name){ // Повторно используем существующий запрос $results = $this->get_models_by_make_name($sql); // Проверяем результат if (!$results){ return $results; } else{ // Массив, который содержит CarModel $object_results = array(); // Цикл по результат и конвертация в объекты CarModel foreach ($results as $result){ object_results[] = new CarModel($result); } // возвращаем массив объектов CarModel return object_results; } }

Построение специфических объектов может стать очень выгодным, когда используются вычисления для извлечения важных данных из полей.

Надеюсь, что урок Вам понравился!

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.net.tutsplus.com
Перевел: Сергей Фастунов