|
| |||||||||||||||||
PHP и WEB для новичков (часть 9):Команды SQLАвтор: Владислав Демьянишин
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):
Рис. 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
| ||||||||||||||||||
|
||||||||||||||||||