Никто точно не знает почему, но mysql и php в большинстве web-проектов почти всегда используются вместе. Вроде разработчики php включили поддержку и других баз данных, да и mysql можно использовать не только вместе с php. А может просто провайдеры стремясь снизить цену хостинга и привлечь клиентов, включали на серверах поддержку php и mysql и это стало традицией?..
Но факт есть факт. Наверно больше половина проектов в интернете сделана на этой связке. Поэтому и возникла необходимость создать инструмент для программистов, с помошью которого можно работать с базой данных просто и эффективно. Вот так и появился класс на php, с помощью которого программирование намного упростилось.
Данный класс не претендует на функциональную полноту, но как показывает многолетний опыт, свойств его хватает для многих проектов.
Что хочешь, то и получишь!
Основу класса составляет простой анализатор, собранный на регулярных выражениях. А суть очень проста, мы должны получить результат в той форме, в которой ожидаем.
Ну например, если мы хотим узнать количество клиентов занесенных в базу данных>
select count(*) from `customers`;
то ясно, что мы ожидаем число. Класс разбирает запрос к базе данных и на основание запроса, выдает результат.
Но как говориться, лучше один раз увидеть, чем сто раз услышать.
Забираем и смотрим класс.
Ну а теперь посмотрим как этот зверь работает.
Шаг 1.
Откроем новую базу данных и создадим там пару таблиц.
create database `test_mysql_class` ;
create table `customers` ( `customer_id` smallint(6) not null auto_increment, `lastname` varchar(255) not null default , `surname` varchar(255) not null default , primary key (`customer_id`) ) type=myisam auto_increment=4 ;
insert into `customers` values (1, pupkin, vasya); insert into `customers` values (2, mal4ish, ploxish); insert into `customers` values (3, mal4ish, kibal4ish);
Класс проанализировал наш запрос, и понял, что на выход надо послать одно число. Если мы не хотим, что бы отладочная информация печаталась классом, то надо вместо:
$count = $db->query($sql, 1);
написать так:
$count = $db->query($sql, 0); или просто $count = $db->query($sql);
также это работает с min(*) и МАХ(*).
Шаг 3.б.
Теперь попробуем узнать какой id номер у нашего клиента, которого зовут pupkin vasya
<?php ...
$sql = select `customer_id` from `customers`; $sql .= where `lastname` = pupkin and `surname` = vasya limit 0,1; $customer_id = $db->query($sql, 1); echo $customer_id; ?>
При „разборке“ этого выражения, класс „понял“, что на „гора“ надо выдать только одно число, а именно $customer_id . Почему? Потому, что во-первых мы делаем select только по `customer_id` , a во-вторых и это самое главное, в конце $sql у нас стоит limit 0,1 . Как говориться комментарии излишни.
Шаг 3.в.
Ну а теперь попробуем, найти имя и фамилию клиента зная его id.
А теперь мы захотим получить все имена клиентов из базы данных.
<?php ...
$sql = select `lastname`,`surname` from `customers` where 1; $array = $db->query($sql, 1); echo $array; ?>
И что мы получили на выходе? Массив! array
Но это массив обьектов, нам нужно только их перелистать и получить все имена!
<?php ...
$sql = select `lastname`,`surname` from `customers` where 1; $array = $db->query($sql, 1); if(is_array($array)) foreach ($array as $obj) echo $obj->lastname..$obj->surname.; ?>
Вот они наши клиенты:
pupkin vasya mal4ish ploxish mal4ish kibal4ish
Шаг4.
Казалось бы всего перечисленного могло бы хватить, но... .
Если нам понадобиться получить все продукты которые заказали клиенты с фамилией mal4ish ? Конечно проблем нет, так как mysql не все вложенные sql запросы поддерживает, то sql запрос будет следующим:
select `orders`.`product_id` as id from ( `orders` left join `customers` on `customers`.`customer_id` = `orders`.`customer_id`)where `customers`.`lastname` = mal4ish
<?php ...
$sql = select `orders`.`product_id` as id from ; $sql .= ( `orders` left join `customers` on `customers`.`customer_id` = `orders`.`customer_id`); $sql .= where `customers`.`lastname` = mal4ish ; $array = $db->query($sql, 1); if(is_array($array)) foreach ($array as $obj) echo $obj->id.; ?>
Но для некоторых это сложно и непонятно, а иногда такой запрос составить просто невозможно.
Что делать? Надо перевести комманды которые мы хотим выполнить в тот формат, который понимает mysql.
Ну например sql запрос можно было бы написать так:
select `product_id` from `orders` where `customer_id` in(select `customer_id` from `customers` where `lastname` = mal4ish)
Только не пробуйте пропустить это через mysql, конечно это не правильно.
Но если мы скажем нашему классу, что бы он разобрал эту конструкцию по частям и заменил то, что находится в скобках на реальные значения? Почему бы и нет? Но что бы избежать путаницы в настоящих и ненастоящих запросах, поставим в нашем примере вместо круглых, фигурные скобки, и пропустим в конце это через наш класс.
<?php ...
$sql = select `product_id` from `orders` where `customer_id` in; $sql .= {select `customer_id` from `customers` where `lastname` = mal4ish } ; $array = $db->query($sql, 0); if(is_array($array)) foreach ($array as $obj) echo $obj->product_id.; ?>
Если включить режим вывода на экран, то увидим, что наш класс меняет запрос который стоит в фигурных скобках, на результат разделенный запятой и снова выполняет запрос, пока не получит последний результат:
yes contact! ;-)
---- sql
select `product_id` from `orders` where `customer_id` in {select `customer_id` from `customers` where `lastname` = mal4ish }
---- in sql
select `customer_id` from `customers` where `lastname` = mal4ish
---- sql
select `product_id` from `orders` where `customer_id` in (2,3)
12 33 43 655
Результат совпадает с ожидаемым!
Заключение
Вкратце все. Класс как класс, пользуйтесь на здоровье! Надо только следить за синтаксисом, и за пробелами, что бы регулярные выражения поняли, что вы хотите.