Классы в MySQL

Вступление

Никто точно не знает почему, но 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');


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.



Попытаемся соединиться с базой данных при помощи класса:


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.а



И так попробуем узнать, сколько у нас клиентов в базе данных?


$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


...

$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.




$sql = "select `lastname`,`surname` from `customers`";
$sql .= " where `customer_id` = 1 limit 0,1";
$obj = $db->query($sql, 1);
echo $obj;
?>


ну и что мы получим? object

Да, мы получили обьект. Но у этого обьекта есть нужные нам свойства,
а именно `lastname` и `surname` ,а это то, что нам надо!


...

$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.г.



А теперь мы захотим получить все имена клиентов из базы данных.


...

$sql = "select `lastname`,`surname` from `customers` where 1";
$array = $db->query($sql, 1);
echo $array;
?>


И что мы получили на выходе? Массив! array

Но это массив обьектов, нам нужно только их перелистать и получить все имена!


...

$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'


...

$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, конечно это не правильно.

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


...

$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


Результат совпадает с ожидаемым!

Заключение

Вкратце все. Класс как класс, пользуйтесь на здоровье! Надо только следить за синтаксисом, и за пробелами, что бы регулярные выражения поняли, что вы хотите.

Читать комменты и комментировать

Добавить комментарий / отзыв



Защитный код
Обновить

Классы в MySQL | | 2010-09-12 23:12:27 | | Базы данных | | ВступлениеНикто точно не знает почему, но mysql и php в большинстве web-проектов почти всегда используются вместе. Вроде разработчики php включили поддержку и других баз данных, да и mysql можно | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Поделиться с друзьями: