Сбор статистики на PHP. Получение данных о посетителе на PHP

Статистические сведения о посетителях сайта приносят не мало пользы. По статистике можно подогнать дизайн сайта в соответствии с разрешением большинства посетителей, подогнать дизайн к браузеру, на котором приходят большая часть посетителей да и просто интересно, кто заглядывает к вам на сайт, из под какой OC, а может это поисковый робот яндекса или гугла? Хотя некоторые системы слежения за посетителями бывают черезвычайно сложными, но с помощью довольно простой системы можно получить любопытные сведения о посетителях сайта. Я покажу как сделать с виду простой журнал посещений сайта с помощью PHP и cookies (MySQL не требуется). К тому же мой пример можно легко расширить.

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


· Браузер + OC (HTTP_USER_AGENT)

· IP адрес (REMOTE_ADDR)

· Хост (REMOTE_HOST)

· Страницу-рефферер (HTTP_REFERER)

· Время визита (date("d.m.Y H:i:s"))

· Запрашиваемый адрес (REQUEST_URI)

Даже эти данные, я думаю, будут весьма интересны веб-мастерам. Итак, начнем. Скрипт будет называться sniffer.php. Я приведу текст всего скрипта и дополню это обильными комментариями:


//sniffer.php

//защита от непосредственного запуска

//скрипта кем то посторонним

If ( eregi ( "sniffer.php" , $PHP_SELF )) {

Header ( "Location: index.php" );

Extract ( $HTTP_GET_VARS );

Extract ( $HTTP_POST_VARS );

Extract ( $HTTP_COOKIE_VARS );

Extract ( $HTTP_SERVER_VARS );

//этот фрагмент кода был позаимствован

$fileName = "stat.txt" ; //имя файла со статистикой

$maxVisitors = 30 ; //количество записей, отображаемых

//при просмотре статистики

$cookieName = "visitorOfMySite" ; //имя куки

$cookieValue = "1" ; //значение куки

$timeLimit = 86400 ; //срок в секундах, который должен

//пройти с момента последнего посещения сайта, что бы

//информация о посетителе записалась повторно. Это

//значение равно 1 дню, т.е. один и тот же посетитель

//записывается в статистику раз в одни сутки. Если

//эту переменную приравнять к нулю, то будут учитываться

//все посещения одного и того же посетителя

//статистики

$headerColor = "#808080" ;

$headerFontColor = "#FFFFFF" ;

$fontFace = "Arial, Times New Roman, Verdana" ;

$fontSize = "1" ;

$tableColor = "#000000" ;

$rowColor = "#CECECE" ;

$fontColor = "#0000A0" ;

$textFontColor = "#000000" ;

//все переменные подготовлены.

//Функция записи данных о посетителе

Function saveUserData () {

GLOBAL $fileName , $HTTP_USER_AGENT , $REMOTE_ADDR , $REMOTE_HOST ,

$HTTP_REFERER , $REQUES_URI ;

$curTime = date ( "d.m.Y @ H:i:s" ); //текущее время и дата

//подготавливаю данные для записи

If (empty( $HTTP_USER_AGENT )) { $HTTP_USER_AGENT = "Unkwnown" ;}

If (empty( $REMOTE_ADDR )) { $REMOTE_ADDR = "Not Resolved" ;}

If (empty( $REMOTE_HOST )) { $REMOTE_HOST = "Unknown" ;}

If (empty( $HTTP_REFERER )) { $HTTP_REFERER = "No Referer" ;}

If (empty( $REQUEST_URI )) { $REQUEST_URI = "Unknown" ;}

$data_ = $HTTP_USER_AGENT . "::" . $REMOTE_ADDR . "::" . $REMOTE_HOST . "::

" . $HTTP_REFERER . "::" . $REQUEST_URI . "::" . $curTime . "\r\n" ;

//разделителем будут два ":"

If ( is_writeable ( $fileName )) :

$fp = fopen ( $fileName , "a" );

Fputs ( $fp , $data_ );

Fclose ( $fp );

//функция записи готова. Теперь нужно написать

// функцию вывода данных из файла статистики

Function showStat () {

GLOBAL $headerColor , $headerFontColor , $fontFace , $fontSize , $tableColor ,

$fileName , $maxVisitors , $rowColor , $fontColor , $textFontColor ;

// вывожу таблицу

$count = sizeOf ( $fbase );

Echo "" ;

Echo " Всего посещений : $count

" ;

Echo "

Border=\" 0\ " bgcolor=\" $tableColor\ ">" ;

Echo "

" ;

Echo "" ;

// открываю файл и запускаю цикл

$fbase = file ( $fileName );

$fbase = array_reverse ( $fbase );

For ( $i = 0 ; $i < $maxVisitors ; $i ++) :

If ( $i >= sizeof ( $fbase )) {break;}

$s = $fbase [ $i ];

// разделяю

$strr = explode ( "::" , $s );

If (empty( $strr )) {break;}

// вывожу данные

Echo "

" ;

?>

Скрипт сбора и показа статистики готов. Теперь нужно вставить в те страницы, информацию о посетителях которой вы хотите просмотреть:


Include( "sniffer.php" );

If (! isset($ $cookieName )) :

// установить куки

Setcookie ( $cookieName , $cookieValue , time ()+ $timeLimit );

SaveUserData ();

?>

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


< html >< body >

Статистика

ShowStat ();

?>


Здесь мы просто включили файл sniffer.php и вызвали из него функцию showStat() Вот с помощью такого небольшого скрипта, длинной всего ровно в 100 строк, можно с помощью PHP получить и в удобном виде просмотреть. Здесь ещё много чего предстоит сделать, например сделать статистику по реферерам, браузерам... Так же можно из HTTP_USER_AGENT вытащить браузер и ОС и записать их в более удобном виде. Кстати, все размеры при выводе статистики я расчитывал при разрешении 1024*768 и у меня все удобно помещается в одну строку.

<

Font face=\" $fontFace\ " color=\" $headerFontColor\ "

Size=\" $fontSize\ "> Браузер

Size=\" $fontSize\ ">IP

Size=\" $fontSize\ "> Хост

Size=\" $fontSize\ "> Ссылка

Size=\" $fontSize\ "> Страница

Size=\" $fontSize\ "> Время визита

<

Size=\" $fontSize\ ">$strr

<

Font face=\" $fontFace\ " color=\" $fontColor\ "

Size=\" $fontSize\ ">$strr

<

Font face=\" $fontFace\ " color=\" $fontColor\ "

Size=\" $fontSize\ ">$strr

<

Font face=\" $fontFace\ " color=\" $fontColor\ "

Size=\" $fontSize\ ">$strr

<

Font face=\" $fontFace\ " color=\" $fontColor\ "

Size=\" $fontSize\ ">$strr

<

Font face=\" $fontFace\ " color=\" $fontColor\ "

Size=\" $fontSize\ ">$strr

Назад
28.02.16 11K

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

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

Разрабатывать формы поиска при помощи PHP , а также познакомитесь с SQL (Structured Query Language ) – специальным языком для сбора, записи и модификации информации, содержащейся в базах данных. Перед тем как начать, рекомендуем вам скачать файлы проекта .

Что вам понадобится

  • Инструмент для работы с базами данных MySQL .
  • Локальный или удаленный сервер с поддержкой PHP .
  • Текстовый редактор.

Создаем базу данных

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

Самым популярным инструментом для управления MySQL является PHP My Admin , Этого инструмента будет достаточно для нашего сегодняшнего руководства.

Создание таблицы

Наша таблица должна быть создана в следующем формате:

Column Name Data Type Length Null or Not Null Primary key? Auto Increment
ID INT 1 Not Null Yes Yes
FirstName Varchar 50 Not Null No No
LastName Varchar 50 Not Null No No
Email Varchar 50 Not Null No No
PhoneNumber Varchar 15 Not Null No No

Таблица базы данных состоит из столбцов и строк, как в Excel . Первый столбец позволяет идентифицировать данные по имени. Далее идет колонка Data types (тип данных ), которая указывает нам на тип данных, содержащихся в колонке. В поле Length (Длина ) указывается максимальный объем памяти (хранилища ) для столбца таблицы. Мы используем переменные, которые дают больше гибкости. Другими словами, если длина ФИО меньше 50 символов, то будет занята лишь часть отведенного места.

И среди данных персонала не может быть пустых значений (null, empty ). Первая строка выделена желтым цветом, потому что столбец ID – наш основной ключ. Основной ключ в базе данных гарантирует, что каждая запись будет уникальной. К этой колонке также применен автоинкремент, а это значит, что каждой записи в нашей базе данных будет присваиваться уникальный номер автоматически.

Вносим представителей персонала в таблицу

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

Column ID FirstName LastName Email PhoneNumber
2 Ryan Butler [email protected] 417-854-8547
3 Brent Callahan [email protected] 417-854-6587

Разработка формы

Чтобы создать форму поиска по сайту через Google , откройте любой подходящий текстовый редактор. Я рекомендую воспользоваться бесплатным PSPad . Вы можете использовать любой текстовый редактор, где предусмотрена подсветка синтаксиса. Это в значительной степени облегчит процесс написания и отладки PHP-кода . Создавая страницу для формы поиска, не забудьте сохранить ее в формате .php , иначе PHP-код не будет обрабатываться должным образом. Как только сохраните документ, скопируйте в него следующую разметку:

Поиск контактов:

Детальный поиск контактов

Вы можете искать по имени или фамилии

Если вы знакомы с языком HTML , то тут вам все должно быть понятно как минимум до открывающего тега form . Внутри этого тега находится важнейший элемент всего кода – атрибут action . В качестве действия нашей формы мы указали название нашего файла, а затем применили к нему строку запроса “go ”.

Проверка на соответствие критерию

Когда пользователь вводит имя или фамилию, а затем нажимает кнопку подтверждения, форма передает данные самой себе и добавляет в конце строку запроса “go ”. На данном этапе мы проверяем наличие строки запроса go . Если результат положительный, выводим результаты поиска.

До вывода запрашиваемых результатов нам нужно перепроверить: (1) была ли подтверждена форма, (2) содержит ли строка запроса значение go, (3) был ли поисковой запрос введен в нижнем или верхнем регистре? Если ни одна из проверок не дает положительного результата (true ), то от нас не требуется выполнять какие-либо действия.

Для начала добавим небольшой блок кода PHP поиск по сайту после закрывающего тега :

Сначала мы открываем блок PHP-кода тегом ””.

Любой PHP-код внутри этой пары тегов будет исполняться сервером. Затем мы проверяем, была ли подтверждена форма:

Введите поисковый запрос

"; } ?>

Мы воспользуемся встроенной функцией isset , которая возвращает значение типа bool , и поместим в нее массив $_POST . Логическое выражение в программировании позволяет получить нам либо true , либо false .

Следовательно, если функция возвращает значение true , то форма была подтверждена, и нам нужно продолжить выполнение кода дальше. Если же функция возвращает значение false , то мы выведем сообщение об ошибке. Сохраните весь набранный код в файле search_submit.php .

Введите поисковый запрос

"; } } } ?>

Мы вкладываем еще одно условное логическое выражение внутрь основного, но только в этот раз мы используем массив $_GET вместе со значением “go ”. Сохраните изменения в файле search_go.php .

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

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

В нашем случае, это будет поле «Имя » (name ). Чтобы извлечь параметры поиска, указанные посетителем, мы создаем переменную $name, и привязываем к ней значение POST с названием поля из формы, которое будет использоваться в SQL-запросе . Сейчас мы реализовали: (1) отправку данных формы, (2) строка запроса включает значение go и (3) посетитель ввел либо заглавную, либо строчную первую букву. И все эти проверки происходят еще до внесения изменений в базу данных. Сохраните все изменения.

Результаты Connect, Select, Query и Return из таблицы базы данных

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

", "") or die (" Я не могу подключиться к базе данных, так как: " . mysql_error()); else{ echo "

Пожалуйста, введите поисковый запрос

"; } } }?>

Мы создаем переменную $db , и привязываем ее к встроенной функции MySQL mysql_connect , которая принимает три параметра: сервер с базой данных (localhost , если вы работаете локально ), логин и пароль.

После этого мы запускаем встроенную PHP-функцию die , которая останавливает дальнейшее выполнение кода, если нет соединения с базой данных. И выводим информацию об ошибке, запуская встроенную функцию MySQL mysql_error , которая вернет причину ошибки. Сохраните файл search_connectdb.php .

Пожалуйста, введите поисковый запрос

"; } } } ?>

Создаем переменную под названием mydb и привязываем ее ко встроенной MySQL-функции mysql_select_db , а затем указываем название базы данных, которую создали ранее. Далее мы опрашиваем таблицу базы данных при помощи SQL-запроса с переменной name, в которой содержатся параметры поиска, введенные посетителем:

Пожалуйста, введите поисковый запрос

"; } } } ?>

При опросе таблицы базы данных мы создаем переменную $sql , и привязываем ее к строке, содержащей SQL-запрос . Мы используем оператор SELECT для извлечения значений из столбцов id , а также имени и фамилии из таблицы contacts . Затем мы используем инструкцию WHERE вместе со значениями имени и фамилии, чтобы сузить поиск.

Вместе с оператором LIKE мы используем знак процента (%) – спецсимвол, который возвращает 0 и более знаков, а также переменную name из строки поиска. В результате LIKE (в сочетании со спецсимволом ) находит любое соответствующее имя в таблице базы данных. Можно описать весь процесс следующим образом: «Мы выбираем имя и фамилию из таблицы contacts , которые соответствуют введенным посетителем ». Сохраните файл search_query.php .

Пожалуйста, введите поисковый запрос

"; } } } ?>

Мы создаем переменную $result , и присваиваем ей значение функции mysql_query () , внося ее в $query. Теперь наш запрос хранится в переменной result . Чтобы вывести результат в PHP , мы создаем цикл, а затем выводим данные в неупорядоченном списке:

n"; echo "

  • " . "
  • n"; echo ""; } } else{ echo "

    Пожалуйста, введите поисковый запрос

    "; } } } ?>

    Сначала мы создаем цикл while , внутри него создаем переменную под названием row , и инициализируем ее возвращаемым значением функции mysql_fetch_array , которая принимает переменную result , в которой находится наш SQL-запрос . Внутри цикла while мы присваиваем каждому значению столбца значение переменной с идентичным названием. Затем мы выводим значения внутрь неупорядоченного списка.

    Здесь важно обратить внимание на два момента: (1) внутри цикла while не нужно присваивать значения переменным массива row , так как значения можно брать напрямую из массива row ; (2) тег anchor , который мы используем в названии нашего файла вместе с id и основным ключом. Причина этого заключается в том, что во многих поисковых элементах изначально ничего не отображается.

    Так как мы показываем только имя и фамилию, приписывая ID в конце нашего тега anchor , то мы можем использовать ID для дополнительного запроса, который позволит вывести дополнительную информацию о персонале. Сохраните файл и протестируйте форму PHP поиска по сайту (search_display.php ).

    Убираем табуляцию

    Результаты выводятся в виде неупорядоченного списка, но суть в том, что нам не нужна табуляция. Чтобы избавиться от нее, добавьте следующее CSS-правило в самое начало вашего файла в head :

    Поиск по буквам

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

    Добавьте следующую строку кода после закрывающего тега form :

    A | B | K

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

    }//Окончание скрипта поисковой формы if(isset($_GET["by"])){ $letter=$_GET["by"]; //Подключение к базе данных $db=mysql_connect ("servername", "username", "password") or die ("Я не могу подключиться к базе данных, так как: " . mysql_error()); //-Выберете базу данных $mydb=mysql_select_db("yourDatabase"); //-Запрос к таблице базы $sql="SELECT ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE "%" . $letter . "%" OR LastName LIKE "%" . $letter ."%""; //-Запустить запрос к функции MySQL Query $result=mysql_query($sql); //-Результаты подсчета $numrows=mysql_num_rows($result); echo "

    " .$numrows . " results found for " . $letter . "

    "; //-Запуск цикла и сортировка результатов while($row=mysql_fetch_array($result)){ $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $ID=$row["ID"]; //-Вывести результат в массиве echo "
      n"; echo "
    • " . "" .$FirstName . " " . $LastName . "
    • n"; echo "
    "; } }

    Здесь мы изменили четыре фрагмента кода скрипта поиска по сайту:

    • Мы используем функцию isset() , и вносим в нее массив $_GET , а затем проверяем значение by ;
    • Создаем переменную $letter и инициализируем ее значение массивом $_GET ;
    • Добавляем переменную letter в SQL-запрос ;
    • Указываем переменную letter внутри выражения, в котором получаем подсчитанное количество строк.

    Сохраните файл search_byletter.php и проверьте результат.

    Поиск определенного сотрудника

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

    }//Окончание скрипта if(isset($_GET["id"])){ $contactid=$_GET["id"]; //Подключение к базе данных $db=mysql_connect ("servername", "username", "password") or die ("Я не могу подключиться к базе данных, так как: " . mysql_error()); //-select the database to use $mydb=mysql_select_db("yourDatabase"); //- Запрос к таблице базы данных $sql="SELECT * FROM Contacts WHERE ID=" . $contactid; //- Запустить запрос к функции mysql_query() $result=mysql_query($sql); //- Запуск цикла и сортировка результатов while($row=mysql_fetch_array($result)){ $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $PhoneNumber=$row["PhoneNumber"]; $Email=$row["Email"]; //- Вывести результат в массиве echo "

    "; } }

    Здесь мы изменили четыре фрагмента кода:

    • Мы используем функцию isset() , и с ее помощью проверяем значение ID в массиве $_GET ;
    • Создаем переменную $contactid и инициализируем ее массивом $_GET ;
    • В таблице выделяем все, что отмечено звездочкой * . Звездочка – это сокращенное обозначение в SQL , которое означает «дайте мне все столбцы и строки из таблицы» . Чтобы определить, какую информацию выводить, мы упоминаем переменную contactid в конце SQL-выражения ;
    • Выводим дополнительную информацию о каждом представителе персонала.

    Сохраните файл search_byid.php и проверьте результат.

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

    SQL-инъекция

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

    "DROP TABLE

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

    В завершение

    В сегодняшней статье мы рассмотрели, как сделать поиск по сайту, а также:

    • Создавать базы данных и соответствующие таблицы;
    • Использовать инструменты для управления базами данных, создавать столбцы и вводить данные;
    • Разрабатывать формы поиска на основе PHP , которая умеет осуществлять проверку вводимых данных, наличия переменных в запросе, а также соединяться с базой данных и выводить результаты из таблицы;
    • Как защитить приложение и базу данных от SQL-инъекций .

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

    Данная публикация представляет собой перевод статьи «How to Create a Search Feature with PHP and MySQL » , подготовленной дружной командой проекта

    Хорошо Плохо

    Кандидаты - «Senior PHP», с опытом, до собеседования проходят первичный отбор по резюме\сопроводительному письму, то есть на собеседование попадают лишь те, кто выглядят как приличные программисты. Собеседования проводятся удалённо - Skype/ICQ (без голоса). Т.е. теоретически можно гуглить, хоть я и прошу этого не делать.

    Итак, тесты, которые отсетвают «типа программистов»:

    1. подсчитать количество хитов

    Задача: у меня есть banner.php, пусть он выводит статичное изображение, какой-то банер. Мы включаем его на страницу просто

    Мне нужно знать, сколько раз мы его показали. Прошу написать код.

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

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

    2. основы работы с unix shell + немного креативности

    Задача: у меня есть cleanup.php который что-то там делает критичное. Мне нужно, чтобы скрипт запускался каждые 13 секунд.

    Большинство предлагает повесить на крон, я прошу по шагам расписать, что мне сделать чтобы появилась cronjob (учтитывая что у меня SSH доступ). Потом выясняется, что у крона только поминутные задачи, и нужен какой-то «хак». Опять же, можно усложнять условия, если кандидат предлагает решение, чтобы понять, насколько глубоко и широко он в «теме». Большенство сливается говоря «я плохо шарю в linux-shell, у нас всё делали админы».

    3. немного баз данных - SQL (mysql)

    Задача: я хочу хранить свою билиотеку в БД. Меня волнуют названия книг и авторы - больше ничего хранить не надо. Предложите структуру таблиц.

    Половина кандидатов не знают что такое many-to-many и не могут решить что лучше - хранить author_id в таблице books или book_id в таблице authors.

    Если со структурой всё ок, я прошу вытащить список книг, которые написаны 3-мя со-авторами. То есть получить отчет «книга - количество соавторов» и отфильтровать те, у которых со-авторов меньше 3х.

    За 3 месяца, пока я даю этот тест, я могу вспомнить имена кандидатов, которые справились с этим на чистом SQL одним запросом.

    Итог

    Эти три задачи отсеивают 9 из 10 кандидатов. Иногда мне грустно, и меня терзают смутные сомнения - может быть я упускаю толковых программистов? Возможно, кандидаты волнуются и у них «вылетают из головы» простые вещи, но тогда что будет когда они попадут в команду - «завтра релиз а у нас конь не валялся»? Может быть стоит заранее настроить кандидатов, мол «будте готовы писать код на собеседовании»? Не будет ли хуже? Как Вы думаете, Вам мешало бы что-то пройти адекватно такое собеседование?

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

    Как же изъять эти данные, чтобы знать о своих посетителях больше? Я хочу рассмотреть решение этой проблемы на языках Perl и php. Для начала, рассмотрим их на Perl. Нетерпеливые php-шники, вам тоже будет полезно почитать эту часть статьи. Хотя, если вам нужно решение, и побыстрее, то переходите к вашей части.

    Получение данных о посетителе на Perl

    Итак, начнем. Сервер получил заголовки, которые пришли к нему, вместе с клиентским запросом. Куда же он их девает? Как получить к ним доступ? Все просто. Эти данные сервер хранит в своих переменных, которые называются "переменные окружения". В Perl, доступ к ним осуществляется через хэш %ENV, ключами которого являются имена заголовков, а значениями — переданные данные.

    Чтобы посмотреть все переменные окружения, достаточно выполнить простой идеоматический код:

    print "$_ = $ENV{$_}
    " foreach(keys %ENV);

    Какие из этих переменных будут нам полезны? В принципе, вы можете собирать хоть все. Но разумнее было бы собирать лишь то, что нужно. Предлагаю собирать это:

    $ip = $ENV{REMOTE_ADDR}; #IP-адрес вашего посетителя
    #адрес страницы, на которой посетитель щелкнул по ссылке, ведущей на ваш сайт
    #если он перешел на ваш сайт из закладок, или набрав адрес в адресной строке
    #значение этой переменной, будет пустым
    #если был переход с поисковой системы, эта переменная будет содержать поисковый запрос

    $referer = $ENV{HTTP_REFERER};
    $client = $ENV{HTTP_USER_AGENT}; #название браузера вашего посетителя.
    #адрес страницы, на которую пришел ваш посетитель
    #вы можете узнать на какие страницы вашего сайта приходят чаще
    $page = $ENV{REQUEST_URI};

    Вот так. Пользуйтесь)

    Получение данных о посетителе на PHP

    В php, дело обстоит похожим образом. Здесь тоже присутствует структура, хранящая данные о переменных окружения. Это ассоциативный массив $_SERVER.

    Получим те же данные, но средствами php.

    $ip = $_SERVER["REMOTE_ADDR"];
    $referer = $_SERVER["HTTP_REFERER"];
    $client = $_SERVER["HTTP_USER_AGENT"];
    $page = $_SERVER;

    Выведем все данные:

    foreach($_SERVER as $k=>$v) {print("$k = $v
    ")}

    Дополнительные заголовки. Прокси-серверы.

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

    HTTP_X_FORWARDED_FOR — ip-адрес пользователя, предоставляемый прокси-сервером
    HTTP_VIA — имя прокси-сервера
    REMOTE_ADDR — ip-адрес самого прокси-сервера

    Получить информацию о пользователе, по его IP. Служба WHOIS.

    Мы получили ip пользователя. И что с того? Эта информация нам ни о чем не говорит. Как же получить информацию о пользователе, если у нас есть его ip?

    Можно воспользоваться службой whois . Вводим ip-адрес и получаем кучку информации. Мы можем узнать город, в котором живет обладатель этого ip, адреса. Иногда, даже точный адрес и e-mail! Мы, почти наверняка, узнаем провайдера обладателя этого IP.

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

    Большой брат следит за тобой!

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

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

    Я могу оценивать, какие темы интересны людям, а какие — не очень. Скажем, регулярно заходят с гугла и яндекса. Значит, эта информация нужна людям. Проанализировав запросы, по которым заходят на эту статью, я понял, что не совсем удовлетворяю ожиданиям пользователей. Это заставило меня дописать несколько строк к статье, что придало ей законченности. Теперь пользователи уходят довольными.

    Используйте слежку за пользователем с умом! Пусть полученные данные ведут к улучшению ресурса. Доброй охоты!

    Если вам понравилась статья, можете подписаться на RSS этого блога и всегда быть в курсе обновлений. А еще, вы можете подписаться на рассылку новостей блога по почте.

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

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

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

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

    Функция, определяющая источник запроса (HTTP referer)

    Первым делом создаем новую функцию fromsearch (условный перевод — «из поиска»), название функции может быть любым, главное учтите и используйте в дальнейшем принятое название. Эта функция предназначена для определения источника перехода — будь то ПС, другой сайт и т.п. Нас интересует ПС. Итак, на WordPress в файл шаблона functions.php вставляем код:

    1 2 3 4 5 6 function fromsearch() { $ref = $_SERVER [ "HTTP_REFERER" ] ; $SE = array ("/search?" , "images.google." , "search." , "yandsearch" , "/search/" , ".yahoo." ) ; foreach ($SE as $source ) { if (strpos ($ref , $source ) !== false ) return true ; } return false ; }

    function fromsearch(){ $ref = $_SERVER["HTTP_REFERER"]; $SE = array("/search?", "images.google.", "search.", "yandsearch", "/search/", ".yahoo."); foreach ($SE as $source) { if (strpos($ref,$source)!==false) return true;} return false;}

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

    Вывода произвольного кода при переходах с поисковых систем

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

    1 2 3
    ПРОИЗВОЛЬНЫЙ КОД

    ПРОИЗВОЛЬНЫЙ КОД

    Например у меня полный код с подпиской выглядел так:

    Впервые на блоге? Подпишитесь на рассылку!

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

    Стили оформления блока, выводящего код для посетителей с ПС

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

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

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

    1 2 3 4 5 6 7 .showfromsearch { width : 900px ; border : 0 ; text-align : left ; margin : auto ; padding : 0 ; }

    Showfromsearch { width:900px; border:0; text-align:left; margin:auto; padding:0; }

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

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