|
|
Система "Совет дня". Часть 1.Основная идея такой системы состоит в том, что имеется возможность "зготовить" советы впрок. Т.е. совсем не обязательно каждый день тратить время на пополнение базы информации. Код позволяет показывать пользователям только те советы, которые уже "вышли в свет". При реализации использованы: PHP v3.14 и mySQL v3.21.29. Для реализации этой идеи нам необходима только одна таблица, которая содержит следующие поля:
| ||||||
title | varchar(50) | Название | ||||
text | text | Текст совета |
Проиндексировать данную таблицу лучше всего по полю startdate, так как все выборки будут происходить именно по этому полю. Индексирование позволяет оптимизировать работу базы данных при выборках по индексному полю.
Данная таблица создается следующими инструкциями SQL:
CONNECT; # соединение с mysql на localhost USE TEST; # выбор базы данных # далее создание таблицы в базе TEST CREATE TABLE tipoad ( startdate date DEFAULT '0000-00-00' NOT NULL, title varchar(50) NOT NULL, text text NOT NULL, KEY startdate (startdate), UNIQUE startdate_2 (startdate) );
Команды эти можно ввести в утилите mysql.exe, входящей в состав дистрибутива mySQL, но я рекомендую использовать для администрирования базы mySQL пакет phpMyAdmin, который позволяет управлять базами из окна браузера в удобной форме.
Для того, чтобы начать работать с таблицей из PHP необходимо установить соединение с базой. Делается это с помощью функции mysql_connect(string [hostname] [:port] , string [username] , string [password] ). Все параметры являются необязательными. Обычно, значение параметра hostname указывает на "localhost", а имя пользователя и пароль выдаются администратором сервера. Кроме того администратор может выделить вам отдельную базу. Ее название нам понадобиться, так как следующим шагом мы должны выбрать эту базу для работы командой mysql_select_db(string database_name, int [link_identifier]). Функция mysql_connect() в случае успешного соединения возвращает целое число, которое является идентификатором соединения. Именно его можно подставить в функцию mysql_select_db() в качестве параметра link_identifier. Если вы используете только одну базу на одном хосте, то вам, абсолютно не обязательно использовать этот параметр. его можно опустить.
Предположим, что вам выделена база с именем test (она, практически, всегда присутствует и не требует задания имени пользователя и пароля, но использовать ее для работы не рекомендуется). Имя пользователя: john, пароль: dark. Тогда код инициализации работы с базой данных будет выглядеть так:
if (mysql_connect("localhost", "john", "dark")) { if (!mysql_select_db("test")) { echo "<B>Error selecting db!!!</B>"; exit(); } } else { echo "<B>Error connecting!!!</B>"; exit(); }
Здесь приведен код с использованием проверок на правильность соединения и выбора базы. Обе рассмотренные функции возвращают false в случае какой-либо ошибки. Более подробную информацию об ошибке можно получить из функции mysql_error().
Далее предположим, что у нас в таблице уже имеются какие-либо данные. Занести их можно, воспользовавшись упомянутым выше пакетом phpMyAdmin.
Работа с SQL-базами данных строится на понятии SQL-запрос (далее "запрос"). Например, чтобы получить все данные из таблицы tipoad, используется запрос SELECT * FROM tipoad. Если вы введете этот запрос в командной строке программы mysql.exe, то должны увидеть нечто похожее на:
+------------+----------------------------------+------+ | startdate | title | text | +------------+----------------------------------+------+ | 2000-01-27 | -Єшыш Є¤ур <PRE> т NN. | | | 2000-01-28 | +ЄъЁ_Єшх фюъєьхэЄр т эютюь юъэх. | | | 2000-01-29 | -хё°ютэ_х Їшы№ЄЁ_. | | | 2000-01-30 | +тхЄ Їюэр т Netscape | | | 2000-01-31 | -рьър эр ёё_ыърї т IE. | | +------------+----------------------------------+------+ 5 rows in set (0.00 sec)
Здесь я специально опустил значения поля text, так как они занимают много места. А "каша" из символов в поле title вызвана тем, что данные хранятся в кодировке Windows 1251, а вывод их происходит в программе, работающей в 866 кодовой таблице.
Для того, чтобы в скрипте получить данные, выдаваемые запросом используется две функции: mysql_query() и mysql_fetch_array(). В первую необходимо передать два параметра string query, int [link_identifier]. Второй параметр в нашем случае можно опустить, так как у нас всего одно соединение. Эта функция возвращает переменную целого типа. Эту переменную можно использовать, как индикатор об ошибке. Например так:
$result = mysql_query("SELECT * FROM tipoad"); if ($result) { ... } else { echo "<B>Error: ".mysql_error(); exit(); }
Далее мы должны получить данные в массиве. Это делается функцией mysql_fetch_array(). Здесь ограничимся одним параметром $result, заданным при вызове функции mysql_query():
$tip = mysql_fetch_array($result);
Этот код "достает" строку из результатов выполнения запроса и помещает данные в ассоциативный массив $tip. Т.е. для того, чтобы обратиться к полю title, можно использовать код $tip["title"]. После этого внутренний указатель в переменной $result сдвигается на следующую строку. Если обработана последняя строка, то $tip принимает значение false. Т.е. для того, чтобы обработать все строки результата, мы можем использовать слудующий код:
while ($tip = mysql_fetch_array($result)) { echo $tip["title"]."<BR>"; }
Но нам необходимо получить только один ряд данных. Для этого мы модифицируем запрос таким образом: SELECT * FROM tipoad WHERE startdate = NOW(). Проще всего понять это можно, переведя дословно на русский язык: выбрать значения всех полей (*) из таблицы tipoad, у которых значение startdate равно значению функции NOW(). Функция NOW() соответствует текущей дате, установленной в системе.
Теперь соберем весь код вместе:
if (mysql_connect("loclhost", "john", "dark")) { if (!mysql_select_db("test")) { echo "<B>Error selecting db!!!</B>"; exit(); } } else { echo "<B>Error connecting!!!</B>"; exit(); } $sql = "SELECT * FROM tipoad WHERE startdate = NOW()"; $result = mysql_query(sql); if ($result) { ... } else { echo "<B>Error: ".mysql_error(); exit(); } $tip = mysql_fetch_array($result);
Теперь в массиве $tip мы имеем все поля, соответствующие совету текущего дня. И мы можем использовать их для вывода в документ. Например, так:
<H1><?php echo $tip["title"]; ?></H1> <P><?php echo $tip["text"]; ?></P>
Но может так случиться, что в таблице не окажется совета, соответствующего сеогдняшнему дню. Как с этим бороться мы рассмотрим в следующем опыте.