CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2003 ГОД

Сервер племени апачей

Артем Cosmic ШМАНЦЫРЕВ cosmic@email.zp.ua

(Продолжение, начало см. в МК № 38-40, 42, 44, 46, 50 (209-211, 213, 215, 217, 221)).
Вот и прошли долгожданные праздники, душа уже не стремится (или почти не стремится :-)) к веселой компании, да и кошелек заметно похудел. Пора бы и делом заняться, и деньжат на новые праздники поднакопить, продав «что-нибудь ненужное» с помощью нашего интернет-магазина, строительство которого мы сегодня и заканчиваем.

Остались нам два файла — большой и трудоемкий фрейм потребительской корзины, а также маленький и интересный файл обновления прайс-листа.

В механизме реализации потребительской корзины прослеживается полная аналогия с обыкновенным магазином: первое, что мы берем, заходя в магазин — это пустая корзина, которую мы, путешествуя между прилавками, наполняем выбранной в отделах продукцией. Вот только в реальном магазине, в отличие от виртуального, мы редко запоминаем цену каждого товара, положенного в корзину, — нас интересует только сумма, которую нам сообщат в кассе при выходе. В интернет-магазине, напротив, покупатель всегда может контролировать стоимость каждого товара и общую сумму. Кроме того, для того чтобы в реале выложить непонравившийся товар, нужно снова возвращаться в отдел, в котором его брали, а в наших огромных супермаркетов это не всегда так просто, как того хотелось бы. В ИМ все проще — нужно только выделить ненужный товар и одним нажатием левой клавиши мыши удалить его из списка потребительской корзины. В общем, прогресс не стоит на месте, делая путешествия в Сети не только (и не столько) развлечением, но и полезным подспорьем в повседневной жизни.

После описания этих и без того очевидных преимуществ хочется подумать о способах их реализации на РНР. Хочется… Но не получается… Все-таки шумные праздники оставили след в душе и в самочувствии, а тут еще и сессия, горячо любимая всеми студентами… Кстати, на сессии (а точнее, на сессиях) придется остановиться подробнее, так как при написании потребительской корзины мы будем использовать одноименный механизм :-).

Немного теории. Сессия в РНР — это промежуток времени, в течение которого пользователь находился на сайте и выполнял те или иные действия. Сессия создается либо автоматически (в случае указания директивы session.auto_start=1 в php.ini), либо принудительно (путем прописывания команды session_start() в теле скрипта). Любая сессия, созданная средствами РНР, имеет уникальный идентификатор, присваиваемый ей при старте и поддерживаемый в течение всей сессии. Идентификатор сессии хранится в куках (cookies) на компьютере пользователя или передается в параметрах адресной строки браузера. Заканчивается сессия так же, как и начинается — либо автоматически (когда пользователь закрывает браузер), либо принудительно (указанием директив session_unset() и/или session_destroy() в теле скрипта).

Итак, с сессиями в РНР разобрались. Хотелось бы верить, что в реальной жизни тоже :-). Теперь плавно переходим к программированию.

Как мы уже договаривались, потребительская корзина будет функционировать в теле правого фрейма нашего ИМ, и запишем мы ее в ранее созданный файл right.phtml. Кроме самой потребительской корзины, дабы уменьшить нагрузку на файловую систему сервера и модемы пользователей, в этот же файл мы запишем и виртуальную «кассу» — маленькое текстовое поле, в которое покупатель введет свои координаты (E-Mail, адрес, телефон и т.п.) Эти данные, а также весь объем заказа, будут высланы на электронный ящик продавца интернет-магазина. Они нам пригодятся при расчетах с покупателем — мы будем знать, что и когда заказывал тот или иной покупатель, после чего сможем связаться с ним и подтвердить заказ в устной или иной форме и обговорить условия поставки товара. Рис. 1Собственно, в серьезных интернет-магазинах покупатель просто заполняет форму, где вводит номер своей кредитной карты и ее реквизиты, а продавец снимает с кредитки определенную в заказе сумму и высылает товар заказчику по заранее определенной схеме поставки. Но нам вряд ли кто-нибудь доверит номер своей кредитки :-), поэтому подтверждать заказ лучше всего по телефону или при встрече с покупателем.

Интернет-магазин с работающей потребительской корзиной будет выглядеть примерно так, как показано на Рис. 1.

Исходный код скрипта я разбил на блоки, каждый из который отвечает за выполнение того или иного действия с корзиной. Вам же останется только объединить блоки в соответствии с номерами строк каждого блока.

Виртуальная корзина в нашем ИМ выполняет следующие функции: добавление и удаление товара, отправка заказа и вывод содержимого корзины в тело страницы. Текущее действие определяется по значению переменной act, которая передается скрипту через URL, откуда мы его (значение) и извлекаем.

Первая функциональная строчка нашего скрипта — старт сессии. Сессия стартует (или продолжается) при вызове функции session_start() без параметров. Функция всегда возвращает значение true и всегда должна находиться в самом начале скрипта (по крайней мере до вывода какой-либо информации в тело страницы).

Почти все данные, которые мы извлекаем из массива $HTTP_GET_VARS, передаются скрипту из центрального фрейма. Далее следует обнулить общую сумму заказа, так как она будет заново пересчитана в секции добавления товара, а заодно и первоначальное количество товаров, которое тоже будет меняться в течение сессии.

Все переменные текущей сессии доступны для чтения и изменения через ассоциативный массив $HTTP_SESSION_VARS (или $_SESSION в версии РНР выше 4.1.0) аналогично переменным, переданным методами GET или POST.

Если переменная $action имеет значение add (то есть «добавить» в переводе на великий и могучий), значит, она была передана из центрального фрейма, а все данные, переданные вместе с ней, следует рассматривать в контексте добавления товара в виртуальную корзину. Этим мы и занимаемся в соответствующей секции скрипта.

В этой секции нет ничего принципиально нового, поэтому подробно останавливаться на ней не буду. Скажу только, что ключевую роль при ее написании (равно как и других в нашей «корзине») играет проработка алгоритма добавления товара (читай «удаления», «отправки заказа», «вывода содержимого»), которую великий Дональд Кнут советовал на первых порах производить карандашом на бумаге. К этому мнению я полностью присоединяюсь :-).

Удаление выбранного товара производится при нажатии покупателем на кнопку Del, при этом в качестве значения переменной $action будет передана строка del («удалить»), соответствие чему мы и проверяем в следующей секции скрипта.

Для того чтобы удалить товар из корзины, мне пришлось прибегнуть к одной хитрости. Проходя с помощью циклов все элементы массива (все продукты в корзине), скрипт выбирает те номера продуктов, которым не соответствует значение on (флажок включен) из переданного ранее массива выбранных для удаления элементов, и заносит их во временные массивы $tmp_names и $tmp_prices. После этого предыдущий массив сессии очищается, и значениям его элементов присваивается новые значения из временных массивов. Эти действия производятся ровно столько раз, сколько элементов было выбрано для удаления; кроме того, количество элементов массива сессии уменьшается на это же число. Хитрость заключается в использовании дополнительных переменных — без них скрипт растянулся бы на лишние несколько десятков строк.

Теперь, когда заказ сформирован, покупатель может отправить его, оставив свои координаты в соответствующем поле и нажав кнопку Send (см. Рис. 1). За отправку заказа отвечает следующий блок скрипта.

При нажатии покупателем кнопки Send скрипту передается значение send (отправить) переменной $action, что и проверяется перед выполнением этого блока. В блоке формируется заголовок письма, в который входит электронный адрес продавца (переменная $to_email), тема письма (переменная $subj) и координаты покупателя (переменная $from, значение которой берется из соответствующего поля на фрейме). В тело письма скрипт вписывает весь список продукции, выбранной покупателем на протяжении текущей сессии. Рис. 2Полученное продавцом письмо будет выглядеть примерно так, как показано на Рис. 2.

Согласитесь, этой информации вполне достаточно, чтобы связаться с заказчиком и обговорить детали предстоящей покупки.

После добавления или удаления товара содержимое сессии, а значит, и самой корзины, изменяется. Следовательно, после каждого действия, выполненного покупателем, содержимое корзины нужно обновить. За это отвечает следующий блок скрипта.

Содержимое корзины выводится в виде таблицы, в каждую строку которой вписывается товар и его стоимость из массива сессии. Последняя строка таблицы — пересчитанная общая сумма заказа (та самая, которую мы обнуляли в начале скрипта).

Последняя функциональная строчка скрипта — функция session_write_close(), с помощью которой производится сохранение данных текущей сессии. Эта функция не является обязательной, так как все данные сессии автоматически сохраняются после завершения работы скрипта, однако нам, привыкшим к порядку программистам, лучше принудительно сохранять сессию, а то мало ли что :-)…

Все. Этим «начинка» нашего интернет-магазина исчерпана. На сладкое я оставил две, на мой взгляд, самые интересные возможности РНР —авторизация и загрузка файлов на сервер, с которыми мы познакомимся в последнем файле нашего ИМ — файле обновления прайс-листа. Ссылку на этот файл мы разместили в верхнем фрейме, сам он называется price.phtml и должен находиться в директории со всеми остальными файлами нашего ИМ. Если его там нет — создайте. А пока вы создаете, я немного пофилософствую :-).

Термин «авторизация» пришел к нам из повседневной жизни. Вспомните, например, последние серии «Каменской» — тот аппарат, который открывал двери сотрудникам после контроля сетчатки их глаз, тоже был в своем роде инструментом для авторизации :-). В нашем интернет-магазине авторизованным будет считаться пользователь, который правильно ввел имя и пароль в ответ на соответствующий запрос сервера. А нужно нам это для того, чтобы никто, кроме владельца ИМ (который уж наверняка знает свое имя и пароль :-)), не мог обновить прайс на сервере. Иначе вместо ликероводочного отдела у нас может появиться, скажем, похоронное бюро :-).

Но здесь не все так просто, как нам того хотелось бы . Дело в том, что для нашего друга апача РНР настроен как .exe-приложение, а авторизация поддерживается только в случае настройки РНР как модуля Apache. Правда, ничего сложного в такой настройке нет. Для этого нам нужно будет немного изменить файл конфигурации сервера httpd.conf и добавить несколько файлов в директорию modules, которая находится в том же каталоге, куда установлен Apache. Все файлы, которые нужно скопировать в modules, идут в поставке с полной версией РНР (это той, у которой размер архива около 3 Мб). Файлы называются mod_php4.c, php4apache.dll и php4ts.dll. После того как все файлы скопированы, перейдите в директорию conf каталога установки Apache и с помощью текстового редактора откройте файл httpd.conf. Все изменения мы будем вносить в этот файл.

Первым делом нужно найти секцию, в которой мы ранее прописывали РНР, и удалить или закомментировать все записанные нами строчки. В принципе, после этого можно вообще удалить РНР из системы — Apache теперь буде работать только с новыми библиотеками, не используя .exe-интерпретатор языка.

Далее в конфигурационном файле ищем секцию, в которой прописаны директивы AddModule, и в самом конце этой секции, после всех стандартных директив AddModule сервера дописываем строчку AddModule mod_php4.c. Теперь ищем секцию, в которой прописаны директивы LoadModule и после нее записываем следующее:

Теперь файл конфигурации можно сохранить, закрыть и забыть :-). При запуске сервера в консольном окне вы должны увидеть надпись типа Apache/1.3.26 (Win32) PHP/4.2.0 running... Это значит, что РНР успешно установился в качестве модуля сервера Apache и теперь может работать с авторизацией и заголовками.

Теперь несколько слов о закачке файлов на сервер. Происходит сие священнодействие :-) (закачка, английский синоним — upload) по протоколу HTTP при подтверждении формы типа multipart/form-data, которая содержит корректно заполненное поле типа file. В скрипте закачки все это будет выглядеть примерно так:

Закачка файла происходит при нажатии пользователем на кнопку Upload, причем происходит она в любом случае! То есть, даже если бы в скрипте не было никакого другого кода, кроме вывода формы, файл все равно бы закачался, не требуя от пользователя никаких других действий. Однако по умолчанию файл закачивается в директорию, которая определена в переменной upload_tmp_dir в php.ini. В блоке if в строчках с 5 по 13 скрипт проверяет, был ли инициализирован ассоциативный массив $HTTP_POST_FILES ($_FILES в новых версиях РНР), и если был, копирует файл из временной upload-директории в директорию нашего ИМ (функция copy) и удаляет файл из временной директории (функция unlink).

Но не забывайте, что все эти действия должны быть выполнены только в случае авторизации пользователя на странице обновления прайс-листа. Авторизация происходит при помощи стандартного заголовка HTTP-протокола, который принудительно передается серверу из нашего скрипта при помощи функции header. Скрипт авторизации выглядит примерно так:

В первых строчках скрипта проверяется условие наличия переменной PHP_AUTH_USER из ассоциативного массива $HTTP_SERVER_VARS и, если такая переменная существует (то есть пользователь зашел на страницу и что-то ввел в окне авторизации, которое появляется перед загрузкой страницы), проверяется корректность введенных данных, после чего в общем случае выполняются какие-то действия (в нашем случае начинается закачка файла). Окно авторизации обычно выглядит так, как показано на Рис. 3.

Если пользователь вводит некорректные имя пользователя и пароль или нажимает кнопку «Отмена» в окне авторизации, скрипт вместо загрузки информационной части страницы выводит сообщение о неудаче авторизации. Вся страница закачки в нашем ИМ будет выглядеть примерно так, как показано на Рис. 4.

Рис. 3   Рис. 4

Ну вот и все. Настала пора подводить итоги. А в итогах мы имеем пусть примитивный, но зато полнофункциональный интернет-магазин, который вам никто не мешает дополнить необходимыми только вам функциями и оформить, как того требует ваш вкус. Дальнейшее поле творчества поистине огромно. В будущем мы попытаемся перевести наш простейший ИМ на более устойчивую основу баз данных с использованием MySQL, который уже, небось, залежался в папочке на диске нашего сервера :-). Кроме того, уверен, вам уже не терпится пройтись по просторам Интернет в поисках единомышленников. До следующей встречи!

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov