Главная PHP Скрипты UCOZ Joomla jQuery CSS WordPress Урок 8.Снова здрасьте, или дописываем Гостевую книгу. - Форум Регистрация Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Урок 8.Снова здрасьте, или дописываем Гостевую книгу.
eXeSДата: Суббота, 07.11.2009, 14:27 | Сообщение # 1
Легенда
Группа: Администраторы
Сообщений: 273
Репутация: 120
Статус: Offline
Итак, мы сегодня продолжаем писать нашу гостевую книгу и пора вспомнить, на чем мы остановились. Мы написали три функции: по выводу формы, сохранению сообщения и отображению всех ранее написанных сообщений.

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

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

Code

function check_mess()
{
         global  $name, $email, $mess;

         $mess=trim($mess);
         $email=trim($email);
         $name=trim($name);

         $name = htmlspecialchars($name);
         $email = htmlspecialchars($email);
         $mess = htmlspecialchars($mess);

         $mess = str_replace("\n","<br>",$mess);

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

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

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

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

Code
function output_err($num)
{
         global $err;
         ?>
         <center><h1>Oшибка!</h1></center>
         <p><?=$err[$num];?>

         <?
         exit();
}

В файле config.php в массиве $err мы будем перечислять сообщения для вывода при соответствующей ошибке. Обратите внимание, что мы при помощи функции exit() прекращаем работу скрипта после вывода сообщения об ошибке.
Дописываем функцию check_mess():
Code
if (empty($name)) output_err(2);
         if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
         {
             output_err(1);
         }

         if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$name)) output_err(2);
}

И тут же, пока не забыли, пишем в файл config.php следующие строки:
$err[1] = "Неверно введен e-mail";
$err[2] = "Неверно введено имя";

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

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

Code
unction check_for_length()
{
         global $mess, $email, $name, $MessLength;

         if (strlen($mess)>$MessLength) output_err(3);
         $email=substr($email, 0, 21);
         $name=substr($name, 0, 22);
}

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

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

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

Code
function check_mess_for_flud()
{
        global $mess,$base;

        $file=file($base);
        $file=implode("",$file);
        $mess=preg_quote($mess);
        if (eregi($mess, $file)) output_err(4);
        $mess = stripslashes($mess);
}

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

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

Code
function del_mess_from_file()
{
        global $base, $MessInFile;

        $file = file($base);
        $k = 0;
        if($MessInFile<sizeof($file))
        {

            for($i=sizeof($file)-$MessInFile; $i<sizeof($file); $i++)
            {
               $ResFile[$k]=$file[$i];
               $k++;
            }
            $fp=fopen($base,"w");
            for($i=0; $i<sizeof($ResFile); $i++)
            {
             fputs($fp, $ResFile[$i]);
            }
            fclose($fp);
        }
}

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

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

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

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

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

Code
function check_mess()
{
        global  $name, $email, $mess;

        $mess=trim($mess);
        $email=trim($email);
        $name=trim($name);

        $name=htmlspecialchars($name);
        $email=htmlspecialchars($email);
        $mess=htmlspecialchars($mess);

        $mess = str_replace("\n","<br>",$mess);

        check_for_length();        //добавили

        if (empty($name)) output_err(2);
        if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) output_err(1);
        if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$name)) output_err(2);

        check_mess_for_flud();     //добавили
        del_mess_from_file();      //добавили
}

А теперь завершающий этап. После всех записей внизу файла guest.php пишем:
if ($mess) {
check_mess();
save_mess();
}
show_mess();
show_form();
?>
</BODY>
</HTML>

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

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

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

 
  • Страница 1 из 1
  • 1
Поиск:

Партнеры Инф. о пользователях сайта: Статистика сайта
Барселона-фк.Ру

  • EXES - Администратор
  • timyrkz - Администратор
  • kr1d - Проверенный(Бывший Адимнистратор)
  • Rambler's Top100

     Все права защищены. © 2026
    Хостинг от uCoz