Работа с MySQL. Новостная лента для странички
Автор: Дмитрий Лебедев
Источник: detail.phpclub.net
Конкретный пример работы с 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 и поставим
пароль, чтоб кто попало не лазил.
А теперь думаем, что же надо для нормальной работы с
новостями. Форма для ввода новых новостей, обрабочтик формы.
Так, а ещё? Список новостей с возможностью тыкнуть в неё,
чтобы тут же отредактировать. Потом можно сделать галочки
напротив заголовков новостей, чтоб можно было отметить
неугодные и грохнуть их тут же (а лучше, чтоб было
подтверждение "да/нет"). А потом сделать ввод даты
ограниченным: вместо текстовых полей - раскрывающиеся списки,
которые бы спасли от опечаток. Много... Но чтобы потом не было
мучительно больно...
Детально описывать здесь это не имеет смысла - скачайте
файл и разберитесь. К этому выпуску планируется продолжение -
новостная лента с рубриками. В общем, заходите ещё.
Ссылка по теме: