- •Оглавление
- •Что такое интернет
- •Готовимся к созданию Web-страниц
- •Железо, железо и еще раз железо...
- •Домашняя эргономика — безопасность прежде всего!
- •Программное обеспечение для Web-мастера
- •Выбор хостинга
- •Знакомьтесь — РНР
- •История создания РНР
- •Установка РНР
- •Настройка РНР для Apache
- •Виртуальные хосты в Apache
- •Тестирование РНР
- •Установка и настройка дополнительных модулей
- •Переносимость и совместимость
- •Синтаксис РНР
- •Возможности РНР
- •Работа с базами данных
- •HTTP-аутентификация средствами РНР
- •Работа с изображениями
- •Поддержка закачки файлов
- •Поддержка HTTP-cookie
- •Использование регулярных выражений
- •Обработка ошибок
- •Управление электронными письмами
- •Вывод на экран и переменные в РНР
- •Простейшие арифметические операции
- •Простейшие логические операции
- •Циклы
- •Массивы
- •Работа со строками
- •Сессии
- •Программирование на РНР
- •Сравнение чисел
- •Вложение файлов в документ
- •Простейший счетчик посещений
- •Обработка форм
- •Отправление почты
- •Отправление письма в HTML-формате
- •Дата по-русски
- •Счетчик посещений с использованием базы данных
- •Счетчик персональной посещаемости
- •Сохраняем информацию о посещениях
- •Ах, баннеры, баннеры...
- •Счетчик посещений с выводом информации на экран
- •Счетчик сессий
- •Создание динамического меню
- •«Грабим» странички
- •Голосование на сайте
- •Гостевая книга
- •Технология создания
- •Свой чат — это просто
- •Использование специального привата
- •Интернет-магазин
- •Технология создания
- •Сервисы интернет-магазина
- •Архив рассылок
- •Совет первый: а нужно ли вам это?
- •Совет второй: забудьте все советы
- •Пример системы безопасности
- •HTTP-аутентификация в РНР
- •Защита программы
- •РНР в вопросах и ответах
- •Приложения
- •Приложение 3. Некоторые функции РНР
- •Приложение 4. Cookie
- •Приложение 5. Методы передачи данных POST и GET
- •Приложение 6. Время Unix
170 |
Программирование на РНР |
Хорошим тоном считается наличие кнопки, очищающей разговоры в привате. Также желательно чтобы после выхода файл удалялся с сервера.
Проявите свою фантазию и попробуйте усовершенствовать приведенную схему.
Интернет-магазин
Технология создания
Сделать несложный интернет-магазин самому, как ни странно, очень просто. Несколько сложнее придумать, как привязать собственный магазин (здесь и далее подразумевается, конечно, интернет-магазин) к конкретным товарам. Например, есть набор канцтоваров в количестве 1000 наименований. Прайс с информацией о товарах обновляется практически ежедневно, и не просто обновляется, а кардинально. Причем изменяются не только цены, что еще полбеды, но и виды товаров, их описания, сроки гарантии и поставок и т.д. Попробуйте вносить все эти данные в свой магазин ежедневно, и вы сразу проникнитесь уважением к тем людям, которые делают такую работу. Именно обновление данных в магазине и занимает основную часть собственно самой программы. Это то, что необходимо продумать в первую очередь.
Прежде чем вы начнете делать свой магазин, необходимо досконально изучить прайс товаров и способы его обновления в оригинале. Допустим, есть фирма, в ассортименте которой компьютерные товары. Их достаточное количество, чтобы не заниматься обновлением вручную, а придумать систему для синхронизации данных прайса и магазина.
Пусть прайс у нас будет набран в программе Excel (как правило, это не так, многие фирмы используют в работе специальные программы, например «1С: Бухгалтерия», но это не важно, так как данные из таких пакетов всегда можно импортировать в Excel). Количество разделов в прайсе и товаров в них не фиксировано, а сам прайс представляет собой набор строк и колонок. В каждой
Интернет-магазин |
171 |
|
|
|
|
строке — товар или наименование раздела прайса (например, процессоры, память, мыши и т.д.). Количество колонок не имеет значения, обычно присутствуют наименование, описание и цена товара. Впрочем, могут быть и другие варианты.
Что и как можно использовать, имея такие данные? Конечно, существуют специальные модули для выборки данных из файла формата Excel (различные для разных языков программирования), но такие модули, как правило, не являются бесплатными, а значит, неприемлемы для нас. Кроме того, существует проблема настройки этих модулей. Иногда, чтобы это сделать, нужно обладать такой квалификацией, что проще самому все написать с нуля :-) Впрочем, эти модули и не нужны на самом деле. Что представляет собой наш прайс? Правильно, набор строк и колонок, причем строго организованных. А значит, из таких строк и колонок можно построить текстовый файл с точно такой же структурой. Только вместо визуального разделения строк и колонок (как в Excel) надо использовать какие-либо символы. Конечно, в этом случае внешний вид сильно изменится, так как длина строк всегда разная, но это и не важно, ведь структура останется прежней. Это будут все те же строки и колонки, только уже в текстовом формате, который очень легко прочитать и обработать при помощи практически любого языка программирования.
Excel умеет сохранять свои файлы в разных форматах. Нас будет интересовать сейчас формат «текстовый файл с разделителями». Тип разделителя не важен, в их качестве можно использовать даже запятые или пробелы. Мы же остановимся на табуляции.
Вот что у нас получилось: файл *.txt, в котором строки разделены переводом строки (это простой Enter), колонки разделены символами табуляции. Структура прайса осталась прежней, так как об этом позаботился мастер сохранения Excel.
Вот мы и нашли способ не заниматься рутинной работой по ежедневному обновлению прайса в нашем интернет-магазине, а максимально автоматизировать этот процесс. Перед тем как начинать работать с полученным файлом, можно подумать, как его немного сжать или обработать. Это бывает необходимо для
172 |
Программирование на |
того, чтобы удалить ненужные колонки, повторяющиеся пробелы, временно отсутствующие в наличии товары и т.д.
Для этого надо считать файл в массив, обработать каждую строку на предмет наличия ненужной информации, записать полученный результат опять в массив на то же место и, наконец, весь массив записать в файл. Однако исходите из конкретной необходимости таких операций, вполне возможно достаточно просто удалить повторяющиеся пробелы.
Когда все готово, пора приступать к выборке данных из нашего текстового файла с прайсом. Сначала нужно считать файл в массив:
$file = "price.txt";
$tovar = file ($file);
Дальше надо обработать массив $tovar [] в цикле с выводом результатов работы на экран:
$i = 0; // счетчик начинается с нуля
while ($i < count ($tovar)) : // открыли цикл до последнего // элемента в массиве
echo $tovar[$i]; // выводим строку на экран
echo "<br>"; // не забываем про перевод строк
$i++; // увеличиваем счетчик на единицу
endwhile; // заканчиваем цикл
Вот самый простой вариант вывода прайса. Он, правда, обладает существенным недостатком — весь прайс выводится за один раз, причем все колонки в одной строке. А это неприемлемо по эстетическим причинам.
Правильнее предоставить клиенту возможность выбора раздела прайса.
Сначала нужно отделить разделы прайса от информации о товаре. Это можно сделать, если обратить внимание на то, в какой из колонок находится название раздела. Как правило, в той же, что
Интернет-магазин |
173 |
и название товара. Но в строке с названием раздела нет информации о цене товара, а это может служить хорошим отличительным признаком для программы. Достаточно каждый раз проверять наличие в выбранной строке колонки цен. Если колонка пустая, значит, в строке — название раздела, и его можно вывести на экран, если нет — это товар, такую строку просто пропускаем, если надо выводить только названия разделов. И наоборот — для вывода только товаров. Программа просматривает в цикле строки файла. Если в колонке с ценой не пусто — это товар, и его надо вывести на экран, предварительно отформатировав информацию. Если же пусто — это начало следующего раздела прайса, и обработку надо прекратить, так как цель достигнута: весь выбранный посетителем раздел выведен на экран.
Нам надо продумать возможность просмотра конкретного раздела прайса. Можно, например, выводимые наименования разделов прайса сделать ссылками, в качестве параметра которых указать информацию о том, с какой строки начинается данный раздел. Немного модернизируем наш алгоритм вывода разделов прайса таким образом, чтобы после нажатия на ссылку-наиме- нование раздела запускалась другая программа, которая начинала бы просмотр файла с прайсом не с начала, а с того места, которое передано по ссылке в качестве параметра, и уже выводила бы не разделы прайса, а цену, наименование, описание товаров и т.д.
Обязательно необходимо продумать удобную навигацию: ваш посетитель не должен заблудиться. На каждой странице должна быть ссылка на начало прайса и на список его разделов. Неплохо предоставить возможность перехода на следующий и на предыдущий разделы прайса прямо из списка товаров.
Теперь о том, как разделить информацию в выбранной строке по колонкам. Отведем каждой колонке свою переменную. Если колонок в прайсе пять, то и переменных надо зарезервировать пять. Чтобы не запутаться, возьмите похожие имена: $n_1, $n_2, $n_3, $n_4, $n_5. Теперь, если нужная строка находится в массиве $ tovar[ $ i], достаточно применить такую конструкцию:
174 |
Программирование на РНР |
l i s t ( $ n _ l, $n_2, $n_3, $n_4, |
$n_5) = s p l i t <"\t", |
$ t o v a r [ $ i ] ) ; |
|
И если колонки были разделены символом табуляции, они распределятся каждая в свою переменную. Если вы использовали другой разделитель колонок, вам надо указать его вместо " \ t " .
Теперь легко проверить наличие цены, а также отсортировать и отформатировать данные прайса нужным образом. Однако этого еще не достаточно для полноценного интернет-магазина, так как он подразумевает возможность заказа выбранных товаров.
Мы подошли к очень интересной теме — «виртуальная корзина». Если вы пробовали заказать товар на различных сайтах, то могли заметить, что работа корзины реализована по-разному. Что нужно обычному посетителю от интернет-магазина? Правильно, купить товар. А что ему для этого требуется? Удобная навигация, легкий и быстрый доступ к товарам, возможность изменить количество товара одного наименования в корзине, удалить товар из корзины, получить информацию о товаре (описание с фотографией и цена). Ограничимся этим необходимым минимумом, так как увеличение доступных функций отрицательно сказывается на быстродействии и существенно усложняет программу.
Итак, как можно сохранять информацию о товаре в корзине покупателя? Можно попросить покупателя зарегистрироваться в системе, но это может сократить количество посетителей магазина.
Подумайте: как относитесь к регистрации вы сами, часто ли хочется оставлять свои данные на сомнительных сайтах? Вот именно, очень не хочется. А значит, надо иметь очень веские причины, чтобы ввести регистрацию. Такими причинами могут быть: наличие постоянного круга покупателей, товар, пользующийся повышенным спросом, и т.д.
Мы же не будем останавливаться на регистрации, так как она в принципе ничего не меняет. Для сохранения информации о посетителе, в частности информации в корзине пользователя, будем использовать сессии РНР.
Интернет-магазин |
|
175 |
Нам нужно решить, что именно хранить в cookie. Можно — всю информацию о товаре, а можно только цифровой идентификатор и количество. Делайте, как вам проще.
Цифровой идентификатор занимает не очень много места в памяти, однако учтите, что с ним больше хлопот в смысле программирования. Придется писать код сопоставления идентификатора и выборки информации из файла прайса.
Обратите внимание еще на один момент. Если прайс очень часто меняется, информация в корзине покупателя может быстро устареть и не соответствовать действительности. Значит, стоит подумать о контроле даты. Дату, когда посетитель положил товар в корзину, тоже придется хранить в cookie, так как больше негде. Если эта дата сильно отличается от текущей, стоит предупредить покупателя о несоответствии, иначе могут произойти досадные казусы. Неприятно, когда заказ делается по цене недельной давности. Она ведь может не только упасть, но и увеличиться! Потом придется объясняться. Лучше позаботиться о таких вещах заранее. Хотя, если прайс более-менее постоянный, беспокоиться не стоит.
Цифровым идентификатором очень удобно выбрать номер позиции в прайсе. Этот номер — уникальный для каждого товара. По номеру позиции легко можно извлечь информацию о товаре из текстового файла с прайсом. Достаточно считать весь файл в массив:
$file = "price.txt"; $as = file ($file);
И обратиться к строке массива с нужным индексом:
$info = $as[$id];
$id — идентификатор, который нам нужен. Правда, применяя данный метод, нам не избежать контроля дат, но это не так уж и плохо.
Вместе с идентификатором товара надо запоминать и количество товара. По умолчанию при первом заказе вводится число 1. Дальше желательно предоставить возможность (в ограниченных
176 |
Программирование на РНР |
рамках, конечно) изменять это число. Для пересчета суммы понадобится кнопка. Если она будет в HTML-коде указана после формы, сработает и нажатие на клавишу Enter.
Кроме того, на странице работы с корзиной обязательно надо предусмотреть возможность окончательно оформить заказ или заказать что-то дополнительно. Это можно сделать и кнопками, и ссылками — что вам больше нравится.
Конечно, необходимо продумать, как именно выводить информацию о полной стоимости заказа. Не стоит забывать о скидках и подарках, если они, конечно, есть в вашем интернет-ма- газине. Хорошо впишутся сюда различные бонусы и информация о доставке. Если она бесплатная — напишите об этом. Лишним не будет.
Наконец, оформление формы заказа. Стандартные поля — имя, адрес, телефон, почтовый ящик и т.д. Чем меньше, тем лучше. Обязательно должно быть поле примечания — оставьте клиенту возможность высказать свои пожелания. Здесь же должна присутствовать вся информация о заказанном товаре, его стоимости и самая главная кнопка — «Заказать».
Если нет регистрации, можно введенные данные запомнить (как вы понимаете, при помощи cookie) и при следующем заказе просто подставить. Клиент будет благодарен, поверьте.
После того как заказ оформлен и подтвержден, обязательно скажите спасибо клиенту за покупку и выведите еще раз информацию о заказе на экран. При этом не забудьте очистить корзину — она уже выполнила свою функцию. Вот и все. По крайней мере, для покупателя.
Теперь перейдем к внутренним процессам, происходящим при заказе. Для хранения информации обо всех заказах нужно создать служебный файл. В него будут заноситься все данные о заказах. Причем записывать уже надо не идентификаторы, а полную информацию — название, цену и т.д. (надеюсь, места у вас на хосте много). Так удобнее потом просматривать и обрабатывать. Для этого просто дописываем специальным образом сформированную строку в конец файла. Прочитать такой файл мож-
