Первый сайт на PHP

         

ПАРТНЕРСКАЯ ПРОГРАММА



ПАРТНЕРСКАЯ ПРОГРАММА

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

Если вы на своем сайте также осуществляете прием заказов на что-либо от посетителей (например, у вас есть простой Интернет-магазин вроде описанного в гл. 5), то организовать партнерскую программу вы сможете буквально четырьмя строками кода на РНР.

Через гиперссылку, ведущую на какую-нибудь web-страницу, можно передать программе на этой web-странице значения переменных. Для этого следует после адреса web-страницы, на которую ссылка ведет, поместить знак вопроса, имя переменной и ее значение после знака равенства - www. domen. ru?perem=znach (можно передать и несколько переменных, записывая их одну за другой и разделяя амперсандом - &:

www.domen.ru?pereml=znachl&perem2=znach2).

В результате в сценарии на странице окажется доступной переменная с соответствующими именем и значением.

Понятно, что для того чтобы иметь возможность выделять среди всего потока приходящих на сайт тех, кто пришел от партнеров, достаточно указывать в партнерской ссылке значение определенной переменной, естественно, уникальное для каждого партнёра. Например, что-то вроде www. domen. ru?partner=ivanov.

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


Самым простым, но достаточно действенным способом решения такой проблемы будет использование cookies (подробнее о cookies рассказано в гл. 8). На тех страницах сайта, на которые будут указывать размещаемые партнерами ссылки, следует разместить код:

<?php

if ($partner!="")

{ SetCookie("prtn",$partner, ""); }

?>

В результате в том случае, если в ссылке окажется переменная partner, в браузер посетителя будет отправлен cookie под названием prtn с ее значением. Помните, что установка cookie должна предшествовать любому выводу в выдаваемый документ - поэтому данный код должен стоять в самом начале документа, до каких-либо тэгов HTML.

Ну а в код той страницы, в которой составляется и отправляется письмо с заказом, достаточно включить переменную, сохраненную в cookie. Например, команда отправки почты из рассмотренного впримера будет выглядеть так:

mail ("mail@harchikov.ru", "Заказ на кассеты", "С адреса $email пришла заявка на приобретение $kolv кассет на общую сумму $summa рублей: $zak. Контактные данные заказчика: $cont, партнерский идентификатор - $HTTP_COOKIE_VARS['prtn']", "From: $email\nReply-To: $email\nContent-Type: text/plain; charset=windows-1251");

Вот и все. Если посетитель зашел на ваш сайт от партнера, то вы об этом узн

ете из письма с заказом и сможете отправить партнеру причитающийся ему процент.

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


PHP: ПОЛЕЗНЫЕ МЕЛОЧИ





PHP: ПОЛЕЗНЫЕ МЕЛОЧИ

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



СЧЕТЧИК ПОСЕЩЕНИЙ



СЧЕТЧИК ПОСЕЩЕНИЙ

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

Начало сценария:

<?php

Укажем имя папки, где будет храниться файл счетчика, и его имя, записав их в соответствующие переменные:

$dirct="foldcount"; $cnt="counter.php";

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

if (file_exists("$dirct/$cnt")==True) {

считаем число из файла и запишем его в переменную $sr. Ее мы потом выведем на страницу в качестве показателя числа посещений, а также, увеличив на 1, получим число посещений, включая данное.

$hdl = fopen("$dirct/$cnt", "r+");

$sr = fread($hdl, filesize("$dirct/$cnt"));

fclose($hdl);

$sr++;

}

Примечание:

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

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

• г - открыть файл только для чтения и приготовиться читать его с начала.

• г+ - открыть файл для чтения и для записи и приготовиться работать с ним с его начала.

• w - открыть файл только для записи, предварительно удалив из него все содержимое, причем если файл с указанным именем не существует, то создается новый файл с таким именем.

• w+ - открыть файл как для записи, так и для возможного последующего чтения, предварительно удалив из него все содержимое, причем если файл с указанным именем не существует, то создается новый файл с таким именем.


• а - открыть файл только для записи и приготовиться дописывать данные в его конец. Если файл с указанным именем не существует, то создается новый файл с таким именем.

• а+ - открыть файл для записи и для чтения и приготовиться дописывать данные в его конец. Если файл с указанным именем не существует, то создается новый файл с таким именем.

Открываемый файл может располагаться и на удаленном сервере - в этом случае oft будет доступен только для чтения независимо от параметров открытия файла. Путь к файлу в таком случае следует указывать полностью - начиная с http:// или ftp://.

Если же файла со счетчиком нет, т. е. посещений раньше не было...

else

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

Глава 12. PHP: полезные мелочи то просто присвоим переменной со сведениями о количестве посещений значение 1.

$sr=l;

Выведем на страницу данные о числе посетителей... echo ("Посетителей - $sr");

и, снова открыв файл счетчика, но теперь уже для записи и очистив все его содержимое (видите параметр "w+"?), запишем в него значение переменной со сведениями о количестве посещений:

$hdl2 = fopen("$dirct/$cnt", "w+");

fwrite($hdl2, $sr);

fclose($hdl2);

Вот, собственно, и все (Рисунок 12.1).


Счетчик посещений - всего с десяток строчек



Рисунок 12.1. Счетчик посещений - всего с десяток строчек


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

$cnt="counter.php";

следует вставить строку, определяющую имя текущего файла на основе значения переменной $PHP_SELF:

$cnt=substr(basename($PHP_SELF), 0, -4). "_cnt.php";

Этот код выделяет из адреса страницы ее имя (без расширения) и создает на его основе уникальное имя файла счетчика (просто добавляя в конец имени страницы комбинацию символов "_cnt .php").



COOKIES



COOKIES

Для передачи данных между страницами можно использовать cookies - файлы, пересылаемые web-сервером браузеру посетителя и сохраняемые им на компьютере посетителя. Все современные браузеры поддерживают cookie.

Установив cookie на одной из страниц сайта (подробнее о cookies рассказывалось в ), вы можете использовать записанные в него переменные на всех остальных страницах сайта (расположенные на том же Интернет-узле - т. е. с тем же доменным именем).

При установке cookie ему дается определенное имя. Впоследствии сценариям на всех страницах этого Интернет-узла браузер посетителя передает при заходе на них переменную, одноименную с этим cookie и содержащую записанные в cookie данные (если в файле php.ini установлен в on параметр register_globals). Кроме того, сценарии на РНР могут получать данные cookie из массива $HTTP_COOKIE_VARS [ 'имя cookie '],ав РНР версий 4.1 и выше - еще и из массива $_СООК1Е [' имя переменной' ] (если в файле php.ini установлен в on параметр track_vars).

Если сведения, передаваемые через cookie, нужно защитить от подделки (т. е., скажем, обеспечить их получение только из cookie и никоим образом не из адресной строки, куда значения одноименных с сохраненных в cookie переменных злоумышленник может подставить), то в сценарии, где используются переменные из cookies, следует их считывать только из упомянутых массивов, а не из одноименной cookie переменной. В указанные массивы попадают исключительно те данные, которые сохранены в cookies.

Одновременно можно устанавливать как один, так и несколько cookies.

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

Помните, что отправка и чтение cookie должны производиться до какого бы то ни было вывода в документ.



РНР: СПОСОБЫ ПЕРЕДАЧИ ДАННЫХ МЕЖДУ ОТДЕЛЬНЫМИ СТРАНИЦАМИ



ГЛАВА 13. РНР: СПОСОБЫ ПЕРЕДАЧИ ДАННЫХ МЕЖДУ ОТДЕЛЬНЫМИ СТРАНИЦАМИ



КРАТКАЯ СПРАВКА



КРАТКАЯ СПРАВКА

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

Ниже приводится краткий список возможных путей решения данной проблемы.



ПЕРЕМЕННЫЕ В АДРЕСНОЙ СТРОКЕ.



ПЕРЕМЕННЫЕ В АДРЕСНОЙ СТРОКЕ.

Переменные указываются за вопросительным знаком, поставленным после адреса страницы, и разделяются амперсандом:

http://www.domen.ru/page.php?perl=znachl&per2=znach2

В результате вызова страницы page.php домена http: //www.domen.ru сценариям на этой странице будут доступны указанные в адресной строке переменные perl (со значением znachl) и рег2 (со значением znachl).

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

Значения переменных можно передавать и дальше так же через адресную строку - для этого достаточно просто помещать их в тексты ссылок на той странице, сценарию на которой они передаются. Скажем, если на странице page.php находятся ссылки на страницы pagel.php, page2.php, и им также следует передать значения переменных perl и рег2, то эти значения следует добавить в эти ссылки, выведя их с помощью кода на РНР:

<а href=pagel.php?perl=<?php echo($perl); ?>&per2=<?php echo($per2); ?>>Ссылка</а>



ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА



ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА

При нажатии кнопки типа submit в пользовательской форме данные, введенные в ее поля, передаются сценарию, расположенному на указанной в параметре action заголовка формы страницу. Они доступны в этом сценарии в переменных, одноименных с соответствующими элементами формы (если в файле php.ini установлен в on параметр reg-ister_globals), а также через массивы $HTTP_POST_VARS (если в файле php.ini установлен в on параметр track_vars) и $_POST (в РНР версий 4.1 и старше).

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

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



СЕССИИ (ВОЗМОЖНО ТОЛЬКО В РНР ВЕРСИЙ 4.0 И ВЫШЕ)



СЕССИИ (ВОЗМОЖНО ТОЛЬКО В РНР ВЕРСИЙ 4.0 И ВЫШЕ)

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

Открыв сессию командой session_start ()1 и зарегистрировав для сессии нужные переменные командой session_register (), можно в сценариях на других страницах сайта (после вызова той же команды session_start ()) работать с этими переменными, как если бы они были определены и установлены в этих же самых сценариях. (Подробнее о данных командах и особенностях их использования в зависимости от настроек файла php.ini читайте в Описании РНР.)

Кроме того, все эти переменные доступны как элементы массивов $HTTP_SESSION_VARS и (в РНР 4.1) $_SESSION (использовать эти массивы предпочтительнее, так как при этом отсутствует риск передачи значений переменных сценарию-обработчику путем указания их значений в адресной строке при неоткрытой сессии).

Подробнее о сессиях читайте в

' Если в php.ini установлен в on параметр session.auto start, то открывать сессию для ее использования не обязательно - достаточно лишь зарегистрировать нужные переменные командой sessionregister, чтобы они сохранялись в качестве сессионных.



УСТАНОВЛЕННЫЕ ПЕРЕМЕННЫЕ (ТОЛЬКО ДЛЯ ПЕРЕМЕННЫХ АВТОРИЗАЦИИ - $PHP_AUTH_USER И $PHP_AUTH_PW)



УСТАНОВЛЕННЫЕ ПЕРЕМЕННЫЕ (ТОЛЬКО ДЛЯ ПЕРЕМЕННЫХ АВТОРИЗАЦИИ - $PHP_AUTH_USER И $PHP_AUTH_PW)

Две строчки введенной посетителем информации можно передать между страницами и с помощью авторизационных переменных -$PHP_AUTH_USER и $PHP_AUTH_PW. Будучи раз определенными, эти переменные сохраняют свое значение до закрытия того окна браузера, в котором они были введены, и всех окон, из этого окна открытых по ссылкам. Однако получить от посетителя те данные, которые планируется записать в эти переменные, можно только с помощью специального диалогового окна авторизации и только до начала вывода web-страницы, на которой эти данные запрашиваются.

Подробнее о работе с этими переменными читайте в

Так что, как видите, способов много. Выбирайте на вкус. Наиболее многообещающим представляется использование сессий, хотя и без данного механизма РНР предоставляет немало возможностей.

Ну а если требуется сохранять данные посетителя между его визитами, причем независимо от компьютера, на котором тот работает, - то

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