Главная
домен в подарок! подробнее

каталог сайтов www.poiu.ru закрыт. копия сайта www.myphp.net.ru сделана мной без согласия автора, подробнее тут


Уроки PHP.

Снова здрасьте, или дописываем Гостевую книгу.

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

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

Так что продолжаем.

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

Значит, открываем файл guest.php и пишем:

Это еще не конец функции.

Здесь мы "отрезали" с помощью функции trim() все пустые символы (пробелы, переводы строк, символы табуляции) в начале и в конце строк. Далее мы заменили с помощью функции str_replace все символы перевода строки на тег <br>. Это облегчит нам задачу сохранения форматированных строк и их дальнейшего вывода.

Далее в функции следует очень важный элемент - первое, с чего следует начать строить защиту программы - функция htmlspecialchars(), которая обрабатывает все специальные символы HTML, то есть символ < переходит в &lt;  и так далее. Никогда не забывайте об этом элементе!

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

В файле config.php в массиве $err мы будем перечислять сообщения для вывода при соответствующей ошибке. Обратите внимание, что мы при помощи функции exit() прекращаем работу скрипта после вывода сообщения об ошибке.

Дописываем функцию check_mess():

И тут же, пока не забыли, пишем в файл config.php следующие строки:

$err[1] = "Неверно введен e-mail";
$err[2] = "Неверно введено имя";

Как видите, в предыдущей функции мы активно работали с регулярными выражениями. Сначала мы проверяли, чтобы e-mail был вида something@server.com, а затем проверке подвергнулось и имя: оно должно содержать только буквы латинского и русского алфавита и знак подчеркивания (_). При несоблюдении этих условий задействуется функция output_err() с аргументом, представляющим собой индекс массива $err для соответствующей ошибки.

Далее нам необходимо проверить данные на соответствие допустимой длине. Так что пишем новую функцию check_for_length():

Здесь мы сначала сверяем длину сообщения с указанной в переменной $MessLength с помощью функции strlen(), которая возвращает количество символов в строке, и используем функцию output_err() в случае превышения длины сообщения над лимитом. Не забудьте в файле config.php написать следующие строки:

$MessLength = 1000;
$err[3] = "Недопустимая длина сообщения";

Далее мы "обрубаем" строку с помощью функции substr(), оставляя в переменной $email первые 21 символов, а в $name - 22. Вообще-то в нормальных условиях длина этих двух строк не может превышать эти числа, так как мы еще в форме для ввода сообщения указали этот лимит, но все-таки стоит перестраховаться.

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

Эта функция основана на работе с регулярными выражениями. Сначала мы получаем массив строк файла-базы с помощью функции file(), затем объединяем весь массив в одну переменную. Далее мы "квотируем" сообщение пользователя (см. функцию preg_quote в соответствующем разделе) и смотрим, встречается ли этот текст в базе или нет. Если встречался, выводим ошибку. Следующая строка возвращает текст в переменной $mess в первоначальное состояние, то есть убирает все обратные слеши \ перед специльными символами, которые были добавлены функцией preg_quote. В файле config.php напишите:

$err[4] = "Такое сообщение уже существует";

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

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

Сразу добавим строку в файл config.php:

$MessInFile = 20;

Это то количество сообщений, которые следует хранить в файле. Если вы не желаете иметь "архив" сообщений, установите здесь то же число, что и в переменной $MessInFile.

Теперь разберем функцию.

Сначала мы присваиваем переменной $file массив из строк файла базы. После мы ставим условие, что все дальнейшие действия функции будут выполняться только если количество сообщений в файле больше числа, указанного в $MessInFile. Далее запускаем цикл, который выполнится столько раз, сколько указано в той же переменной $MessInFile. Затем мы формируем массив $ResFile из последних 20 (так указано в $MessInFile) элементов массива $file. После этого мы переписываем файл-базу сохраняя там полученный массив $ResFile. Тем самым после выполнения функции мы отсеем старые сообщения, оставив 20 последних в том же порядке, что и до вызова функции.

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

Все дополнительные функции проверки у нас будут вызываться главной функцией проверки check_mess(). Теперь она должна выглядеть так:

А теперь завершающий этап. После всех записей внизу файла guest.php пишем:

if ($mess) {
  check_mess();
  save_mess();
}
show_mess();
show_form();
?>
</BODY>
</HTML>

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

Все, гостевая книга готова к использованию. Сделайте для нее дизайн по вашему вкусу и все. Пользуйтесь.

Готовые файлы guest.php и config.php вы можете скачать здесь.

Назад, на урок 7

Дальше, на урок 9