AboutPC
Главная 
Новости 
Интернет 
Безопасность 
Антиспам 
Железо 
КПК 
Мобильники 
Windows 
*nix 
Софт 
Игры 
Веб-дизайн 
Кодинг 
Заработок 
Юмор 
Отдыхай с PC 
Разное
:: авторам
:: читателям
:: веб-мастеру
:: copyright
:: рассылки
:: реклама
:: мыло
:: сайт

Содержание раздела "Кодинг":

Ах, баннеры, баннеры
Как сделать Интернет-магазин?
No spam.php
Cookies в PHP
Как написать графический счетчик на PHP

 

Подпишитесь на рассылку от ведущего раздела "Кодинг"

Сервис почтовых рассылок CONTENT.MAIL.RU
E-mail:

 

Ах, баннеры, баннеры

Не секрет, что в наше время Интернет-странички просто переполнены графикой. Без этого уже трудно представить себе какой-нибудь популярный проект. Часть этой графики является дизайном сайта, и с этим мы предпочитаем мириться. Другая часть - это баннеры, рекламная информация других сайтов в виде графической (часто даже анимированной) картинки. Это иногда раздражает, иногда выводит из себя, а иногда может оказаться полезным, так как хорошо сделанный баннер привлекает внимание и к себе и к екламируемому ресурсу. Но в этой статье разговор пойдет не о самих баннерах, а о системах управления ими.

Если вам удалось сделать хороший, полезный и посещаемый Интернет-проект, значит, вы неизбежно сталкивались с баннерами. Часто другие Web-мастера сами предлагают обмен, иногда самому хочется поставить свой баннер на каком-либо ресурсе. Но в любом случае очень полезно иметь информацию о том, сколько раз Ваш баннер был показан и показывается ли он вообще. Это избавит от необходимости раз в неделю (день, месяц, год…) проверять, работает ли ваш баннер на чужом сайте или давно удален. Конечно, обойтись средствами HTML тут просто невозможно, поэтому приготовьтесь программировать. Хорошо бы для программирования выбрать один из языков, работающих на стороне сервера. Это избавит посетителя от постоянного перекачивания к браузеру массы информации, причем при каждом посещении.

Предлагаю Вам попробовать несложный скриптовый язык программирования РНР. Самое главное, что Вам обязательно понадобится - это поддержка РНР Вашим сервером, где расположен Ваш сайт. Без этого, к сожалению, ничего не получится. Но PHP - язык распространенный, и поддерживается он большинством серверов в сети, за исключением очень многих бесплатных.

Первое, что надо сделать - это определиться с кодом Вашего баннера и с самим баннером. Код выглядит, как правило так:

<a href="http://myhost.com"><IMG SRC="http://myhost.com/baner.gif" alt="Мой баннер" border="0"></a>

Конечно, это только шаблон, но с него мы сможем построить то, что нам будет нужно. А нужно нам будет знать, сколько раз показывается тот или иной баннер на определенном сайте. И желательно - время последнего показа. Для этого надо выделить один файл, который будет работать базой данных. Структура сайта выглядит следующим образом - каждая строчка соответствует одному из сайтов, на котором показывают Ваши баннеры. Разделителем между строками является, как и обычно, перевод строки. Разделителем в самой строке между информационными данными можно выбрать символ ^ (это на клавиатуре Shift+6). Этот символ не встречается в адресной строке браузера, и нам очень даже подходит.

Структуру строки файла базы данный выберем вот так:

Адрес ^ время последнего посещения ^ количество посещений

Таким образом получается три поля, которые нужно в дальнейшем будет менять в зависимости от того, откуда вызывается баннер. Для того, что бы это знать, надо ввести в код баннера один параметр - идентификатор сайта. Для каждого из сайтов, участвующих в баннерообмене, идентификатор должен быть различным. И кроме того, для того, что бы обработать этот идентификатор, Вам потребуется вызывать не сам баннер, а специальный скрипт PHP, который сначала обработает все данные, а затем выведет на экран нужный баннер. Вот что у нас получилось из кода баннера:

<a href="http://myhost.com"><IMG SRC="http://myhost.com/baner.phtml?id=1" alt="Мой баннер" border="0"></a>

Как видите, поменялось имя файла и добавился параметр id. Теперь вызывается не непосредственно сам баннер, а скрипт baner.phtml, который и ведет статистику показов и времени посещения. В конце скрипта должен обязательно быть переход на баннер вот в таком виде:

header ("Location: baner.gif");

Теперь давайте перейдем к вопросу о ведении статистики. Несложно сделать просто подсчет показов, так как задача эта тривиальна - достаточно считать в массив базу данных посещений, и затем увеличить на 1 ячейку массива с индексом, соответствующим переменной id. Это наш идентификатор. Но у нас более сложная задача - организовать возможность просмотра всей статистики в дальнейшем и запоминать время последнего показа баннера. Значит, надо записывать в базу и время, и адрес сайта, с которого вызывается баннер. Адрес мы будем запоминать только для того, что бы в дальнейшем можно было узнать статистику показов, а в самой процедуре подсчета он не участвует.

Итак, начали. Наш скрипт, прежде всего, должен проверить на правильность полученную переменную $id. Если она не больше установленного значения и не меньше ноля, то все нормально, иначе присваиваем переменной id ноль, или выводим сообщение об ошибке. Кому как нравится. Значение переменной id с индексом ноль нужно специально зарезервировать для таких вот ошибок, и всегда будет ясно - кто-то разместил не правильный код или допустил в нем ошибку при наборе. Но, если же все нормально, а так чаще всего и будет, скрипт должен считать в память файл с базой данных:

$adds = "url.txt";
$txt = file($adds);

Вся информация оказывается в массиве с именем $txt. Идентификатор указывает на тот индекс, где в массиве расположены данные сайта, с которого вызван баннер. Обратиться к этим данным очень просто:

$str = trim(str_replace ("\n","", $txt[$id]));

Хорошо бы проверить, есть ли такая учетная запись, но это по желанию. Дальше надо разложить информацию на три составляющих - адрес, время последнего доступа и количество показов. Вот как это проще всего сделать:

list ($add, $time, $counter) = split ("^", $str);

Вот тут нам и пригодился наш разделитель. Все, вся информация извлечена, теперь ее надо обновить и записать обратно. Собственно, нужно просто увеличить переменную $counter на единицу, считать текущее время и присвоить переменной $time его значение. Если со счетчиком все ясно, то время требует пояснения. Лучше и проще всего считывать его в Unix-овском формате. Полученное значение будет равно количеству секунд, прошедшему после 1 января 1970 года. Ну, так уж принято, хоть и немного странно для простого пользователя. Но, нам важно, что это число секунд очень легко преобразуется в дальнейшем в конкретные даты, а хранить его очень просто, так как это, по сути, просто большое число. Его получить можно так:

$time = time(void);
$counter++;

Заодно увеличили показания счетчика. Все - теперь осталось только записать всю информацию обратно. Суммируем строку, и заносим полученное значение в нужную ячейку массива (напомню, на нее указывает идентификатор в переменной $id):

$txt[$id] = $add."^".$time."^".$counter."\n";

И тут тоже не забываем про наш разделитель и про перевод строки в конце для правильного считывания в дальнейшем. Осталось только записать весь массив в файл с базой данных, но для этого его надо сначала объединить в одну строку:

$str=implode("", $txt);
$fp = fopen($adds, "w");
if ($fp) { $fw = fwrite($fp, $str); fclose($fp); }

Вот и все, так как все поставленные нами задачи мы выполнили. Я намеренно не приводил всего кода скрипта целиком, а только по пунктам объяснял все шаги как можно подробнее. Я хотел бы, что бы Вы не занимались бездумным копированием, а постарались самостоятельно развить предложенные тут идеи. Но, что бы хоть как то компенсировать отсутствие в статье готового скрипта, я предлагаю Вам готовый скрипт вывода статистики на экран. Для этого достаточно вызвать в браузере файл stat.phtml. Вот его код:

$adds = "url.txt";
$txt = file($adds);

$i = 0;
while ($i <= count($txt)):
$temp = trim(str_replace ("\n","", $txt[$i]));

list ($add, $time, $counter) = split ("^", $str);
echo $add." - ".$counter." : ".$time."
";

$i++;
endwhile;
?>

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

Если Вас заинтересовали возможности языка программирования PHP, предлагаю Вам подписаться на рассылку PHP для всех!, адрес формы для подписки - http://virtual.bresttelecom.by/php/.

автор:Андрей Кухарчик
сайт:www.team-x.ru
мыло:virtualbrest@tut.by

 

 

 Наверх

Как сделать Интернет-магазин?

Этот вопрос не зря вынесен в заголовок. Если Вы введете его в поисковике (например, http://yandex.ru), то в ответ получите массу ссылок на коммерческие предложения от разнообразных фирм или просто предприимчивых товарищей. Нет, я не хочу сказать, что они делают что-то плохое, или делают не так, просто меня удивляет практически полное отсутствие информации на данную тему (может, кому-то повезло больше?). А тема действительно интересная и актуальная - по крайней мере, я смог найти в Интернете больше вопросов, чем ответов. И эта статья - маленькая попытка хоть немного восполнить недостаток информации. Итак - как же сделать Интернет-магазин самому?

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

Сделать простой (мы не будем рассматривать сложные решения) Интернет-магазин самому, как ни странно, очень просто. И не удивляйтесь - реализация такого проекта доступна даже начинающему программисту, знакомому с Интернет-технологиями. Надеюсь, Вы сможете убедиться в этом сами. Несколько сложнее придумать, как привязать собственный магазин (тут, и в дальнейшем, подразумевается, конечно, Интернет-магазин) к конкретным товарам. Ну, вот Вам пример. Есть набор канцтоваров. В количестве 1000 наименований. Прайс с ценами и информацией о товарах обновляется чуть ли не ежедневно, и не просто обновляется, а иногда кардинально обновляется! Причем изменяются не только цены, что еще полбеды, но и виды товаров, их описания, сроки гарантии и поставок и т.д. Попробуйте вносить все эти данные в свой магазин ежедневно, и Вы сразу проникнитесь уважением к тем людям, которые делают такую работу :-) Вот именно обновление данных в магазине и занимает основную часть собственно самой программы. Это то, что необходимо продумать в первую очередь.

Прежде чем Вы начнете делать свой магазин, Вам надо досконально изучить прайс товаров и способы его обновления в оригинале. Давайте для примера придем к некоторым условностям. Есть фирма, в ассортименте которой компьютерные товары. Их достаточное количество для того, что бы не заниматься обновлением в ручную, а придумать собственную систему для синхронизации данных прайса и магазина. Пусть прайс будет у нас в Excel-е. Это, как правило, не так, многие фирмы используют в работе специализированные программы, например, 1С Бухгалтерию, но такие моменты не принципиальны, так как всегда можно импортировать данные из таких пакетов в Excel. Количество разделов в прайсе и товаров в них не фиксировано, а сам прайс представляет собой набор строк и колонок. В каждой строке - товар или наименование раздела прайса (например - процессоры, память, мышки и т.д.). Количество колонок не важно, стандартно могут присутствовать цена, наименование, описание товара. Впрочем, могут быть и другие варианты. Вот Вам и описание обычного прайса, с которым Вы можете столкнуться.

Что и как можно использовать, имея такие данные? Конечно, можно применить специальные модули для выборки данных из файла формата Excel (они существуют в разных вариантах для разных языков программирования), но такие модули, как правило, не являются бесплатными, а значит, не приемлемы для нас. Кроме того - всегда остается проблема настройки. Подчас, что бы это сделать, нужно обладать такой квалификацией, что проще самому все написать с нуля :-) Впрочем, эти модули и не нужны на самом деле. Что собой представляет наш прайс? Правильно, набор строк и колонок, причем строго синхронизированных друг относительно друга. А значит, из таких строк и колонок можно построить текстовый файл с точно такой же структурой. Только вместо визуального разделения строк и колонок (как в Excel-е), надо использовать какие-либо символы. Конечно, в этом случае визуальная синхронизация будет утеряна, так как длинна строк всегда разная, но это и не важно, ведь внутренняя структура останется прежней. Это будут все те же строки и колонки, только уже в текстовом формате. А этот формат очень легко прочитать и обработать практически на любом языке программирования.

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

Вернемся к нашему прайсу. Excel, как известно, умеет сохранять свои файлы в разных форматах. Нас будет интересовать сейчас один - текстовый файл с разделителями табуляции. В принципе, разделители не важны, есть возможность сохранять в формате с разделителями запятыми или пробелами. Используйте тот, который Вам больше понравится. Мы же остановимся на табуляции.

И вот что у нас получилось на выходе: файл *.txt, строки разделены переводом каретки (это простой Enter), колонки разделены символами табуляции. Вся внутренняя структура прайса осталась прежней, так как об этом позаботился мастер сохранения Excel. Ну что ж, уже лучше :-)

Вот мы и нашли способ не заниматься рутинной работой по ежедневному обновлению прайса в нашем Интернет-магазине, а максимально автоматизировать этот процесс. Перед тем, как начинать работать с полученным файлом, можно подумать, как его немного сжать или обработать. Это бывает необходимо для того, что бы удалить не нужные колонки, повторяющиеся пробелы, временно отсутствующие в наличии товары и т.д. Для этого надо считать файл в массив, обработать каждую строку на предмет наличия ненужной информации, записать полученный результат опять в массив на тоже место и, наконец - весь массив записать в файл. Примерно так. Но надо исходить из конкретной необходимости таких операций, вполне возможно достаточно просто удалить повторяющиеся пробелы.

Когда все готово, пора приступать к алгоритму выборки данных их нашего текстового файла с прайсом. Как Вы уже, надеюсь, догадались, он совсем не сложен. Считать файл в массив:

$file = "price.txt";
$tovar = file ( $file );

Еще раз напоминаю, примеры даны в формате языка PHP. Дальше надо обработать массив $tovar[] в цикле с выводом результатов работы на экран:

$i = 0; // счетчик начинается с нуля
while ($i < count($tovar)): // открыли цикл до последнего элемента в массиве
echo $tovar[$i]; // выводим строку на экран
echo "
"; // не забываем про перевод строк
$i++; // заканчиваем цикл
endwhile;

Вот Вам и самый простейший вариант Вашего прайса. Он, правда, обладает существенным недостатком - весь прайс выводится за один раз, да еще все колонки в одной строке. А это не приемлемо по эстетическим :-) причинам. Правильнее предоставить клиенту возможность выбора раздела прайса. Впрочем, не стоит исключать и первый вариант. Всегда лучше, когда есть выбор из разных вариантов просмотра прайса, тем более, что в смысле программных решений тут не предвидится проблем.

Значит, нужно отделить разделы прайса от информации о товаре. Это можно сделать, если обратить внимание на то, в какой из колонок идет название раздела. Как правило, в той же, что и название товара. Но - в строке с названием раздела нет информации о цене товара, а это может служить хорошим отличительным признаком для программы. Достаточно каждый раз отслеживать наличие в выбранной строке колонку цен. Когда там пусто - в строке название раздела, и его можно вывести на экран, если нет - это товар, такую строку просто пропускаем, если надо выводить только названия разделов. И наоборот для вывода только товаров.

Впрочем, названия разделов сами по себе мало кого заинтересуют. Нам надо продумать возможность просмотра конкретного раздела прайса. Для этого выводимые наименования разделов прайса надо сделать ссылками. А в ссылке в качестве параметра указать информацию о том, с какой строки начинается данный раздел. Немного модернизируем наш алгоритм вывода разделов прайса таким образом, что бы после нажатия на ссылку-наименование раздела посетитель попадал на другую программу, которая начинала бы просмотр файла с прайсом не с начала, а с того места, которое передано по ссылке в качестве параметра. И уже выводила бы не разделы прайса, а сами товары - их цену, наименование, описание и т.д. Тут происходит обратное. В цикле программа просматривает строки файла. Если в колонке с ценой не пусто - это товар, и его надо вывести на экран, предварительно отформатировав информацию. Если же пусто - это начало следующего раздела прайса, и обработку надо прекратить, так как цель достигнута - весь выбранный посетителем раздел выведен на экран. Обязательно необходимо продумать удобную навигацию, Ваш посетитель не должен заблудиться в дебрях программ. На каждой страничке должна быть ссылка на начало и на список разделов прайса. Неплохо предоставить возможность перехода на следующий и на предыдущий разделы прайса прямо из списка товаров.

Теперь о том, как разделить информацию в выбранной строке по колонкам. Отведем каждой колонке свою переменную. Если колонок в прайсе пять, то и переменных надо зарезервировать тоже пять. Для того, что бы не запутаться, возьмите похожие имена: $n_1, $n _2, $n_3, $n_4, $n _5. Теперь, если нужная строка находится в массиве $tovar[$i], достаточно применить такую конструкцию:

list ($n_1, $n_2, $n_3, $n_4, $n_5) = split ("\t",$tovar[$i]);

: и если колонки были разделены символом табуляции, они распределяться каждая в свою переменную. Если Вы использовали другой разделитель колонок, Вам надо прописать его вместо \t. Теперь легко проверить наличие цены, а также отсортировать и отформатировать данные прайса нужным образом.

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

Мы подошли к очень интересной теме - виртуальная корзина. Не сомневаюсь, на очень многих сайтах Вы пробовали заказать выложенный там товар, и на всех работа корзины была реализована по-разному. Что надо стандартному посетителю от Интернет-магазина? Правильно, купить товар. А что ему для этого требуется? Удобная навигация, легкий и быстрый доступ к товарам, возможность изменить количество одного наименования товара в корзине, возможность удалить товар из корзины, информация о товаре (данные, параметры, фотография, наконец - цена!). Это - необходимый минимум - увеличение доступных функций отрицательно сказывается на быстродействии и существенно усложняет программу. Но - этого более чем достаточно для нас.

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

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

Что бы сделать это, нужно рассмотреть преимущества и недостатки нескольких конкурирующих технологий. Что можно противопоставить cookie? Из того, что попроще - Java script и сессии. Давайте рассмотрим все три по порядку.

Cookie - небольшие файлы, записываемые на Вашем компьютере сервером. Все браузеры поддерживают работу с ними, и поверьте - в этой технологии больше ограничений, чем возможностей. Например, нельзя записать в один cookie больше 4 килобайт данных, нельзя обратиться к чужому cookie, только к своему (созданному своим сервером), нельзя записать cookie куда либо в другое место, кроме как в отведенное пользователем. Нельзя, нельзя, нельзя: Конечно, все это при условии того, что Вы следите за безопасностью собственного компьютера и устанавливаете самое современное программное обеспечение. Кстати, практически во всех браузерах сookie по умолчанию включены, и если Вы смогли их выключить - сможете и включить. Сделать это можно в настройках программы-браузера. Очень большое количество сайтов использует в своей работе cookie, а часть из них просто не пустит Вас к себе без включенной их поддержки в браузере. Хорошо это или плохо - это так. Есть специальные программы - брандмауэры, отсекающие cookie или отказывающие сайту в доступе, так что выбор все равно остается за посетителем. Но - среднестатистический пользователь компьютера не отключает cookie, а для продвинутых стоит написать предупреждение на сайте.

Дальше - Java Script. Эта технология тоже достаточно распространена, но... Есть версии популярных браузеров, которые не поддерживают работу Java Script. Например - версии Opera. Правда, это не тот недостаток, на котором мне хотелось бы сделать акцент. Java Script технология клиентская, а это значит, что текст программы - скрипта надо передать браузеру. Само собой - увеличение времени загрузки и замедление работы программы Вам гарантировано. А плюс сюда еще требовательность к ресурсам компьютера, и мы получаем гремучую смесь. А ведь своего клиента надо уважать и немножко даже любить - как никак он платит нам за нашу работу. Так зачем же усложнять ему путь по сайту? Впрочем, есть тут и достоинства - если сервер не поддерживает программирование на своей стороне, остается воспользоваться только Java Script.

Сессии. Очень эффективный механизм, встроенный во многие современные языки программирования. Присутствует, например, в PHP версии 4.0 и выше. Позволяет передавать переменные от одного окна браузера к другому без их потери и без передачи методами POST или GET. Это на пальцах. В действительности - использует в своей работе уникальные идентификаторы, которые хранятся в тех же файлах cookie, так что нового в принципе ничего не несет, разве что повышается удобство работы: Если только знать как этим пользоваться :-) Само собой - требует поддержки cookie от браузера.

Вот они, конкуренты. На самом деле - выбор стоит между двумя: cookie или Java Script. Второе стоит выбирать только в случае, если Ваш хостинг не поддерживает программирование на стороне сервера ни на одном из языков. Это - практически все бесплатные службы хостинга. А на первом стоит останавливаться во всех других случаях, когда есть возможность отдать основную работу по обработке серверу. Впрочем, Ваш Java Script тоже будет работать с cookie, иначе оборвавшаяся так некстати связь с Интернетом лишит посетителя с трудом набитого в корзину товара. Второй раз он (посетитель магазина) может этого и не сделать. Если используются cookie - вся корзина остается нетронутой, ведь она записана на компьютере клиента. Как видите, круг замкнулся, нам все равно от них никуда не деться :-) Итак - решение о выборе технологии зависит от возможностей хостинга.

Мы, как прогрессивные программисты, остановимся на cookie. Тем более, что у нас есть РНР, а в нем очень просто устанавливать, удалять и считывать cookie. На практике это будет выглядеть так:

isset ($name); - прочитать установленный cookie с именем name;
$y = mktime (12, 50, 0, 12, 12, 2005); - установить время, до которого хранить cookie;
setcookie("name", $data, $y); - записать в cookie с именем name переменную $data;
setcookie("name); - удалить cookie с именем name;

Вот и все, что нам понадобится для работы со страшными cookie.

Раз технология выбрана - давайте применим ее на деле! Прайс у нас, если Вы помните, хранится в текстовом файле. Блок выборки данных оттуда есть. Осталось решить, что именно хранить в cookie. Можно - всю информацию о товаре, а можно только цифровой идентификатор и количество. Конкретный выбор надо сделать исходя из реальных условий. По принципу - что проще. Только надо учитывать, что цифровой идентификатор занимает не очень много места в памяти, но с ним больше хлопот в смысле программирования. Придется делать блок сопоставления идентификатора и выборки информации из файла прайса. Тут есть и еще один момент. Если прайс часто меняется, соответственно информация в корзине покупателя может быстро устареть и не соответствовать действительности. Значит, стоит подумать о контроле даты. Дату, когда посетитель положил товар в корзину, тоже придется хранить в cookie, так как больше негде. Если даты сильно различаются - стоит предупредить покупателя о несоответствии. Иначе могут произойти досадные казусы. Неприятно, когда заказ делается по недельной давности цене. Она ведь может не только упасть, но и увеличиться! Потом придется объясняться: Так что лучше позаботиться о таких вещах заранее. Хотя, если прайс более-менее постоянный, беспокоиться на стоит.

Цифровым идентификатором очень удобно выбрать номер позиции в прайсе. Этот номер, понятное дело, уникальный для каждого товара, а нам это и надо. И, кроме того - по номеру позиции легко извлечь информацию о товаре из текстового файла с прайсом. Достаточно считать весь файл в массив:

$file = "price.txt"; // кстати, расширение файла может быть любым
$as = file ( $file );

И обратиться к строке массива с нужным индексом:

$info = $as[$id];

$id - идентификатор, который нам нужен. Правда, применяя данный метод, нам не избежать контроля дат, но это не так уж и плохо.

Вместе с идентификатором товара надо запоминать и количество товара. Соответственно, при первом заказе вводится число 1. Дальше желательно предоставить возможность произвольно (в ограниченных, конечно, рамках) менять это число. Для пересчета суммы понадобится кнопка, если она будет первой после формы - сработает и нажатие на клавишу Enter. Очень удобно - ввел новое количество товара и нажал Enter для пересчета.

Кроме того, в корзине обязательно надо предусмотреть возможность заказать еще товар и окончательно оформить товар. Это можно сделать и кнопками, и ссылками - что удобнее для навигации. Никаких параметров передаваться тут не будет.

Конечно, необходимо продумать, как именно выводить информацию о полной стоимости заказа. Не стоит забывать о скидках и подарках, если они, конечно, есть в Вашем Интернет-магазине. Хорошо впишутся сюда различные бонусы и информация о доставке. Если она бесплатная - напишите об этом. Лишним не будет.

Наконец: Оформление. Стандартные поля - имя, адрес, телефон, почтовый ящик и т.д. Кому что надо. Чем меньше, кстати, тем лучше. Обязательно должно быть поле "примечания" - оставьте клиенту возможность высказать свои пожелания. Тут же должна присутствовать вся информация о заказанном товаре и о его стоимости. Самая главная кнопку - "ЗАКАЗАТЬ". Если нет регистрации, можно введенные данные запомнить (а для чего мы говорили столько о cookie?) и при следующем заказе просто подставить. Клиент будет благодарен, поверьте.

После того, как заказ оформлен и подтвержден, первым делом: скажите спасибо клиенту за покупку. И - выведите еще раз информацию о заказе на экран. При этом не забывайте очистить корзину - она ведь уже отработала свое. Если был введен адрес электронной почты - отправьте на него сообщение о заказе и самую разнообразную информацию, включая рекламу. Вот и все. По крайней мере, для покупателя.

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

Очень актуальным является момент своевременности обработки заказов. Я Вам подскажу очень хороший и, кстати, современный метод, позволяющий практически мгновенно узнавать о заказе. И это без необходимости постоянно сидеть в Интернете и даже выходить в него раз в день. Удивлены? А на самом деле все просто. Нам понадобится простой: пейджер. Практически все операторы предоставляют возможность отправить электронное сообщение на свой пейджер из Интернета. Как правило, адрес для отправки выглядит так: номер_пейджера@адрес.оператора. Или приблизительно так. Если на этот адрес отправить письмо, оно придет на Ваш пейджер. А из PHP, например, очень просто отправлять электронные сообщения на почтовые ящики. Идея ясна, надеюсь? Кстати, неплохим вариантом может быть SMS на сотовый телефон, но надо уточнять у оператора, поддерживает ли их сеть такую возможность. Например, Белорусский VELCOM пока еще нет.

Как видите, на заказ можно отреагировать практически сразу, как только онпоступит. Это повышает доверие клиентов к магазину и положительно сказывается на репутации. Вот, как мне кажется, и все для начала.

Очень хочется пожелать не бояться самостоятельно заниматься разработками в данной области. Проблем осталось много, но все они решаемы, поверьте. И, как правило - проще оказывается самостоятельно разработать систему, чем искать и настраивать чужую.

Если Вам пришлись по сердцу идеи, изложенные в данной статье, Вы можете оценить работу описываемого здесь Интернет-магазина по адресу http://204040.com Может быть, даже что-нибудь купите :-) Еще раз хочется напомнить - статья ориентирована в первую очередь на то, что бы дать начальную информацию о технологиях, применяемых в Интернет-магазинах. Тот или иной описанный здесь блок может быть реализован по-другому. Исследуйте, экспериментируйте, творите: Успехов Вам в бизнесе!

автор:Андрей Кухарчик
сайт:virtual.bresttelecom.by
мыло:virtualbrest@tut.by

 

 

 Наверх

No spam.php

...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу – это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны, знает каждый – почтовые фильтры, всякие программы, отсылающие спамеру ответ, мол, адрес такой не найден и прочее... Базы данных спамеры составляют очень просто – натравливают специальные программы на различные сайты, в основном туда, где много email-адресов – форумы, гостевые, и прочее. Дальше – дело техники: программы просматривают html-код, ищут там mailto: и заносят почтовый адрес в свою базу. Бороться с этим можно самому, при публикации своего мыла – писать его, например, spectator[sobaka]mail.ru. Тот, кому надо, исправит адрес при написании письма сам.

Однако есть как минимум два способа, как при написании гостевых книг (или форумов) сделать защиту от спамеров. Первый – это не публиковать email вообще, а вместо его ставить ссылку на страницу с формой, с помощью которой желающий, не зная адреса, сможет отправить письмо соответствующему человеку. С одной стороны – удобно. Так сделано, например, на webscript.ru. С другой – не совсем, потому что многие предпочитают не пользоваться формами, а отправить письмо через любимый bat! Да и вообще, неизвестно еще куда отправит ваше письмо данная форма. Шучу, конечно, но недостатки этого метода, как и достоинства, очевидны.

«Но есть способ лучше!». Не абсолютно лучше, но в некоторых случаях явно лучше. Заключается он в том, чтобы публиковать ссылки на email адреса вот в таком виде: click here. Желающие могут кликнуть и посмотреть, что это работает. Программы, «выдирающие» адреса, ничего на найдут.

Кликнули? Работает?

А теперь – как. Первая часть скрипта, которая заменяет в тексте адреса на такие ссылки простая, даже нет смысла ее приводить. Если что – то у меня в отзывах стоит примерно следующее:

$nospam= str_replace ('@','[dog]',$mail);
echo ('<a href=http://spectator.ru/nospam.php3?'.$nospam.'>');

Вторая часть – это, собственно, скрипт nospam.php3. Состоит он ровно из двух строк:

<php
$url = str_replace ('[dog]','@',urldecode($QUERY_STRING));
header('Location: mailto:$url');
?>

Меняем [dog] на @ обратно и шлем в хедере mailto: и адрес.

При этом ничего в браузер не грузится и текущая страница остается нетронутой. (Правда, мне тут уже сообщили, что в IE 5.5 это не так...).

Вот, собственно, и все. Осложним жизнь спамерам. Вместо [dog] можно использовать все, что угодно, на что хватит вашего воображения.

З.Ы. : о баге в IE 5.5. Он при клике на эту ссылку открывает пустое окно. Почтовая программа, правда, тоже запускается, но все-таки... Пустое окно – нехорошо...

Давайте посмотрим... А теперь эта ссылка в IE 5.5 – работает? Click here.

Да?

Сделано – просто. Но все равно через... Вставляем куда-нибудь пустой iframe:

<iframe src="" frameborder=0 vspace=0 hspace=0 width=1 height=1 scrolling=no name="mail"></iframe>

Ту часть, которая выводит ссылки, пишем примерно вот так:

$nospam= str_replace ('@','[dog]',$mail);
echo ('<a href=nospam.php3?'.$nospam);
if (eregi ("MSIE 5", $HTTP_USER_AGENT)) {echo (' target=mail'); }
echo ('>');

Для того, чтобы если у человека IE 5 и выше – ссылки шли в этот пустой iframe...

Вроде работает... Только вот такой простое решение превратилось в какую-то бяку...

автор:
сайт:www.team-x.ru
мыло:

 

 

 Наверх

Cookies в PHP

Как я уже говорил, браузер клиента можно кормить булками (cookies). Рассказав общее устройство cookies, расскажу о том, как это реализуется на конкретном примере, а именно в языке PHP. Рассказ о cookies в perl, возможно, давал бы больше информации о технической стороне установки cookie (в perl заголовки сообщений http надо писать руками), но зато в PHP это удобнее реализовано.

В PHP одна и та же функция setcookie отвечает за создание, изменение и удаление cookies. Рассмотрим простейший пример - установка на компьютере пользователя булки с информацией о том, был он на этой странице или нет. Это делается так:

<?

setcookie ("visted","true");

?>

После этого у вас на диске появляется c cookie с информацией о том, что эту страницу вы уже посещали. Как долго будет действовать cookie? Поскольку мы использовали только два параметра, а другие нужные параметры оставили без внимания, в них установились стандартные значения: действует до закрытия всех окошек браузера, в домене установившего булку скрипта, по незащищенному соединению. А если мы хотим посчитать сколько посещений произошло в течение года? Как установить эти значения? Воспользуемся полным синтаксисом setcookie:

int setcookie ( string name [, string value [, int expire
[, string path [, string domain [, int secure]]]]])

Как видите, мы можем указать не только имя cookie и значение, но также и время действия (expire - в секундах, прошедших с 1970-го года), путь (стандартное значение "/"), домен ("домен.установившего.куки.скрипта") и секьюрность (0), т.е. также и область действия cookie.

Существует ограничение по количеству cookie на домен (20 штук), поэтому на самом деле в cookie хранится массив, и мы можем в одной булке хранить имя пользователя и количество его заходов на страницу (просто используйте значение cookie как массив). Рассмотрим скрипт - счетчик посещения страницы пользователем.

<?
if (!empty($HTTP_COOKIE_VARS["count"]))
{
$howmuch = $HTTP_COOKIE_VARS["count"];
} else
{ $howmuch = 0;
};
$howmuch++;
setcookie("count",$howmuch,time() + 3600);

print "Вы на этой странице $howmuch-й раз.";

?>

Как видите, для начала мы проверяем, есть ли уже на компьютере пользователя cookie с именем "count", и, если его нет, считаем, что пользователь был на странице 0 раз. Доступ к информации из cookie может быть получен двумя способами: во-первых, если в php.ini установлена настройка register_globals, автоматически создается переменная $count, во-вторых, добавляется значение в массив $HTTP_COOKIE_VARS. Более правильным является использование второго способа, т.к. PHP очень любит создавать переменные, и в этом случае мы просто не знаем - породилась ли эта переменная в результате передачи скрипту данных в query_string, через метод POST или через cookie. Кроме того, в последних версиях PHP (4.2) функция register_globals по умолчанию отключена, так что остается вообще только один способ получить информацию.

Следующим шагом является прибавление к счетчику посещений единички. Логично - пользователь ведь зашел на страницу? Значит, увеличил количество посещений на единичку. Затем (до выдачи каких-либо надписей) мы должны установить cookie c новой информацией, действующий час. Чтобы получить время в секундах от 1970-го года, используется функция time(), к которой мы прибавляем искомое время (3600 секунд). Следует отметить, что время устанавливается в часовом поясе пользователя, так что запросто может оказаться, что время жизни cookie уже истекло. С этим надо бороться!

И только после того, как мы установили cookie мы можем начать что-то показывать пользователю, что мы и делаем, печатая количество посещений им этой страницы.

Внимание! Cookies можно устанавливать только до какой бы то ни было выдачи текста! Проследите, чтобы до использования setcookie не было операторов print. Сообщения об ошибках тоже портят нам установку cookie. Вся проблема заключается в том, что информация о cookie относится к области заголовков, а то, что выдает print - нет.

Но мы должны не только уметь добавить cookie, но и удалить... Это делается все той же многострадальной функцией setcookie, только на этот раз мы вызываем ее с одним единственным параметром - именем cookie:

<?

setcookie("count");

?>

Вот и все! Кормите браузер булками!

автор:
автор:Михаил Соловьев
сайт:team-x.ru

 

 

 Наверх

Как написать графический счетчик на PHP

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

Программа, описанная в этой статье, позволит вам оснастить ваш вебсайт графическим счетчиком, выполненным в виде баннера 80*31. Счетчик позволяет вести подсчет хитов/хостов за день + хитов за месяц. Основа для хранения данных о посетителях - текстовая база данных. Формат базы следующий:

Основной файл данных - в него пишутся все данные про посещаемость вашего сайта в виде:

160701127.0.0.1 /test/news.html
160701127.0.0.1 /me/index.html
160701127.0.0.2 /me/index.html

Первые 6 цифр - это дата, последующая группа информации - это ip посетителя, далее через пробел следует URL страницы, с которой вызывается наш счетчик. На языке регулярных выражений формат записывается следующим образом:

"/^([0-9]{6})([^ ]*)[ ]*([^ ]*)$/"

Месячный лог-файл - в этот файл пишутся данные про посещаемость ресурса по дням в следующем виде:

150701 164
160701 150
170701

Первая группа из 6-ти цифр - это дата, следующая группа цифр - это количество хитов за день. В виде регулярного выражения формат можно записать так:

"/^([0-9]{2})([0-9]{4})[ ]*([^ ]*)$/"

Имея "расписанный" формат базы данных, можно написать текст модуля, подсчитывающего кол-во хитов/хостов и хитов за месяц на основе "готовой" базы данных посещений (на этапе тестирования программы вполне достаточно гипотетической базы данных из десятка записей).

Текст модуля, считающего статистику:

function Count($ip)
{
$str_day=$this->getLastDay(); // Функция "дающая" дату в виде "ддммгг"

# Получаем "рабочую дату" из "месячного" лог файла, а если ее нет (лог-файл пуст или, иначе говоря, первый запуск счетчика - создаем ее)
if ($str_day=="no_day"){$str_day=ShortDay();$this->write_m($str_day);}

# Это для удобства. Все имена лог файлов хранятся в глобальных переменных
$arr=file($GLOBALS['counter_log_daily']);

# Самое главное в нашем счетчике - подсчет статистики

$j=0;
for ($i=0;$i {
if (!preg_match("/^([0-9]{6})([^ ]*)[ ]*([^ ]*)$/",$arr[$i],$var))continue;
if (trim($var[1])==$str_day){$this->hits++;$iparr[$j++]=$var[2];}
}

//Тут идет подсчет хостов за день
$c_iparr = array_count_values ($iparr);
$c_iparr_k = array_keys ($c_iparr);
$this->hosts=count($c_iparr_k);
//$c_iparr_v = array_values($c_iparr);

//Хиты за месяц:
$arr=file($GLOBALS['counter_log_month']);
$hm=0;
for ($i=0;$i {
if (!preg_match("/^([0-9]{2})([0-9]{4})[ ]*([^ ]*)$/",$arr[$i],$var))continue;
if ($var[2]==date("my")){$hm+=$var[3];}

}
$this->month_hits=$hm+$this->hits;

# Так называемое "закрытие дня" - при ситуации когда день текущий не совпадает с днем рабочим записываем в лог-файл количество хитов за рабочий день и переводим рабочий день на текущий.

if ($str_day!=ShortDay())
{
$this->write_m(" ".($this->hits)."\n".ShortDay());
$this->hits=1;
}
}

Наиболее интересным моментом в работе счетчика является защита данных от "порчи" при применении "многопоточных" интернет-серверов. В документации по PHP ясно дается понять, что применять "штатную" функцию flock() для блокирования лог файлов нецелесообразно. Поэтому пришлось выдумать свою, пускай и несколько наивную, схему блокировки. Смысл ее состоит в следующем: для каждого лог-файла, для которого существует возможность одновременной записи и чтения информации, до записи создается id файл . После записи он уничтожается. Если "второй" процесс заметил существование такого файла, то он ждет 1с на его уничтожение.

Подобное реализуется в следующей функции:

function is_month_lock() <--- есть есть id, файл возвращает 1, иначе - 0
function month_lock() <--- Создает ид файл
function month_unlock() <--- Уничтожает id файл
function write_m($str)
{
$i=0;
$write_ok=0;
while ($i<20 && $write_ok==0) <--- Всего 20 циклов ожидания уничтожения файла
{
if (!$this->is_month_lock())
{ $this->month_lock(); $lf=$GLOBALS['counter_log_month']; $fp = fopen ($lf,"a+");
fwrite($fp,$str);
fflush($fp);
fclose($fp);
$this->month_unlock();
$write_ok=1;
}
else
{
usleep(50000); <--- Один цикл ожидания
$i++;
}
}

if ($write_ok!=1)$this->month_unlock(); <--- Защита от "сбойного" поведения PHP. Для спокойствия (на медленных серверах) можете увеличить количество периодов до 100 шт.
return $write_ok;
}

В конце приведу текст модуля, выводящего на экран рисунок со счетчиком. В особенных пояснениях текст, я думаю, не нуждается.

function MakePNG ($imgname,$_hi,$_ho,$_ha)
{
$m=$GLOBALS['counter_max_digits'];
$hi=AddSpaces($_hi."",$m,"l");
$ho=AddSpaces($_ho."",$m,"l");
$ha=AddSpaces($_ha."",$m,"l");
$im = @ImageCreateFromPNG ($imgname); /* Attempt to open */
$tc = ImageColorAllocate ($im, 0, 0, 60);

if (!$im)
{
$im = ImageCreate (80, 31); /* Create a blank image */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
}
$l=81-6*$m;
ImageString ($im, 2, $l, -1, $hi,$tc);
ImageString ($im, 2, $l, 19, $ho ,$tc);
ImageString ($im, 2, $l, 9, $ha ,$tc);
return $im;
}

function OutPut()
{
$im = $this->MakePNG("png.png",$this->month_hits,$this->hosts+0,$this->hits+0);
ImagePng ($im);
ImageDestroy ($im);
}

автор:Кириллов Арсен
сайт:team-x.ru
мыло:

 

 

 Наверх

 
design: ФуксЪ