- •Оглавление
- •Что такое интернет
- •Готовимся к созданию Web-страниц
- •Железо, железо и еще раз железо...
- •Домашняя эргономика — безопасность прежде всего!
- •Программное обеспечение для Web-мастера
- •Выбор хостинга
- •Знакомьтесь — РНР
- •История создания РНР
- •Установка РНР
- •Настройка РНР для Apache
- •Виртуальные хосты в Apache
- •Тестирование РНР
- •Установка и настройка дополнительных модулей
- •Переносимость и совместимость
- •Синтаксис РНР
- •Возможности РНР
- •Работа с базами данных
- •HTTP-аутентификация средствами РНР
- •Работа с изображениями
- •Поддержка закачки файлов
- •Поддержка HTTP-cookie
- •Использование регулярных выражений
- •Обработка ошибок
- •Управление электронными письмами
- •Вывод на экран и переменные в РНР
- •Простейшие арифметические операции
- •Простейшие логические операции
- •Циклы
- •Массивы
- •Работа со строками
- •Сессии
- •Программирование на РНР
- •Сравнение чисел
- •Вложение файлов в документ
- •Простейший счетчик посещений
- •Обработка форм
- •Отправление почты
- •Отправление письма в HTML-формате
- •Дата по-русски
- •Счетчик посещений с использованием базы данных
- •Счетчик персональной посещаемости
- •Сохраняем информацию о посещениях
- •Ах, баннеры, баннеры...
- •Счетчик посещений с выводом информации на экран
- •Счетчик сессий
- •Создание динамического меню
- •«Грабим» странички
- •Голосование на сайте
- •Гостевая книга
- •Технология создания
- •Свой чат — это просто
- •Использование специального привата
- •Интернет-магазин
- •Технология создания
- •Сервисы интернет-магазина
- •Архив рассылок
- •Совет первый: а нужно ли вам это?
- •Совет второй: забудьте все советы
- •Пример системы безопасности
- •HTTP-аутентификация в РНР
- •Защита программы
- •РНР в вопросах и ответах
- •Приложения
- •Приложение 3. Некоторые функции РНР
- •Приложение 4. Cookie
- •Приложение 5. Методы передачи данных POST и GET
- •Приложение 6. Время Unix
Интернет-магазин |
177 |
но и в текстовом редакторе, и при помощи специальной служебной программы.
Очень актуальной является своевременность обработки заказов. Я вам подскажу очень хороший метод, позволяющий практически мгновенно узнавать о заказе. И это без необходимости постоянно находиться в интернете и даже выходить в него раз в день. Нам понадобится простой пейджер. Практически все операторы предоставляют возможность отправить электронное сообщение на свой пейджер из интернета. Адрес для отправки выглядит приблизительно так: номер_пейджера@адрес_ оператора.
Если на этот адрес отправить письмо, оно придет на ваш пейджер.
Неплохим вариантом может быть SMS на сотовый телефон, но надо уточнять у оператора, поддерживает ли его сеть такую возможность.
Как видите, на заказ можно отреагировать практически сразу, как только он поступит. Это повышает доверие клиентов к магазину и положительно сказывается на репутации.
Сервисы интернет-магазина
Создавая свой проект в Сети, и особенно это имеет отношение к интернет-магазину, не стоит отказываться от дополнительных возможностей, которые открываются благодаря использованию динамических сайтов. Посетителю всегда приятно ощущать постоянную работу и движение на сайте, а не созерцать «новости» и «новинки» месячной давности. Вы можете даже наработать материал немного вперед и потом по мере наступления сроков или просто по очереди выдавать его посетителям.
Новинки в виде графических баннеров
Одна из наиболее часто используемых в этой области технологий — новинки, оформленные в виде баннеров. Это можно сделать двумя способами.
178 |
, |
Программирование на РНР |
Первый заключается в том, что изображения формируются на лету, при использовании какой-то готовой заготовки для фона
инескольких картинок для основной темы баннера. Кроме картинки, может присутствовать небольшой рекламный текст и цена. Поместить больше информации там, скорее всего, не получится. Зато ничто нам не мешает поставить на такой баннер ссылку,
ив этом случае посетитель, если пожелает, без труда получит более полную информацию о товаре или услуге.
Второй путь — делать изображения уже готовыми, например, в графическом редакторе, и выводить их на экран по очереди, чередуя в зависимости от того, что посетитель просмотрел.
Эти два подхода не принципиально различны, можно использовать или тот, или другой в зависимости от поставленной задачи, а также от предпочтений и возможностей программиста. Первый подход более сложный в разработке, зато потом требует меньше времени на изготовление самих баннеров. Во втором случае наоборот — несложная программа, потом постоянная работа над новыми баннерами. Выбирайте, что вам удобнее.
В РНР для работы с изображениями предусмотрена специальная библиотека GD, которая должна быть подключена к интерпретатору. Подключение сводится к распаковке библиотеки GD в каталог для расширений РНР и включению ее поддержки в файле настроек php.ini, расположенном в каталоге Windows (см. гл. «Установка РНР»).
ВНИМАНИЕ
Обязательно выясните, обеспечивает ли ваш хостинг-провай- дер поддержку этой библиотеки.
Итак, перед нами стоит задача вывода имеющихся изображений по очереди на экран посетителю. Допустим, что готовые баннеры лежат в каталоге banner.
Первое, что нам надо сделать, — просмотреть каталог, где будут размещаться баннеры для показа. Сделать это просто, так как РНР предоставляет массу возможностей по работе с файловой системой сервера. Вот пример:
Интернет-магазин |
179 |
$dir = opendir ("banner/"); while($f = readdir($dir))
{
i f ( ! s t r i s t r ( $ f , " . . " ) a n d $ f ! = " . " )
{ $ t t [ ] = $ f; }
}}
Вэтом отрезке кода мы просматриваем выбранную директорию
ивсе имена файлов, которые там имеются, заносим в массив $ tt . Дальше можно работать уже не с директорией, так как это медленнее, а непосредственно с массивом, который будет содержать точную копию содержимого диска сервера (выбранной директории).
Решение, какой блок баннеров выводить, мы будем принимать на основании показаний счетчика. Счетчик можно хранить на компьютере клиента и показывать каждому посетителю следующий за просмотренным блок баннеров или вести общий для всех учет просмотренных блоков. В первом случае это проще, достаточно установить cookie для посетителя. Второй случай давайте рассмотрим подробнее:
$ttl = file ( "counter.php" );
$str = trim(str_replace ("\n","", $ ttl[0])); $str++;
if ($str >= count($tt) or $str < 0} { $str = 0; }
Считываем файл с показаниями счетчика в массив (или в строку), получаем из него первую строку, предварительно обрезав в ней пробелы и переводы строк. Потом увеличиваем показания счетчика и проверяем, не вышло ли его значение за установленный предел. В нашем случае допустимые значения лежат в пределах от ноля до размера массива, в котором хранятся имена файлов в директории с баннерами. И, если вышло, сбросить счетчик в ноль.
Показания счетчика необходимо снова записать в файл:
$fp = fopen("counter.php", "w");
if ($fp) { $fw = fwrite($fp, $str); fclose ($fp); }
180 |
Программирование на РНР |
Обратите внимание на имя файла, в котором хранится показание счетчика. Точнее, на его расширение. Оно, в принципе, может быть любым. Мы выбрали рнр, чтобы никто не мог получить к нему доступ. И кстати, не забудьте установить этому файлу атрибуты, разрешающие запись в него, иначе ничего работать не будет.
Начинаем работать над массивом имен баннеров:
$str1 = trim{str_replace (".","~", $tt[$str]));
@list ($id_price, $id_ras) = split("~", $str1);
Первая строка удаляет пробелы и переводит символы точки, являющейся разделителем между именем файла и его расширением, в тильду. Дальше раскладываем составляющую имени на собственно само имя и его расширение.
Если расширение очередного файла в каталоге подлежит обработке и выводу, то выводим баннер, если нет — ничего не делаем, пропускаем цикл:
if ($id_ras == "jpg" or $id_ras == "jpeg") {
echo "<img border=0 src=banner/$tt [$str]>"; } else {
В случае пропуска цикла требуется ввести еще одну переменную, что немного усложнит ситуацию:
@$siluro++; }
Дело в том, что некоторые баннеры, возможно, не понадобится выводить на экран, например, в связи с тем, что товара, который рекламирует баннер, нет в наличии. Учтем это в коде. Все, что нам надо, это еще несколько переменных. В самом начале такой части кода поместим следующие строки:
$temp_siluro = @$siluro;
if {@!$siluro} {
После блока чтения списка файлов надо поставить закрывающую скобку, так как этот блок должен выполняться только один раз — тогда, когда переменная $ siluro равна нулю.
Интернет-магазин |
181 |
А в самом конце:
if (@$siluro != $temp_siluro and $siluro < 50) { include("mini.phtml"); }
Вы, наверное, уже догадались, что сам скрипт целиком должен располагаться в файле с именем mini.phtml, и вызываться в нужном месте командой include ("mini.phtml"); Получается интересная ситуация. Скрипт обрабатывается, и если по какой-то причине вдруг оказывается, что баннер не выведен на экран, то программа вызывает сама себя. Это позволяет избежать сбоев.
Текстовые баннеры
Иногда не требуются графические баннеры, достаточно текстовых, представляющих собой ссылку на статью, описание товара и т.д.
Вэтом случае можно пользоваться более простым алгоритмом.
Вфайле chitatxt.php мы будем хранить то, что надо вывести на экран. Информация будет заноситься туда следующим образом: дата, адрес ссылки, текст для вывода на экран. Разделяться все параметры, как обычно, будут тильдой.
Итак, подготавливаем нужные нам переменные, считываем файл с текстовой базой в массив и определяем его длину:
$nomer = 1;
$file = " c h i t a t x t . p h p " ; $ii = 0;
$tt = file ( $file );
$qw = count ($tt);
Открываем цикл, в котором и будем выводить наши сообщения:
while ($ii < 4):
Всего будет выведено четыре сообщения; если вам нужно другое количество, измените число в этом операторе. Если надо вывести только одно текстовое сообщение, можно не пользоваться циклом.
182 |
Программирование на РНР |
Ничего сложного, это мы уже проходили — раскладываем параметры строки на составляющие для последующей обработки:
$nomer++;
@$str = trim($tt[$nomer]);
list ($data, $add, $txt) = split ("~", $str);
Выводим ссылку в нужном нам виде:
echo "<b> $data</b> <a href=\"$add\"><br>$txt </a>";
Закрываем цикл и саму программу:
$ii++;
endwhile;
Все. Правда, мы не рассмотрели в этом примере сортировку по дате и вывод по счетчику, но это попробуйте сделать самостоятельно, в качестве домашнего задания.
Просмотр всех новинок
А как быть, если посетитель захочет посмотреть все приготовленные вами новинки? Он, конечно, может обновлять страницу столько раз, сколько потребуется до тех пор, пока не просмотрит все баннеры. Однако будет лучше, если мы создадим ссылку «Все новинки», указывающую на файл, в котором будет содержаться такой код:
<?
$dir = opendir("news/");
while ($f = readdir($dir))
{
if (stristr($f,".html")) { $li[] = $f; }
}
Интернет-магазин |
183 |
Знакомый для нас код, в нем мы просматриваем директорию, в которой хранятся новости и новинки, и помещаем все в массив.
$i = 0; while ($i < count ($li)) :
include {"news/$li[$i]"); echo "<br><hr noshade size=l>"; $i++;
endwhile;
?>
Так выводим в цикле массив новинок, разделяя переводом строки и горизонтальной линией. Таким образом, наш магазин становится более удобным для посетителей.
Формирование комплексного заказа
Если в вашем интернет-магазине есть сводный прайс с несколькими позициями, можно сделать парочку интересных сервисов. Идеи, которые я сейчас опишу, можно использовать для любых товаров. Я же рассматриваю компьютеры, так как для них подобные идеи реализуются чаще всего.
Прайс должен быть выполнен в Excel и оформлен примерно следующим образом: в первой строке — наименование раздела, во второй — цена продукции, ее название и краткое описание. В третьей строке — опять наименование раздела, потом строка с товаром и т.д. Получится простой прайс, только, конечно, товаров в каждом разделе может быть сколько угодно (рис. 28).
Прайс из Excel нужно экспортировать в текстовый формат, например, с разделителями колонок — табуляциями (рис. 29).
После этого у вас получится соответствующий текстовый файл, колонки в котором будут разделены символами табуляции, а строки — символом абзаца (рис. 30).
Такой файл несложно обработать при помощи стандартных средств РНР.
184 |
Программирование на РНР |
Рис. 28. Вид прайса в Excel
Рис. 29. Экспортирование прайса из Excel
Рис.30.Видэкспортированногопрайса
Интернет-магазин |
185 |
Итак, нам нужен список разделов, при щелчке на котором будет появляться меню с полным списком товаров из данного раздела. И главное — выбранный таким образом товар должен быть запомнен и потом подсчитан, а при необходимости добавлен в виртуальную корзину.
Начинаем работать над кодом:
Создаем форму, в которой будут происходить все дальнейшие действия:
<form method="POST"
name="pop" action="cena.phtml"
title="Подсчитать стоимость выбранных комплектующих">
При нажатии на кнопку SUBMIT форма направит данные, полученные от посетителя, обработчику с именем сеnа.phtml. Его мы рассмотрим в самом конце. А теперь — служебный файл read.phtml:
<?
$file = $DOCUMENT_ROOT."/$path/price.txt";
$as = file ( $file );
Загружаем в память (точнее — в массив с именем $as) полученный нами файл price.txt, который предварительно нужно закачать на сервер. Обратите внимание, на строку $ f i l e = $DOCUMENT_ROOT."/$path/price.txt"; Ее наличие приводит к тому, что где бы вы в дальнейшем ни запустили этот скрипт, он найдет файл с прайсом, и все благодаря переменной окружения $DOCUMENT_ROOTи,конечно,переменной$path,вкоторойзаранее нужно указать относительный путь к файлу с прайсом. Хранить этот файл непосредственно в корневом каталоге не рекомендую. Лучше заведите отдельную директорию, имя которой и укажите в переменной $path. Слеши ставить не надо, они уже заданы.
Следующий код позволит нам не выводить сообщения об ошибках, если скрипт работает в интернете, а не у вас на домашнем компьютере:
186 |
Программирование на РНР |
$ip=getenv("REMOTE_ADDR");
if ($ip != "127.0.0.1") { error_reporting(0); }
Конечно, IP-адрес должен быть реальным, т.е. тем, который используется у вас, иначе и на домашнем компьютере вы не получите ошибок, и разобраться, почему все не работает, будет не так просто.
Следующим кодом мы обрабатываем загруженный в массив файл таким образом, чтобы избавиться от ненужной информации и подготовить ее к дальнейшей удобной для нас обработке:
$i = 1;
while ($i < count($as)):
$str = trim(str_replace ("\n","", $as[$i])); $str = str_replace ("\t","~", $str);
$str = str_replace ("\"","", $str);
list ($n_l, $n_2, $n_3) = split ("~", $str); $n_l = str_replace <",",".", $n_l);
$n_2 = str_replace (",",".", $n_2);
$as[$i] = "$n_l~$n_2~$n_3~$n_4~$n_5";
$as[$i] = str_replace (",",", ", $as[$i]); $as[$i] = str_replace (" "," ", $as[$i]);
$i++; endwhile; ?>
Тут удаляются переводы строк, так как они нам больше не нужны, символы табуляции заменяются тильдой, удаляются лишние кавычки, если они есть, запятые перераспределяются для того,
Интернет-магазин |
187 |
чтобы можно было считать в РНР (запятые в РНР и в Excel — разные символы, и их надо преобразовать для РНР). Все, файл read.phtml закрываем и сделаем вторую подпрограмму, которая может не раз понадобиться нам в дальнейшей работе. Назовем файл с ней minor.phtml. Вот его содержимое:
<?
$str = str_replace ("\n","", $as[$q2]};
@list ($n_l, $n_2, $n_3) = split ("~", $ str); ?>
Переменной $q2 присваивается искомое значение, а возвращаются разделенные на составляющие цена, название и описание товара (соответственно в переменных $n_1, $n_2 и $n_3). Дальше, возвращаемся к нашему первому файлу с формой.
Подготавливаем таблицу для того, чтобы наш список смотрелся красиво:
<? include ("read.phtml"); ?> <table><tr><td>Цена</td> <td>Название</td> <td>Описание</tdx/tr> <tr><td>
<?
$q2 = 0;
include ("minor.phtml"); echo $n_l;
?>: </td><td>
<select name="ur0" size="l"> <option value=all selected> Позиция не выбрана</option> <?
188 Программирование на РНР
$ii =1; $i = 1; $s = count($as); while ($i < $s) :
$q2 = $i; include ("minor.phtml"); if ($n_2 = "" and Si) {
Этот участок кода выполняется, если получены сведения, что программа обнаружила заголовок. Определяется это по пустой переменной с названием, так как название заголовка присваивается переменной с ценой. Это дает нам возможность выполнять разные действия в зависимости от ситуации.
Следующий код — для вывода заголовка:
echo "</select><br></td></tr><tr><td>$n_l:</td><td>
<select name=ur".$ii." size="l">
<option value=all selected>
Позиция не выбрана</option>";
$ii++; }
Для вывода цены товара, его наименования и описания:
else {
if ($n_l) {
echo "<option value=\"$i\">".$n_l.":".$n_3. "</option>"; } else { echo "</td><td></td></tr>"; }
}
Здесь все просто: формируются списки стандартными средствами HTML. Вы можете добавить к ним соответствующие стили, но не изменяйте РНР-код.
Окончание кода:
$i++;
endwhile;
?></select></td></tr></table>
Интернет-магазин |
189 |
<br><input type="hidden" name="nom" value="<? echo $ ii - l; ?>">
<input TYPE="submit" VALUE="Подсчитать стоимость"
NAME="B3"></form>
Теперь осталось рассмотреть, что и как делает обработчик. Если вы помните, он у нас прописан в файле с именем cena.phtml.
<hЗ>Итоговая стоимость выбранных комплектующих</h3>
<? include ("read.phtml");
Уже знакомый нам файл read.phtml нашел применение и тут.
$i = 0;
$n_11 = 0;
while ($i <= $nom):
$nu = "ur".$i;
if ($$nu != "all") {
$q2 = $$nu; include ("minor.phtml");
$n_ll = $n_l+$n_ll;
$i++;
endwhile; ?>
<font color=red>".$n_ll."</font>
<br><a href=servis.phtml>
Повторить выбор</а>
В этом коде происходит простой подсчет цен, и есть только одна особенность, о которой стоит знать, — переменная в переменной.
