Самоучитель по креативному веб-дизайну. Книга 4, стр.14

print() . В результате будет создана Web-страница, содержащая список предлагае —

мых товаров. Таким образом, РНР и текстовые файлы можно использовать для со —

Глава 10. РНР4 52 9





здания содержимого Web-страницы «на лету». В приведенном примере Web-страни —

ца с перечнем предлагаемых вашей компанией товаров не существует, пока посети — тель не вызовет PHP-страницу со сценарием, генерирующим список товаров.

База данных SQL, как и текстовый файл, представляет собой всего лишь на — бор данных. Тем не менее, в отличие от текстовых файлов, в которых приложе- ния хранят данные в виде неструктурированных фрагментов, СУБД управляет

всеми операциями с данными в базе данных SQL и организует данные опти — мальным образом для обеспечения быстрого и легкого доступа к данным и ма — нипулирования ими. Как результат, поиск по текстовому файлу, содержащему не — сколько тысяч пар имен пользователей и паролей, занимает недопустимо длительное время. В то же время СУБД позволяет выполнить поиск такого же объема (среди десятков тысяч записей) в течение долей секунды. Аналогично, СУБД дает возможность вывести на экран список товаров или одного товара

(выбранного из длинного списка) гораздо быстрее, чем при использовании тек — стового файла со списком товаров.

РНР содержит встроенные функции, которые позволяют не только считывать,

но и редактировать данные, хранящиеся в нескольких наиболее популярных ба —

зах данных, в частности DB2, FrontBase, Informix, InterBase, mSQL, MS SQL Server, MySQL, Oracle, ODBC, PostgreSQL и Sybase. Для определения форматов баз данных, доступных для использования в ваших PHP-сценариях свяжитесь со своим Internet-провайдером или администратором баз данных. Если не установ — лена поддержка ни одной СУБД, вас, возможно, заинтересует MySQL. MySQL представляет собой многопользовательскую СУБД, которую можно бесплатно выгрузить и установить из сайта http://www. MySQL. com. Эта СУБД поставляет как для платформы Windows, так и для Unix.

Самоучитель по креативному веб-дизайну. Книга 4, стр.15





Независимо от типа используемой СУБД, для хранения таблиц, которыми будут пользоваться PHP-сценарии, необходимо создать базу данных.

Для создания базы данных воспользуйтесь SQL-оператором CREATE

DATABASE, Предположим, например, что необходимо создать базу данных, в ко — торой будут содержаться таблицы данных, используемых в примерах данной кни —

ги. В качестве имени базы данных можно выбрать аббревиатуру оригинального названия книги (HTML & Web Design Tips & Techniques — HWDTT). Таким обра — зом, для создания базы данных с таблицами для примеров данной книги необ- ходимо выполнить следующий оператор SQL:



CREATE DATABASE hwdtt;

Синтаксис оператора CREATE DATABASE ВЫГЛЯДИТ следующим образом:



CREATE DATABASE



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

53 0 Глава 10. РНР4





час важно понимать, что SQL-таблица состоит из строк связанных данных, орга —

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

Самоучитель по креативному веб-дизайну. Книга 4, стр.16

лей и паролей каждая строка в таблице будет содержать пару имя пользователя/

пароль, при этом имя пользователя будет находиться в одном столбце, а его па —

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



USE hwdtt;

CREATE TABLE webSiteUsers

(username VARCHAR(20) NOT NULL, password VARCHAR(20) NOT NULL) ;

Синтаксис оператора CREATE TABLE имеет следующий вид:



CREATE TABLE

(столбца> [] ,



последнего столбца> столбца> [

последнего столбца>]) Ц

Очевидно, что таблица должна содержать данные, которые в нее можно запи —

сать с помощью SQL-оператора INSERT, например, для вставки имен пользовате — лей и паролей в таблицу webSiteUsers можно выполнить следующие операторы INSERT:



INSERT INTO webSiteUsers (username, password)

VALUES («Konrad», «abcl25″);

INSERT INTO webSiteUsers (username, password)

VALUES («Gracie», «157WXY3″);

Синтаксис оператора INSERT ВЫГЛЯДИТ следующим образом:



INSERT INTO (столбец2, …, столбецЫ>)

VALUES{значение1,значение2,…fзначение!*);

Далее, для использования таблицы базы данных из примера этого совета СУБД можно передать запрос в виде SQL-оператора SELECT. Например, для счи — тывания из таблицы имен пользователей и паролей можно воспользоваться сле — дующим оператором:



SELECT username, password FROM webSiteUsers;



Для проверки ввода посетителем верного имени пользователя можно восполь — зоваться конструкцией WHERE, который указывает СУБД вернуть только те стро —

ки, в которых имя пользователя и пароль соответствуют данным, введенным по — сетителем в элементы формы входа на сайт. Например, если посетитель ввел в поле имени пользователя слово Konrad и слово wrongPass в поле ввода пароля, запрос будет выглядеть следующим образом:



SELECT COUNT(*) FROM webSiteUsers

WHERE username=»Konrad» AND password^»wrongPass»

Глава 10. РНР4 53 1





Если приведенный запрос возвращает значение «1″ , введенная посетителем пара имя пользователя/пароль является верной. В противном случае, если вве — денная посетителем пара в таблице отсутствует (как в приведенном случае), зап —

рос возвращает значение «0м, которое означает, что в таблице не содержится

данных для пользователя с указанным именем и паролем.

В следующем совете будет показано, каким образом данные заносятся в SQL — таблицу, и каким образом в PHP-сценариях выполняются запросы на считывание SQL-таблиц.



Вывод на Web-странице результатов запроса в базу данных SQL в HTML-таблице

Для считывания данных из базы данных и вывода их на Web-странице РНР- сценарий должен выполнить три операции. Во-первых, сценарий должен устано —

вить соединение с СУБД с помощью вызова встроенной функции соединения с

базой данных (например, функции mysqi_connect(), которая позволяет устано — вить соединение с СУБД MySQL). Во-вторых, сценарий должен по установлен — ному соединению с СУБД отправить запрос с помощью встроенной функции от —

правки SQL-запроса (например, функции mysqi query(), которая позволяет

PHP-сценарию передавать на выполнение СУБД операторы SQL). В-третьих, после помещения СУБД результатов запроса в выходной буфер Web-сервера сце — нарий должен считать данные из буфера и вывести их на Web-странице. Например, при работе с MySQL сценарий может использовать встроенную функцию

Самоучитель по креативному веб-дизайну. Книга 4, стр.17

mysqi_fetch_array(), которая считывает строку результатов SQL-запроса (из бу- фера СУБД) и помещает значения столбцов строки в массив элементов. Затем, сценарий может выполнить оператор echo или вызывать функцию print о для вывода значений полей таблицы базы данных (из массива) на Web-страницу.



ПРАКТИК Ш

Предположим, например, что используется СУБД MySQL и в HTML-таблице на

Web-странице необходимо вывести данные из SQL-таблицы с именем products,

содержащейся в базе данных HWDTT. Прежде всего, выполним вызов функции

mysqi connect () следующего вида:



$link = mysql connect ($db_host, $db_user, $db_pass) ;



$db host содержит строку «locaihost» (если сервер MySQL выполняется в

той же системе, что и Web-сервер) или строку с IP-адресом компьютера, где вы — полняется сервер MySQL, с которым необходимо установить соединение. (Для получения IP-адреса сервера MySQL свяжитесь с Internet-провайдером.) Осталь —

ные два параметра, $db_user и $db_pass, представляют собой имя пользова —

теля и пароль, необходимые функции mysqi_connect() для установки соеди — нения с СУБД MySQL. (При работе с СУБД MySQL с параметрами, установленными по умолчанию, войти в базу данных можно с именем пользо —

вателя $db_user=»root» И паролем $db_j>ass=»",)

В функции mysqi_connect () PHP-процессор присваивает соединению с

СУБД идентификатор переменной $iink или возвращает значение false, если

53 2 Глава 10. РНР4





попытка установить соединение не удалась. Поскольку время от времени случа —

ются ошибки, с помощью оператора if проверьте значение переменной $iink, и

в случае необходимости выведите на экран сообщение об ошибке. Если попытка

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

if (!mysql select_db ($db_name, $link)

{

//Операторы, обрабатывающие случай неудавшейся попытки использования

//базы данных

}

else

{

//Обработка после успешной установки соединения и выбора базы данных

}

Сервер MySQL, как правило, поддерживает несколько баз данных, поэтому вы должны выбрать базу данных, содержащую таблицы, данными которых вы хотите

пользоваться. В приведенном примере $db name содержит строку «HWDTT», a

$iin k — идентификатор соединения с базой данных, сгенерированный успеш —

но выполненной функцией mysqi_connect(). Как и ранее, необходимо про —

верить данные, возвращаемые PHP-функцией (в данном примере функцией

mysqi seiect_db()), чтобы убедиться, что выбор базы данных был выполнен ус —

пешно. Функция mysqi_seiect_db() возвращает tru e при успешном выборе базы данных и fals e — в противном случае.

После успешной установки соединения с СУБД MySQL и выбора базы дан — ных для выполнения запроса (или любого другого оператора SQL) вызовите фун —

кцию mysqi query (), как показано в следующем примере:

$resul t = mysql query ($query, $link) ;



В приведенном примере, в котором считывается содержимое таблицы

products, параметр $query СОДерЖИТ SQL-ОПераТОр SELECT * FROM product s

ORDER BY description. Как и ранее, параметр $iink содержит идентификатор

соединения с базой данных, возвращенный успешно выполненной функцией

mysqi_connect (), вызов которой находится в начале сценария. Функция

mysqi_query () возвращает fals e (если СУБД по какой-то причине не смогла выполнить переданный ей SQL-оператор) или указатель на место, куда СУБД поместила результаты выполнения запроса.

Для считывания результатов запроса (т. е. строк данных, которые запрос

выбрал из таблицы products) несколько раз вызовите функцию

mysqi fetch_array о для считывания всех строк результатов запроса и сохране — ния их в массиве. Затем выведите данные из массива на Web-страницу. Напри- мер, следующий сценарий извлекает количество полей (возвращенных в резуль — татах запроса), их имена и типы, и выводит значения столбцов, содержащихся в результатах запроса, в виде HTML-таблицы, которую сценарий создает на Web — странице:

Глава10.РНР4 533



// Определить количество полей, возвращенных в результатах запроса

$fields = mysql_num fields ($result) ;

// Начать определение HTML-таблицы

echo «»;

// Вывести на экран названия столбцов в виде заголовков HTML-таблицы

echo «
«;

for ($i = 0; $i

{

echo «» . mysql fieldjiame($result, $i) . «»;

$fieldType[$i] = mysql_field type($result, $i) ;

}

echo «

«;

// Вывести в HTML-таблице результаты запроса

while

{

echo «
«;

for ($i = 0; $i

{

if ($fieldType[$i] <> «string»)

echo « «;

els e

echo « » ;

echo «$array[$i]

«;

}

echo «

«;

}

echo «» ;



Полный код PHP-сценария, описанного в этом совете, находится на странице

chptiOTipO9.php, которую можно выгрузить из сайта издательства русскоязыч —

ной редакции ЭТОЙ КНИГИ (http://www. diasoft. kiev. ua). Изменяя ИНформа — цию о соединении и SQL-запрос, вы имеете возможность использовать этот сце —

нарий для считывания и вывода на экран в виде HTML-таблицы результатов

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

щаются в строки таблицы.



Использование РНР для генерации случайного пароля

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

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

Самоучитель по креативному веб-дизайну. Книга 4, стр.18

они часто произносят. К сожалению, такие «памятные» слова, числа или слово —

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

пользователем.

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

534 Глава 10. РНР4



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



ПРАКТИКУМ

Чтобы использовать РНР-сценарий для присвоения посетителям случайных паро — лей необходимо организовать Web-страницу с формой, аналогичной показанной

на рис. 10.10, которая позволяет посетителям вводить имя пользователя и адрес электронной почты.





Как указано в тексте в нижней части страницы, показанной на рис. 10.10, после ввода посетителем имени пользователя, не присвоенного другому члену сайта, PHP-сценарий сгенерирует пароль длиной от пяти до восьми символов. Сценарий случайным образом выбирает не только символы пароля, но и длину пароля, что только повышает уровень безопасности. (Пароль гораздо сложнее взломать, если хакеру не известна его длина.)

Самоучитель по креативному веб-дизайну. Книга 4, стр.19

Для генерации случайных паролей можно воспользоваться следующим РНР — сценарием:



function generatePassword()

{

// Выбрать начальное число для генерации длины пароля

mt_srand ((double)microtime() * 1000000);

$passwordLength = mt_rand (5, 8) ;



Глава10.РНР4 535





// Установить диапазон ASCII-символов для случайной генерации символов

// ASCII-коды 48-57 включительно — символы от 0 до 9

// ASCII-коды 65-90 включительно — символы от А до Z

// ASCII-коды 97-122 включительно — символы от а до z

$lowerBound = 48;

$upperBound = 122;

// Исключить специальные символы

$excludeSymbols =

array(‘:’,';•,’•.,•?•,,•@’,•[•,chr(92),']! ,’А’,’ ‘,’ч ‘) ;

// Создать случайный пароль

$i=0;

$password = «» ;

while ($i

{

mt_srand ((double)microtime() * 1000000);

$letter = chr (mt rand ($lowerBound, $upperBound) ) ;

if (!in array ($letter, $excludeSymbols))

{

$password.= $letter;

$i++;

}

} ‘..’ •

return $password;

}

Далее вставьте имя пользователя, адрес электронной почты, текущий IP-адрес,

системное время и (случайно сгенерированный) пароль в таблицу usemames

базы данных сайта. Затем вызовите встроенную функцию maii(), которая отпра — вит пароль по указанному посетителем адресу.

При входе посетителя на сайт сценарий входа будет выполнять поиск в таб — лице usemames введенных имени пользователя и пароля. Если сценарий нахо —

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

содержащийся в PHP-сценарии страницы chptiOTipiOLogin. php), сценарий вхо —

да на сайт для активации учетной записи сохраняет системное время в столбце

iast coiumn записи в таблице имен пользователей.

Web-страницы с формами и PHP-сценариями, описанными в этом совете, на —

ходятся в файле chptiOTipio. zip, который можно выгрузить из сайта издатель —

ства РУССКОЯЗЫЧНОЙ редакции ЭТОЙ КНИГИ (http://www. diasoft. kiev. ua).



Использование РНР и MySQL для организации парольного доступа к Web-сайту

В совете «Использование РНР и дискового файла для организации парольного

доступа к Web-сайту» выше в этой главе вы научились организовывать ограничен — ный доступ (т. е. доступ только для зарегистрированных членов) к Web-сайту с

помощью РНР и текстового файла, который содержит пары имя пользователя/ пароль и хранится на жестком диске Web-сервера. К сожалению, помещение списка авторизированных пользователей сайта в текстовый файл обладает не — сколькими недостатками:

53 6 / ‘ Глава 10. РНР4





• При каждом добавлении в файл новой пары имя пользователя/пароль уве- личивается время входа посетителя на сайт. С увеличением размера файла поиск совпадающей пары в файле будет выполняться все дольше и дольше.

• Удаление и редактирование пар имя пользователя/пароль в текстовом фай —

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

• Сетевые пользователи (например, системный администратор и другие пользователи с привилегированными учетными записями) могут по ошиб —

ке удалить файл доступа при выполнении очередной «чистки» каталогов с

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

сто просмотреть содержимое файла и узнать полный список пользователей вашего сайта и их паролей.

За счет хранения пар имя пользователя/пароль в базе данных SQL вы может исключить все описанные выше недостатки. Все пользователи, авторизированные для работы с таблицей доступа, работают с ней через СУБД. Поэтому никто не сможет изменить формат строк в файле доступа при вставке, удалении или ре — дактировании пар имя пользователя/пароль. Более того, вы имеете возможность контролировать операции пользователей путем открытия доступа для одних пользователей «только для вставки», в то время как для других — для «вставки», «удаления», «просмотра» и/или «редактирования». И, кроме того, независимо от количества зарегистрированных пользователей (будь их 10 или 10 000) РНР-сце- нарию потребуется одно и тоже (незначительное) время на сравнения пары имя пользователя/пароль для посетителя сайта.

Самоучитель по креативному веб-дизайну. Книга 4, стр.20



ПРАК ИКУМ

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



CREATE TABLE siteAccessList

{username VARCHAR(30) PRIMARY KEY

password VRACHAR(15) NOT NULL) ;

Приведенный выше SQL-оператор CREATE создает таблицу базы данных, со — держащую два столбца для хранения имен пользователей и паролей. Первый столбец, username, может хранить имена пользователей длиной до 30 символов,

а атрибут PRIMARY KEY указывает, что каждая строка в таблице должна иметь уникальное, не пустое (NOT NULL) значение в столбце username. Второй стол — бец, password, может содержать непустой пароль длиной до 15 символов.

Затем выполните SQL-оператор INSERT, аналогичный приведенному в следую — щем примере, который вставит в таблицу пары имя пользователя/пароль, ис — пользуемые посетителями для получения доступа на сайт:



Глава10.РНР4 . 537





INSERT INTO siteAccessList VALUES («Konrad», «King»);

INSERT INTO siteAccessList VALUES («Sally», «Fields»);

INSERT INTO siteAccessList VALUES («Craig», «Berry»);

(Чтобы незарегистрированные пользователи сайта не могли «угадать» пароли членов сайта и таким образом получить несанкционированный доступ к содер — жимому Web-сайта, в качестве паролей не следует использовать фамилии, как это показано в предыдущем примере.) Каждый из трех операторов INSERT создает новую строку в таблице, помещая первый элемент в списке VALUES В первый столбец, а второй элемент — во второй столбец таблицы.

Самоучитель по креативному веб-дизайну. Книга 4, стр.21

После ввода посетителем его имени пользователя и пароля в поля формы входа на сайт и нажатия кнопки «Войти» PHP-сценарий, аналогичный приве- денному ниже, устанавливает соединение с базой данных MySQL и определяет, присутствует ли введенные пользователем имя и пароль в списке авторизирован- ных пользователей и паролей:





$db_host = «localhost»;

$db_user = «root»;

$db_pass = «»;

$dbjname = «hwdtt» ;

// Установить соединение с СУБД MySQL

$link = mysql connect($db_host, $db_user, $db_pass;

// Выбрать базу данных с таблицей siteAccessList

mysql_select db ($db name, $link) ;

// Сформировать запрос и передать его на выполнение СУБД

$query = «SELECT username FROM siteAccessList » .

«WHERE username = \»$username\» «. «AND password = \»$password\»";

$result = mysql query ($query, $link) ;

// Определить количество строк в результатах запроса. Если пара

// имя/пароль присутствует в файле, результаты запроса будут содержать

//в точности 1 строку. В противном случае функция mysql num_jrows ()

// обнаружит, что запрос вернул ноль (0) строк.

if (mysql_num_rows ($result) == 0)

header («Location: ChptlOTipllAccessDenied. php»);

else

header («Location: ChptlOTipllLoginSuccessful. php»);

?>

После вызова функции mysqi_connect() для регистрации на сервере MySQL

сценарий вызывает функцию mysqi_seiect_db(), которая выбирает базу данных,

Содержащую СПИСОК ЧЛеНОВ Сайта (В Приведенном Примере ЭТО SiteAccessList). Далее сценарий формирует запрос (т. е. SQL-оператор SELECT), который указыва —

ет СУБД вернуть строки таблицы, содержащие пару имя пользователя/пароль, совпадающие с именем и паролем, введенным посетителем в форме входа на

сайт. После вызова в сценарии функции mysqqi_query о, передающей запрос на исполнение СУБД, СУБД выполняет запрос и помещает список строк с совпада — ющими парами имя пользователя/пароль в выходной буфер.

Функция mysqi num_rows() определяет количество строк, возвращаемых

СУБД в результате выполнения SQL-оператора SELECT, переданного ей функцией

538 Глава 10. РНР4





mysql query () . ЕСЛИ фуНКЦИЯ mysqljrmm_rows () В Операторе if-els e ВОЗВраща —

ет значение «1″ , посетитель имеет право доступа на сайт. В противном случае,

если функция возвращает значение «0м, сценарий запрещает доступ посетителя

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

поскольку введенная посетителем пара имя пользователя/пароль отсутствует в списке авторизированных пользователей сайта.

Web-страница с формой входа на сайт и PHP-страница с сценарием входа на

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

(http://www. diasoft. kiev. ua).



Исключение возможности изменения посетителями значений переменных с помощью URL-аргументов

Для передачи результатов заполнения формы PHP-сценарию можно пользо —

ваться методами GET или POST. Как вы узнали из главы 3, метод POST приво — дит к тому, что Web-браузер передает результаты формы Web-серверу в теле HTTP-запроса, в то время как метод GET помещает результаты формы в URL-ад — рес, по которому Web-сервер должен передать результаты формы. К сожалению, возможность передачи значений переменных PHP-сценарию путем присоедине —

ния пар имя/значение в конец URL-адреса PHP-страницы (как это делает метод GET) представляет собой потенциальную угрозу безопасности. Посетители могут изменить значения переменных, которые вы не хотите менять.

Предположим, например, что сайт имеет страницу входа, которая требует от

посетителя ввода пары имя пользователя/пароль. После ввода корректных значе — ний сценарий входа устанавливает PHP-сеанс и присваивает переменной, ска —

жем, с именем $s_username, имя, которое посетитель ввел для получения досту —

па к сайту. До входа на сайт переменная $s_usemame не содержит значения (т. е.

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





session_start() ;

i f (!isset($s_username))

{

header(«Location: http://www. NVBizNet. com/HWDTT/

LoginScreen. htm»);

exit ;

{

?>



К сожалению, если посетитель введет в адресной строке браузера URL-адрес

страницы, которая находится в разделе сайта, доступном только для зарегистри- рованных членов, как показано ниже, PHP-процессор установит значение пере —

менной $s_username равным «Konrad»:



http://www. NVBizNet. com/HWDTT/Loggedln. php? s username=Konrad

Глава 10. РНР4 53 9





Поскольку при проверке в начале PHP-страницы переменная $s_usemame бу —

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



ПРАКТИКУМ

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

Самоучитель по креативному веб-дизайну. Книга 4, стр.22

этом молено с помощью следующего кода проверить, что посетитель сайта не ввел дополнительных аргументов в URL-адресе страницы:





if ($HTTP_SERVER_VARS["argcM] != 0)

{

header(«Location: $PHP_SELF»);

exit;

}

?>

За счет передачи результатов заполнения формы в теле HTTP-запроса вы га — рантируете, что ни одна PHP-страница не будет принимать аргументы из URL — адреса. Поэтому, если PHP-процессор обнаружит в URL-адресе аргументы, про — цессор просто заново загрузит эту же страницу, но без аргументов.



Использование РНР и MySQL для отслеживания

положения посетителя на Web-сайте

После создания Web-сайта часто разработчики желают получить информацию

о посетителях сайта, посещаемых ими страницах и (возможно) LJRL-адреса стра — ницы, с помощью гиперссылки на которую посетитель попал на их сайт. Для со — здания полного журнала посещений сайта по каждом посетителю обратитесь к своему Internet-провайдеру. Большинство коммерческих Web-серверов (включая сервер IIS) имеют встроенные возможности по генерации журналов посещений

сайтов, совместимые с рекомендациями консорциума W3Q. После генерации Web-сервером стандартного журнала посещений можно воспользоваться стандарт — ными анализаторами журналов (или же разработать собственный анализатор) для считывания содержимого файла журнала (в формате ASCII) и вывода на экран данных о посещаемости сайта в форме текста и графиков.

Самоучитель по креативному веб-дизайну. Книга 4, стр.23

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

определенным страницам сайта, для создания собственных отчетов о посещаемо — сти можно воспользоваться таблицей MySQL и набором PHP-сценариев. Предпо — ложим, например, что для создания таблицы usageLog в базе данных MySQL был выполнен следующий SQL-оператор CREATE:



CREATE TABLE UsageLog

(visitor_I P TEXT,

page_URL TEXT,

54 0 Глава 10. РНР4





DT_retrieved TIMESTAMP,

referrer URL TEXT, session_I D TEXT,

session_view s INTEGER) ; [ НИ

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

usageLog базы данных MySQL.



function recordPageHit($db_host,$db_user,$db_pass,$db_name,$sessionID)

{

global $REMOTE_ADDR, $HTTP_XJFORWARDED_FOR, $PHP_SELF, $link, $result;

// Для экономии места используется функция str_jreplace() для удаления из

// URL строки //"http://". Кроме того, для исключения запроса после "?" в

// URL используется explode(), если таковой имеется.

$referer = explode("?",

str_replace("http://", "", getenv("HTTP_REFERER")));

// Вызвать пользовательскую функцию для установки соединения с СУБД MySQL

if (connectToDB ($db_host, $db_user, $db pass, $db name))

{

// Вставить только одну строку для каждой страницы в одном сеансе. Если

// посетитель просматривает страницу несколько раз, отслеживать коли -

// чество посещений за сеанс в столбце Msession views" таблицы "usageLog"

$query = "UPDATE usageLog " .

"SET session_views = session views + 1 ".

"WHERE session ID '= '$sessionID' ".

" AND page_URL = ' $PHP_JSELF' " ;

$result = executeQuery($query);

// Проверить присутствует ли оператор UPDATE в строке для страницы.

// Если нет, вставить в таблицу строку для страницы. Страница будет

// содержать только одну строку информации за один сеанс.

if (!mysql_affected_rows ($link) )

{

$query = "INSERT INTO usageLog " .

" (visitor IP, page URL, referer_URL, ". "session_ID, session_views) ".

"VALUES ('$REMOTE_ADDR' , '$PHP_SELF', ".

"'$referer[0]‘,’$sessionID’,1)»;

$result = executeQuery($query);

}

}

return;

}

?>



Скопируйте исходный PHP-код приведенной выше функции и пользовательс — кой функции connectToDB () (служащей для установки соединения с СУБД

MySQL в начале функции recordPageHito) на свой компьютер, выгрузив архив

chptiOTipi3.zip из сайта издательства русскоязычной редакции этой книги (http :

//www. diasoft. kiev. ua). Страница chptiOTipi3.php (входящая в состав архива

chptiOTipi3.zip) содержит операторы, которые необходимо вставить в начало фай —

лов РНР-СТранИЦ ДЛЯ Организации Сеанса И ВЫЗОВа фуНКЦИИ recordPageHit() .

Глава10.РНР4 54 1





Обратите внимание, что функция recordPageHit() вызывает одну и ту же поль — зовательскую фуНКЦИЮ (executeQuery() , ВКЛЮЧенНуЮ В арХИВ ChptlOTipl3.zip ) как для обновления содержимого строки данных в таблице UsageLog, так и для вставки новой строки. При работе с СУБД MySQL для передачи на выполнение SQL-операторов (например, SELECT, INSERT, UPDATE, CREATE, DROP И Т. Д.) исполь —



Полезные ссылки
Случайные записи
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 103
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.7
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.110
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.26
  • 12.09.2014">Помост на декоративном водоеме
  • 16.03.2011">Руководство по actionscript. часть 3, стр. 016
  • 23.04.2012">Почта Mail.Ru полностью перешла на безопасный протокол HTTPS
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 023
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 079
  • 27.07.2011">iPhone 5 получит Bluetooth 4.0!
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.53
  • 27.07.2010">Визуальное оформление для навигации
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.63
  • 29.08.2010">Методы представления картинок в веб.
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 062
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...