Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Интернет технологии -> PHP -> Класс на PHP для работы с MySQL


Класс на PHP для работы с MySQL

Вступление

Никто точно не знает почему, но MySQL и PHP в большинстве web-проектов почти всегда используются вместе. Вроде разработчики PHP включили поддержку и других баз данных, да и MySQL можно использовать не только вместе с PHP. А может просто провайдеры стремясь снизить цену хостинга и привлечь клиентов, включали на серверах поддержку PHP и MySQL и это стало традицией?..

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

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

Что хочешь, то и получишь!

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

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

SELECT COUNT(*) FROM `customers`;

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

Но как говориться, лучше один раз увидеть, чем сто раз услышать.

Забираем класс отсюда> http://people.freenet.de/andrejs/mysql/class.mysql.rar (2kB)

Смотрим класс в формате HTML> http://people.freenet.de/andrejs/mysql/class.mysql.html

 

Ну а теперь посмотрим как этот зверь работает.

 

 

Шаг 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! ;-)<br>";

?>

Если у вас появилась надпись

 

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."<br>";
?>

Вот они наши клиенты:

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."<br>";
?>

Но для некоторых это сложно и непонятно, а иногда такой запрос составить просто невозможно.

Что делать? Надо перевести комманды которые мы хотим выполнить в тот формат, который понимает 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."<br>";
?>

Если включить режим вывода на экран, то увидим, что наш класс меняет запрос который стоит в фигурных скобках, на результат разделенный запятой и снова выполняет запрос, пока не получит последний результат:

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

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

Заключение

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

Если вы заметите ошибки, или у вас появяться предложения по модификации класса, то обращайтесь ко мне, Андрей Наумов

Также спасибо моему турецкому коллеге Deniz Burucu из фирмы Boreksystems за помощь в тестирование класса.

Автор: Андрей Наумов

Ссылки по теме
Чтение почты через Web-интерфейс
Полезные скрипты на PHP
PHP и формы
Почтовые функции в РНР
Отправка электронной почты с помощью PHP
 

Компьютерная документация от А до Я - Главная

 
Популярные книги

Технология программирования на C++. Начальный курс

Подробнее

Photoshop CS2 для пользователя

Подробнее

Обработка цифровых фотографий (+CD)

Подробнее


 
Новости ИТ
04.12.2008  В Windows 7 запуск приложений Direct3D 10/10.1 будет возможен на CPU
04.12.2008  eGo BlackBelt и Encrypt - пара новых портативных HDD Iomega с зашитой данных
04.12.2008  A-DATA выпускает двух- и трёхканальные наборы памяти DDR3-1800+ в серии XPG Plus
04.12.2008  MOTOROKR EM35
04.12.2008  Шведский производитель ковриков для мышей выпустил игровую гарнитуру
04.12.2008  eGo BlackBelt и Encrypt - пара новых портативных HDD Iomega с защитой данных
04.12.2008  Вышла вторая бета-версия Windows Vista SP2
04.12.2008  Внешний SSD-накопитель с поддержкой eSATA и USB
04.12.2008  Флэшка OCZ со встроенным кард-ридером
04.12.2008  Весрия «ПАУ» 1.8.2 будет содержать новый функционал
04.12.2008  Компания «Русские Информационные Технологии» подготовила бета-версию программы «Печать конвертов!»
04.12.2008  Телефон премиум-класса с двумя SIM-картами
04.12.2008  High-end десктопы Asus Eee Box
04.12.2008  Видеокарта NVIDIA Quadro FX 4800 для профессионалов
04.12.2008  Экстремальные внешние HDD от Iomega
04.12.2008  MSI EX300 - 13.3 дюйма для развлечения
04.12.2008  SATA 3.0 появится в следующем году
04.12.2008  Mini-ITX-плата Zotac на основе логики NVIDIA и с поддержкой Wi-Fi
04.12.2008  Корпус NZXT Zero 2: улучшенное охлаждение и строгий дизайн
04.12.2008  Конвертеры: Xilisoft Video Converter v.5.1.7.1128
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100