http://sulfurzona.ru/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Wing-Thunder Game (fly simulator)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
Скачать игру Крыло-Гром (Wing-Thunder) бесплатно
 
 

PHP и WEB для новичков (часть 9):

 

Команды SQL

 
Автор: Владислав Демьянишин
 
PHP и WEB для новичковSQL - это очень простой и одновременно очень мощный язык запросов для баз данных.
 
Сначала выясним, что можно делать при помощи языка SQL. Во-первых, можно находить данные в БД по некоторым условиям. Во-вторых, добавлять данные в базу и удалять их оттуда. В-третьих, изменять данные.
 

Вставка в таблицу

 
В первую очередь давайте научимся добавлять данные, чтобы потом было что искать, изменять и удалять. Открываем страничку http://localhost/phpMyAdmin и выбираем базу multimedia и таблицу mp3. Переходим на вкладку Вставить и добавляем первую попавшуюся нам на глаза любимую композицию, например, так:
 
filename: morandi_-_save_me.mp3
title: Save Me
bitrate: 320
filesize: 10967632
year: 2007
 
Тогда получим следующий SQL-запрос:
 
INSERT INTO `mp3` ( `filename` , `title` , `bitrate` , `filesize` , `year` ) VALUES ( 'morandi_-_save_me.mp3', 'Save Me', '320', '10967632', '2007');
 
Слово INSERT является командой SQL и служит для вставки записи в таблицу. Упрощенный ее формат такой:
 
INSERT INTO имя таблицы (список полей) VALUES(список значений)
 
phpMyAdmin берет имя таблицы, названия полей и значения в одинарные кавычки. Но это обязательно лишь тогда, когда значение является текстовой строкой или название поля или таблицы совпадает с командой SQL или другим служебным словом.
 
Попробуем теперь самостоятельно составить SQL-запрос для вставки второй записи. Для этого перейдем на вкладку SQL и в появившейся области для ввода выполняемого запроса наберем следующий текст запроса (одной строкой без переводов строки):
 
INSERT INTO mp3( filename, title, bitrate, filesize, year ) VALUES ( 'Modern Talking - Angie''s Heart.mp3', 'Angie''s Heart', 160, 4249079, 1998 )
 
Хочу обратить ваше внимание на то, что в имени файла и песни содержится одинарная кавычка. Чтобы не возникло ошибки при выполнении SQL-запроса, следует кавычку продублировать. Однако в дальнейшем PHP-коде строчные параметры следует перед посылкой на сервер БД обрабатывать функцией addcslashes(), но лучше функцией mysql_real_escape_string().
Это необходимо делать, поскольку если в названии песни встретится апостроф (одинарная кавычка), то сервер баз данных воспримет этот апостроф как окончание строчного параметра, что вызовет ошибку.
Поэтому апострофы следует слешевать - добавлять перед ними обратный слеш, что и делают обе эти функции. Теперь перейдем на вкладку Обзор и посмотрим, что у нас содержится в таблице (рис. 12):
 
PHP и WEB для новичков (часть 9): Команды SQL
Рис. 12
 
Теперь следует разобраться, как добавлять строки из php-скрипта. Сначала создадим возможность скрипту обращаться к серверу БД и выполнять запросы.
Для этого перейдем на главную страницу phpMyAdmin (http://localhost/phpMyAdmin/) > кликнем по ссылке Пользователи > под таблицей в поле Проверить привилегии БД выберем в выпадающем списке нашу БД multimedia, вводим имя пользователя multimedia_user и пароль, например, 12345 (позорно слабый пароль, но для обучения сгодится) и ставим галочки для всех привилегий и нажимаем кнопку Пошел.
 
Пользователя создали. Теперь необходимо присоединить его к нашей БД multimedia иначе ничего не выйдет. Заходим Пользователи > напротив пользователя multimedia_user кликаем Права > включаем маячок БД и рядом с ним выбираем из выпадающего списка multimedia > ниже кликаем по ссылке Отметить все и нажимаем кнопку Пошел.
После этого php-скрипты смогут подключаться к серверу под именем пользователя multimedia_user и указанным паролем 12345.
 
<?
$link = @mysql_connect("localhost", "multimedia_user", "12345");
if(!$link){
   echo "невозможно подключиться к серверу: ".mysql_error();
   exit;
  }
if(!mysql_select_db("multimedia")){
   echo "невозможно подключиться к БД: ".mysql_error();
   exit;
  }
$res = mysql_query("SELECT * FROM mp3 WHERE title='All I Want'");
if(!mysql_num_rows($res))
   mysql_query("INSERT INTO mp3(filename, title, bitrate, filesize, year) VALUES('La Bouche - All I Want.mp3', 'All I Want', 320, 9588606, 2006)");
?>
 
В первой строке этого скрипта авторизуемся (входим, логинимся) и подключаемся к серверу БД. Функция mysql_connect() в данном случае принимает три параметра: адрес сервера БД (по умолчанию localhost), имя пользователя и пароль.
 
Эта функция возвращает дескриптор связи с сервером - что-то наподобие файлового дескриптора, который мы рассматривали при работе с файлами. Если соединения не произошло по какой-то из причин (неверный пароль, сервер не работает, доступ запрещен), то mysql_connect() возвращает false.
 
Надо сказать, что mysql_connect() в случае неудачи не только возвращает false, но и приведет к выдаче сообщения об ошибке прямо в веб-страницу. Чтобы этого не происходило, можно выключить этот вывод знаком @ перед именем функции. Причем этот способ работает и для многих других функций.
 
Далее проверяется состояние подключения к серверу, и если в переменной $link значение false, то выдаем сообщение об ошибке самостоятельно (текст ошибки получаем функцией mysql_error()) и прерываем выполнение скрипта функцией exit.
 
Дальше пытаемся подсоединиться к БД multimedia функцией mysql_select_db(), указывая в качестве параметра имя БД. Она тоже возвращает false в случае неудачи, но не выдает сообщений, так что знак @ тут не нужен. Проверяем, удалось ли подключиться к БД, и если нет - выдаем сообщение и прерываем выполнение скрипта функцией exit.
 
После подключения к серверу и к БД PHP-скрипт может выполнять SQL-запросы. Функция mysql_query() выполняет SQL-запрос и возвращает результат его выполнения.
Сначала делаем проверку, существует ли в таблице запись с названием песни, которую будем вставлять в таблицу (как работает команда SELECT, я расскажу чуть позднее). Если такой записи нет, то выполняем SQL-запрос "INSERT INTO mp3(..." и т.д.
 
Попробуем запустить этот скрипт. В случае успеха скрипт ничего не выводит, а если в phpMyAdmin просмотреть таблицу в закладке Обзор, то увидим, что в таблице появилась новая запись.
Добавлю, что в тексте запроса после названия таблицы список полей можно опустить, если после слова VALUES значения следуют в том самом порядке, в котором они были записаны при создании таблицы и в том же количестве. Т.е. нет ошибки в запросе:
 
INSERT INTO mp3 VALUES('mysong.mp3', 'My Song', 128, 2000000, 2008)
 
Тем не менее, я бы рекомендовал всегда указывать список полей, поскольку количество и порядок полей в таблицах больших проектов может со временем меняться, и тогда будет неприятно переписывать кучу кода.
 

Выборка из таблицы

 
Теперь рассмотрим поиск в таблицах и выборку необходимых данных. Она выполняется командой SELECT. Ее общий формат:
 
SELECT список полей FROM имя таблицы WHERE условие
 
Например, если мы хотим выбрать все поля title из таблицы mp3, то следует выполнить следующий запрос:
 
SELECT title FROM mp3
 
Если мы хотим выбрать данные из полей title и year, то следует выполнить:
 
SELECT title, year FROM mp3
 
Для выбора всех полей:
 
SELECT * FROM mp3
 
Пришло время изучить запросы с условием. Работает условие аналогично условному оператору if() в PHP, но предваряется служебным словом WHERE, например:
 
SELECT * FROM mp3 WHERE year<1998
 
В результате получим записи с песнями, датированными ранее 1998 года. Аналогично в условиях строятся логические выражения, но вместо операций &&, ¦¦, ! в PHP, в SQL применяются соответственно служебные слова AND, OR, NOT, например:
 
SELECT * FROM mp3 WHERE year>1998 AND title<>'Save Me'
 
Разница есть и в знаках сравнения. "Равно" - "=", а "не равно" - "<>", а не "!=", как в PHP. Предлагаю самостоятельно вставить несколько записей в таблицу mp3 и попрактиковаться в составлении SQL-запросов.
Наконец, о том, как же делать выборки данных в PHP-скриптах. Рассмотрим пример:
 
<?
$link = @mysql_connect("localhost", "multimedia_user", "12345");
if(!$link){
   echo "невозможно подключиться к серверу: ".mysql_error();
   exit;
  }
if(!mysql_select_db("multimedia")){
   echo "невозможно подключиться к БД: ".mysql_error();
   exit;
  }
$res = mysql_query("SELECT * FROM mp3");
 
echo "все названия из таблицы mp3:<br />n";
echo "<ol>n";
for($i=0; $i<mysql_num_rows($res); $i++){
     $title = mysql_result($res, $i, "title");
     echo "<li>$title</li>n";
    }
echo "</ol>n";
 
echo "все даты:<br />n";
echo "<ol>n";
 
for($i=0; $i<mysql_num_rows($res); $i++){
      $year = mysql_result($res, $i, "year");
      echo "<li>$year</li>n";
    }
echo "</ol>n";
 
$res = mysql_query("SELECT * FROM mp3 WHERE ".date("Y")."-year<5");
 
echo "песни, которым меньше 5-ти лет:<br />n";
echo "<ol>n";
for($i=0; $i<mysql_num_rows($res); $i++){
      $title = mysql_result($res, $i, "title");
      $year = mysql_result($res, $i, "year");
      echo "<li>$year: $title</li>n";
    }
echo "</ol>n";
?>
 
Первые строки скрипта должны быть уже понятны - подключение к серверу и БД. Дальше уже интереснее. Функция Функцуя mysql_query() выполняет запрос и в случае успеха возвращает результат в переменной $res.
Этот результат (его еще называют резалтсетом) состоит, как и таблица БД из строк, а каждая строка состоит из полей. Узнать количество полученных строк можно функцией mysql_num_rows(). Таким образом, организуется цикл перебора всех строк полученного результата выборки.
 
В цикле функцией mysql_result() получаем значение поля title из каждой строки результата. Первым параметром эта функция принимает результат выборки по запросу (значение, возвращенное функцией mysql_query()), вторым параметром индекс строки (отсчет от нуля), а третьим параметром номер или имя поля.
Обратите внимание, что строки и поля в результате выборки нумеруются с нуля. Т.е. вызов mysql_result($res, 0, 0) вернет значение первого поля первой строки из результата $res. Короче, в данном цикле выбираем и выводим значение поля title для каждой строки результата.
 
В следующем цикле выполняется то же самое, только по отношению к полю year. Обратите внимание, что мы не повторяем запрос, а пользуемся результатом предыдущего.
Третий цикл уже сложнее - в нем есть условие, где функция date("Y") возвращает текущий год, например, 2008, и запрос станет выглядеть как
 
SELECT * FROM mp3 WHERE 2008-year<5
 
В итоге для каждой записи таблицы будет проверяться условие, где сначала будет выполнено вычитание даты песни из числа 2008, а потом разность будет сравниваться с числом 5.
В итоге получим список песен, которым меньше 5-ти лет. После выполнения этого запроса следует уже знакомый цикл извлечения значений полей year и title из каждой строки результата запроса. В браузер будет выведено следующее:
 
все названия из таблицы mp3:
1. Save Me
2. Angie's Heart
3. All I Want
все даты:
1. 2007
2. 1998
3. 2006
песни, которым меньше 5-ти лет:
1. 2007: Save Me
2. 2006: All I Want
 
Хочу отметить, что в скрипте вместо первого запроса
 
SELECT * FROM mp3
 
вполне можно воспользоваться запросом
 
SELECT year, title FROM mp3
 
поскольку из результата запроса скрипт все равно считывает только поля title и year, и, значит, в данном случае все поля считывать из БД просто нет необходимости. Это я к тому, что если бы наша таблица mp3 содержала сотни тысяч записей, то экономия процессорного времени и трафика сетевого канала сервера БД будет существенной.
К тому же я нарочно указал в примере целых три цикла, хотя с поставленной задачей мог бы справиться и один цикл считывания данных. Мне хотелось показать, что один и тот же результат запроса может быть использован в скрипте многократно.
 

Правка таблицы

 
Надеюсь, с выборкой теперь все ясно. Теперь пришло время разобраться с изменением данных в таблице. Оно осуществляется командой UPDATE:
 
UPDATE имя_таблицы SET список полей и значений WHERE условие
 
UPDATE изменяет значения указанных полей на новые только в тех записях, которые удовлетворяют условию. Например:
 
UPDATE mp3 SET year=1997 WHERE year=1998
 
Этот запрос изменит значение поля year на 1997 во всех записях таблицы, где поле year равно 1998. Или
 
UPDATE mp3 SET year=1997 WHERE title='Save Me'
 
тут уж догадайтесь сами. А такой пример
 
UPDATE mp3 SET filesize=bitrate*100
 
изменит значения поля filesize на значение поля bitrate, умноженное на 100 для всех записей таблицы, (поскольку в запросе не задано условие WHERE).
В php-скрипте эти запросы работают аналогично запросам SELECT и INSERT (что касается функции mysql_query()).
 

Удаление из таблицы

 
И последняя базовая команда SQL - это команда удаления записи из таблицы DELETE:
 
DELETE FROM имя_таблицы WHERE условие
 
Как не сложно догадаться, эта команда удаляет из таблицы все записи, удовлетворяющие условию. Если условие не задано, то удаляются все записи. Пример:
 
DELETE FROM mp3 WHERE bitrate>128
 
А если выполнить запрос
 
DELETE FROM mp3
 
то таблица станет пустой.
 
Продолжение следует…
 
© Владислав Демьянишин
 
 
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ.
 

Журнал > Программирование > PHP и WEB для новичков (HTML, JavaScript, PHP, MySQL) > PHP и WEB для новичков (часть 9): Команды SQL
 
 
 
 
 
 
На главную страницу На предыдущую страницу На начало страницы