Конкретный пример работы с mysql - простейшая новостная лента.
1. Создание таблицы
Итак, что нам нужно в новостной ленте? Сам текст новости, дата... ну и пусть ещё у новости будет заголовок. Берём phpmyadmin, создаём базу данных (можно и не создавать). Жмём на её название в списке баз. В правом окне помимо (пустого) списка таблиц текущей БД есть формы действий. Находим форму "создать таблицу". Пишем имя таблицы news, и число полей - нам нужно 4. Вводим информацию о полях таблицы:
Имя поля Тип данных Пустое Дополнительно
news_id mediumint not null auto_increment
(для этого поля надо поставить галочку "первичный")
ntext text not null ntitle varchar(255) ndate datetime not null
Поле news_id не нужно для вывода ленты, но необходимо для администрирования новостей. auto_increment означает автоматическое задание значения поля при создании новой строки таблицы.
В ntext будет храниться сам текст новости. Длина одной заметки может быть до 65 килобайт. Пометка not null означает, что поле не может быть пустым, а при попытке вставить в таблицу строку, в которой поле ntext будет пустым, mysql сильно руганётся.
Заголовок новости - ntitle - пусть будет опциональным. Иногда заголовок просто неуместен, или придумать его сложно. Максимальная длина заголовка в нашей таблице будет 255 символов.
Поле ndate содержит дату и время новости. Естественно, что оно не может быть пустым - по нему идёт сортировка таблицы.
А вот так выглядит запрос на создание таблицы:
create table news (news_id mediumint not null auto_increment, ntext text not null, ntitle varchar(255), ndate datetime not null, primary key(news_id));
Программный код:
$request = "create table ... "; mysql_query($request); if (mysql_error()) echo "Ошибка БД в запросе "$request". mysql пишет: ". mysql_error(); else echo "Таблица создана";
2. Запись новостей
Создаётся новость путём отправки запроса точно так же, как и запроса на создание таблицы или выборки строк. Перед вставкой данных в запрос, их лучше обработать функцией addslashes, чтобы одинарные кавычки mysql воспринял, как часть текста:
mysql_query ("insert into news (ntitle, ntext, ndate) values ('". addslashes($ntitle). "', '". addslashes($ntext). "', now())");
В поле типа date вставляем текущее время функцией now. Если нужно вставить не текущее время, можно сделать так: ..., '". date("y-m-d h-i-s", $date). "', ...
Этот формат - для типа datetime. Если тип данных date, то надо использовать "y-m-d", и если time, соответственно "h-i-s". Переменная $date здесь содержит дату/время, определенные функцией mktime.
3. Вывод новостной ленты
Итак, мы уже соединились с сервером БД и выбрали базу (mysql_connect и mysql_select_db). Теперь осталось вывести записи. Отправляем запрос, проверяем на возможную ошибку и выводим строки.
$request = "select ntext, ntitle, ndate from news";
Теперь бы только отсортировать данные... Изменим в запрос:
$request = "select ntext, ntitle, ndate from news order by ndate desc";
это означает, что сортировка идёт по полю ndate в порядке убывания (descending) даты (2000-12-05, 2000-12-04, ...). Сортировка по возрастанию - префикс asc (ascending), обычно сортировка по возрастанию установлена default и этот префикс использовать не надо.
Теперь выводим ленту:
$request = "select ntext, ntitle, ndate from news order by ndate desc"; $result = mysql_query($request); if (!mysql_error()) {
// Цикл, вынимающий строку как массив с числовым индексом while ($row = mysql_fetch_row($result)) { print("< tr>< td>< h3>". $row[1]. "< /h3>"); print("< font size=-1>". $row[2]. "< /font>"); print("< p align=justify>". $row[0]. "< /p>"); }; }
/* в случае ошибки БД программа выводит сообщение сервера (конечно, можно обойтись без такой проверки, но тогда пользователю посыплются ругательства php). */
else { print ("Ошибка БД в запросе "$request". mysql пишет ". mysql_error()); };
/* если дальше предусмотрено выполнение каких-либо операций, лучше всего сразу очистить память */
mysql_free_result ($result);
Ещё одна полезная вещь: если это новостная лента, скажем, на главной странице сайта, нужно ограничить количество новостей (скаджм 10). И ещё надо, чтоб дата отображалась не как "2000-12-05 22-26-47", а "5.12.2000 22:46":
$request = "select ntext, ntitle, date_format(ndate,'%e.%m.%y %h:%i') as ndate1 from news order by ndate desc limit 10";
Ограничиваем количество новостей ровно десятью, и не надо никаких условий в цикле while. Функция date_format форматирует дату так, как нам надо (буквы - как в функции php date, а "e" - это число месяца без нуля в начале). Почему пишу "as ndate1", а не "as ndate"? Проверьте сами :) (подсказка: см. директиву order by в том же запросе).
Но, господа, это всё было только цветочки. Самое главное, чего пока нет - это возможности администратору работать с новостями, кликая мышкой, а не набирая sql-запросы. Итак,
4. Механизм администрирования - теория В первую очередь рекомендую заняться именно им, чтобы потом не было мучительно больно: новостная лента "почти" готова, только редактирование новости никак не написано, и приходится писать запросы "insert into news..." каждый раз вручную. Можно, конечно, и через хвалёный phpmyadmin писать новости, но это тоже "не то".
В директории с сайтом создаём директорию admin (можно более оригинально - например chief, nachalnik...). Когда сайт будет выложен на www, положим в эту директорию .htaccess и поставим пароль, чтоб кто попало не лазил.
А теперь думаем, что же надо для нормальной работы с новостями. Форма для ввода новых новостей, обрабочтик формы. Так, а ещё? Список новостей с возможностью тыкнуть в неё, чтобы тут же отредактировать. Потом можно сделать галочки напротив заголовков новостей, чтоб можно было отметить неугодные и грохнуть их тут же (а лучше, чтоб было подтверждение "да/нет"). А потом сделать ввод даты ограниченным: вместо текстовых полей - раскрывающиеся списки, которые бы спасли от опечаток. Много... Но чтобы потом не было мучительно больно...
Постоянные ссылки
При копировании ссылка на TeaM RSN обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.