Работа с MySQL. Новостная лента для странички

Автор: content Понедельник, Апрель 9th, 2012 Нет комментариев

Рубрика: Язык PHP

Конкретный пример работы с 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 и поставим пароль, чтоб кто попало не лазил.

А теперь думаем, что же надо для нормальной работы с новостями. Форма для ввода новых новостей, обрабочтик формы. Так, а ещё? Список новостей с возможностью тыкнуть в неё, чтобы тут же отредактировать. Потом можно сделать галочки напротив заголовков новостей, чтоб можно было отметить неугодные и грохнуть их тут же (а лучше, чтоб было подтверждение «да/нет»). А потом сделать ввод даты ограниченным: вместо текстовых полей — раскрывающиеся списки, которые бы спасли от опечаток. Много… Но чтобы потом не было мучительно больно…

Детально описывать здесь это не имеет смысла — скачайте файл и разберитесь. К этому выпуску планируется продолжение — новостная лента с рубриками. В общем, заходите ещё.

Ссылка по теме:

Автор: Дмитрий Лебедев

Источник: detail.phpclub.net

Источник: http://www.php.su/articles/?cat=phpdb&page=003

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты