Кандидаты - «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 кандидатов. Иногда мне грустно, и меня терзают смутные сомнения - может быть я упускаю толковых программистов? Возможно, кандидаты волнуются и у них «вылетают из головы» простые вещи, но тогда что будет когда они попадут в команду - «завтра релиз а у нас конь не валялся»? Может быть стоит заранее настроить кандидатов, мол «будте готовы писать код на собеседовании»? Не будет ли хуже? Как Вы думаете, Вам мешало бы что-то пройти адекватно такое собеседование?
Статистические сведения о посетителях сайта приносят не мало пользы. По статистике можно подогнать дизайн сайта в соответствии с разрешением большинства посетителей, подогнать дизайн к браузеру, на котором приходят большая часть посетителей да и просто интересно, кто заглядывает к вам на сайт, из под какой 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. Я приведу текст всего скрипта и дополню это обильными комментариями:
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 "
<
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 |
Назад |
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 ), в который заключен текст.
Вот таким образом выводится любой код для переходов с поиска , наверное повторюсь — используя данный метод можно показывать или другие, в то время как постоянные читатели, приходящие с закладок, прямыми заходами или по ссылкам на других сайтах не увидят данное содержание.
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 |
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 | 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 поиск по сайту после закрывающего тега :