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

URI

Html (ЖЖ)

BB-код (Для форумов)

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

Вы должны войти, чтобы оставить комментарий.