Классы в MySQL
Но факт есть факт. Наверно больше половина проектов в интернете сделана на этой связке. Поэтому и возникла необходимость создать инструмент для программистов, с помошью которого можно работать с базой данных просто и эффективно. Вот так и появился класс на PHP, с помощью которого программирование намного упростилось.
Данный класс не претендует на функциональную полноту, но как показывает многолетний опыт, свойств его хватает для многих проектов.
Что хочешь, то и получишь!
Основу класса составляет простой анализатор, собранный на регулярных выражениях. А суть очень проста, мы должны получить результат в той форме, в которой ожидаем.
Ну например, если мы хотим узнать количество клиентов занесенных в базу данных>
SELECT COUNT(*) FROM `customers`;
то ясно, что мы ожидаем число. Класс разбирает запрос к базе данных и на основание запроса, выдает результат. Но как говориться, лучше один раз увидеть, чем сто раз услышать. Забираем и смотрим класс.
Ну а теперь посмотрим как этот зверь работает.
Шаг 1.
Откроем новую базу данных и создадим там пару таблиц.
Внимание! Все примеры будут будут дописываться в конец первой программы!
Проще не бывает
Класс проанализировал наш запрос, и понял, что на выход надо послать одно число. Если мы не хотим, что бы отладочная информация печаталась классом, то надо вместо:
Шаг 3.б.
Теперь попробуем узнать какой id номер у нашего клиента, которого зовут Pupkin Vasya
Да, мы получили обьект. Но у этого обьекта есть нужные нам свойства,
а именно `lastname` и `surname` ,а это то, что нам надо!
Шаг 3.г.
А теперь мы захотим получить все имена клиентов из базы данных.
Но это массив обьектов, нам нужно только их перелистать и получить все имена!
Шаг 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'
Что делать? Надо перевести комманды которые мы хотим выполнить в тот формат, который понимает MySQL.
Ну например SQL запрос можно было бы написать так:
Но если мы скажем нашему классу, что бы он разобрал эту конструкцию по частям и заменил то, что находится в скобках на реальные значения? Почему бы и нет? Но что бы избежать путаницы в настоящих и ненастоящих запросах, поставим в нашем примере вместо круглых, фигурные скобки, и пропустим в конце это через наш класс.
Данный класс не претендует на функциональную полноту, но как показывает многолетний опыт, свойств его хватает для многих проектов.
Что хочешь, то и получишь!
Основу класса составляет простой анализатор, собранный на регулярных выражениях. А суть очень проста, мы должны получить результат в той форме, в которой ожидаем.Ну например, если мы хотим узнать количество клиентов занесенных в базу данных>
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');
CREATE TABLE `orders` ( `customer_id` smallint(6) NOT NULL default '0', `product_id` smallint(6) NOT NULL default '0', KEY `customer_id` (`customer_id`,`product_id`) ) TYPE=MyISAM; INSERT INTO `orders` VALUES (1, 12);
INSERT INTO `orders` VALUES (1, 23); INSERT INTO `orders` VALUES (1, 34); INSERT INTO `orders` VALUES (1, 65);
INSERT INTO `orders` VALUES (2, 12); INSERT INTO `orders` VALUES (3, 33); INSERT INTO `orders` VALUES (3, 43);
INSERT INTO `orders` VALUES (3, 655);
Шаг 2.
Попытаемся соединиться с базой данных при помощи класса:<?php require("class.mysql.php"); $host = "localhost"; $only_db = "test_mysql_class"; $username = "username"; $password = "password"; $db = new mysql_db(); if(!$db->getConnect($host,$only_db,$username,$password)){ echo "Net contact :-("; exit; }else echo "Yes contact! ;-)Если у вас появилась надпись "Yes contact! ;-)", значит соединение с базой данных прошло успешно, можно переходить к изучению класса.
"; ?>
Внимание! Все примеры будут будут дописываться в конец первой программы!
Шаг 3.а
И так попробуем узнать, сколько у нас клиентов в базе данных?<?php … $sql = "SELECT COUNT(*) FROM `customers` "; $count = $db->query($sql, 1); echo $count; ?>
Проще не бывает
Класс проанализировал наш запрос, и понял, что на выход надо послать одно число. Если мы не хотим, что бы отладочная информация печаталась классом, то надо вместо: $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`"; $sql .= " WHERE `customer_id` = 1 LIMIT 0,1"; $obj = $db->query($sql, 1); echo $obj; ?>ну и что мы получим? Object
Да, мы получили обьект. Но у этого обьекта есть нужные нам свойства,
а именно `lastname` и `surname` ,а это то, что нам надо!
<?php ... $sql = "SELECT `lastname`,`surname` FROM `customers`"; $sql .= " WHERE `customer_id` = 1 LIMIT 0,1"; $obj = $db->query($sql, 1); echo $obj->lastname; echo "Теперь мы получили:
"; echo $obj->surname; ?>
Pupkin Vasyaчто нам и было надо!
Шаг 3.г.
А теперь мы захотим получить все имена клиентов из базы данных.<?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Результат совпадает с ожидаемым!