Снова здрасьте, или дописываем Гостевую книгу.
Итак, мы сегодня продолжаем писать нашу гостевую книгу и пора вспомнить, на
чем мы остановились. Мы написали три функции: по выводу формы, сохранению
сообщения и отображению всех ранее написанных сообщений.
Казалось бы, на этом можно и остановиться. В общем-то этого достаточно для
самой примитивной гостевой книги. Но зачем нам такая нужна? Мы же не хотим,
чтобы наше любимое детище взламывал каждый "типа хакер". В конце концов, нам
нужна удобная функциональная "гостевая".
Так что продолжаем.
А продолжим мы с очень важной функции проверки введенных данных. У нас будет
даже не одна функция проверки, а больше.
Значит, открываем файл guest.php и пишем:
Это еще не конец функции.
Здесь мы "отрезали" с помощью функции trim() все пустые символы (пробелы,
переводы строк, символы табуляции) в начале и в конце строк. Далее мы заменили с
помощью функции str_replace
все символы перевода строки на тег <br>. Это облегчит нам задачу
сохранения форматированных строк и их дальнейшего вывода.
Далее в функции следует очень важный элемент - первое, с чего следует начать
строить защиту программы - функция htmlspecialchars(), которая
обрабатывает все специальные символы HTML, то есть символ < переходит
в < и так далее. Никогда не забывайте об этом элементе!
Мне вот подумалось: мы выполняем проверку данных, а ведь в случае
неверности данных нам требуется выдать сообщение о соответствующей ошибке. Так
давайте это тоже оформим в виде функции. Не закрывая предыдущей функции, ниже
пишем новую, которая будет отвечать за вывод ошибки:
В файле 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.
Теперь разберем функцию.
Сначала мы присваиваем переменной $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 вы можете скачать здесь.
|