[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Базы Данных / MySQL /

Классы в 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.

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


<?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


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


Заключение


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





Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Базы Данных / MySQL /

Близкие контакты третьего вида с Visual Foxpro (или как написать свой провайдер для FoxPro)
12-03-2010   

Многие наверное как и я в свое время задавались интересным вопросом – “А вот как бы задействовать всю силу применяемой в моем проекте СУБД? Не только стандартные SQL запросы, а и скрытые возможности.” Тогда ведь можно будет получать результат найэффективнешими методам... подробнее

Кол. просмотров: общее - 4458 сегодня - 0

Oracle: Изучаем метки доступа к строкам: задание свойств столбца доступа в таблице
07-03-2010   

Эта статья рассматривает некоторые особенности средства label security в oracle. Здесь показана возможность секретить служебный столбец с метками доступа к строкам, а также рассмотрены некоторые правила правки меток. В первую очередь статья затрагивает использование параметра table_options процедуры apply_table_policy из пакета sa_policy_admin... подробнее

Кол. просмотров: общее - 3250 сегодня - 0

Простой журнал аудита на триггерах MySQL
07-03-2010   

Небольшая заметка об использовании триггеров в СУБД MySQL. Несмотря на достаточно приличный возраст этой СУБД, поддержка триггеров появилась только в 5-й версии и достаточно мало описана на русском языке... подробнее

Кол. просмотров: общее - 3154 сегодня - 1

Настройки mysql-server сразу после установки
07-03-2010   

Мой любимый вопрос, задаваемый DBA, которые хотят увеличить производительность MySQL: “какие параметры надо настраивать в первую очередь, сразу после установки сервера?”... подробнее

Кол. просмотров: общее - 2940 сегодня - 1

10+ способов обрушить mysql-сервер
07-03-2010   

Иногда у меня спрашивают о ошибках MySQL, (например таких), которые могут привести к обрушиванию mysql-сервера пользователем с обычными привелегиями. Потом звучит вопрос: “Что же делать в таких случаях? Как защититься от подобных ситуаций?”... подробнее

Кол. просмотров: общее - 8313 сегодня - 2



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects