Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:

Создание доски объявлений на PHP

Ткаченко В.Б.
При копировании статьи
ссылка на источник обязательна.

Одной из полезных функций, предоставляемых языком PHP, является возможность файлового ввода/вывода, что позволяет сохранять и отображать в последующем на сайте вносимые посетителями данные, что невозможно осуществить стандартными средствами HTML. Это позволяет использовать PHP для создания таких динамических структур как доски объявлений и WEB-форумы. Помимо поддержки операций стандартного ввода-вывода в текстовый файл PHP поддерживает так же SQL-запросы, для этой цели обычно используется СУБД MySQL (http://www.mysql.com), но описание взаимодействия PHP и SQL выходит за рамки этой статьи.

Чтобы проиллюстрировать возможности PHP, создадим простейшую доску объявлений для сайта. Работу нашей доски объявлений будет поддерживать следующие файлы:

Пользователям будет предоставлена возможность вводить в форму данные, которые в последующем будут отображаются на HTML-странице. Форма являются стандартным элементом HTML, и определяется с помощью следующей директивы:

   <form action = "действие" method = "метод">
    </form>

действие - определяет сценарий, который будет обрабатывать.

метод - определяет метод передачи данных этом сценарию. Существует только два метода:post - все данные формы передаются в теле запроса, и get - данные передаются в конце URL. Мы будем использовать метод post.

Внутри тэга формы находятся ее элементы - текстовые поля, текстовые области, кнопки подтверждения или сброса данных и т. п. Текстовые поля и кнопки определяются с помощью тэга INPUT, для текстового поля он имеет следующий формат:

   <input type = "text" name = "имя переменной" size = "число" maxlength = "число" value = "">
name - определяет имя переменной, в которую сохраняются введенные данные

size - длина текстового поля в браузере

maxlength - максимальное допустимое число вводимых в поле символов

value - значение отображаемое в текстовом поле по умолчанию.

Для кнопок подтверждения и отмены ввода данных тэг Input имеет следующий формат:
   <input type = "тип кнопки" value = "текст на кнопке">

тип кнопки - submit для кнопки подтверждения ввода формы и reset - для кнопки сброса данных формы Пример кнопок:

Для ввода многострочного текста используется текстовая область, которая определяется с помощью тэга Textarea:

   <textarea name="имя переменной" rows = "число" cols="число" value></textarea>

name - определяет имя переменной, в которую сохраняются веденные данные.

rows - количество строк в текстовой области.

cols - количество столбцов в текстовой области.

Пример текстовой области

Для ввода данных в нашу доску объявлений будем использовать три текстовых поля: имя и e-mail желающего разместить сообщение, а так же тема сообщения, одну текстовую область (текст сообщения) и две кнопки: подтверждения ввода данных и сброса. Ниже приведен исходный текст формы:

   <form action="submit.php" method="post">

    <input type="hidden" name="seeform" value="y">

    Ваше имя:<br>
    <input type="text" name="FIO" value="" size="30" maxlength="30"><br>
    Ваш e-mail:<br>
    <input type="text" name="email" value="" size="30" maxlength="30"><br>
    Предложение:>br>
    <input type="text" name="tema" value="" size="63" maxlength="63"><br>
    Описание:<br>
    <textarea cols="50" rows="10" name="zakaz"></textarea>
    <br><br>
    <input type="submit" value="Все верно!"> <input type="reset" value="Повторить">
    </form>>

Итак, пользователь ввел данные и нажал на кнопку подтверждения. Управление обработкой данных формы передано файлу submit.php. Рассмотрим его подробнее. Прежде всего, нам нужно убедиться, что пользователь ввел в форму корректные данные, а именно заполнил все требуемые поля и в графе "e-mail" включен символ "@":

   //Проверка на наличие не заполненных полей
    if ($FIO == ""):
        print "<h3> Поле "Ваше имя" не заполнено </h3>";
    else:

    if ($tema == ""):
        print "<h3> Поле "Тема" не заполнено </h3>";
    else:

    // Проверка на наличие символа "@" в e-mail
    $eml=stristr($email,"@");

    if ($eml == false):
        print "<h3>Введен некорректный e-mail адрес</h3>";
    else:

Если данные введены с соблюдением установленных нами правил запишем их в текстовый файл, соблюдая следующие условия:

  1. каждое сообщение занимает одну строку в текстовом файле и разделяются символом перехода на новую строку "/n",
  2. разделы сообщения разделены с помощью символа "|",
  3. введенные пользователем данные не должны содержать символы "<",">","%", что должно защитить нашу доску объявлений от взлома и спама.
//открыть файл на дополнение
    $fd = fopen("data.txt","a");

    // Проверка не ввел ли пользователь запрещенные символы "|","<",">","%" и "\n" внутри 
    //сообщения и их удаление.
    $FIO = str_replace("|","", $FIO);
    $FIO = str_replace("<","", $FIO);
    $FIO = str_replace(">","", $FIO);
    $FIO = str_replace("%","", $FIO);
    $email = str_replace("|","", $email);
    $email = str_replace("<","", $email);
    $email = str_replace(">","", $email);
    $email = str_replace("%","", $email);
    $tema = str_replace("|","", $tema);
    $tema = str_replace("<","", $tema);
    $tema = str_replace(">","", $tema);
    $tema = str_replace("%","", $tema);
    $zakaz = str_replace("|","", $zakaz);
    $zakaz = str_replace("<","", $zakaz);
    $zakaz = str_replace(">","", $zakaz);
    $zakaz = str_replace("%","", $zakaz);
    $zakaz = str_replace("\n"," ", $zakaz);

    // формирование строки для записи в файл
    $user_row = $FIO. "|".$email."|".$tema."|".$zakaz."\n";

    //запись строки в файл
    fwrite($fd, $user_row);

    // закрытие файла
    fclose($fd);

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

//отображение правильно введенных данных
       <h3><?php print $FIO;?></h3>

        <h3><a href="mailto:<?php print $email;?>"><?php print $email;?></a></h3>

        <p class="courier"><?php print $tema;?></p>

        <p><?php print $zakaz;?></p>

        <h3 align="center"><a href="<?php print board.php; ?>">Закрыть</a></h3>

        end_input1($write_file1);

    endif;
    endif;
    endif;

В файле board.php перед формой внесем операцию извлечения данных из файла data.txt и их отображения в читаемом виде:

   // читаем все сообщения из файла в массив, где каждый элемент массива - одна
    // строка
    $work_file = file("data.txt");

    // начинаем обработку данных, если файл не пуст.
    if ($work_file != ""):

    //вычисление количества строк
        $numbers = count($work_file);

        if ($numbers != "0"):

            // последовательно обрабатываем все строки и выводим их на экран
            for ($numbers; $numbers > 0 ;$numbers -= 1):

                $work_str = array_shift($work_file);

                $FIO = strtok ($work_str,"|");

                $email = strtok ("|");

                $tema = strtok ("|");

                $zakaz = strtok ("|");

                <h3><?php print $FIO;?></h3>

                <h3><a href="mailto:<?php print $email;?>"><?php print $email;?></a></h3>

                <p class="courier"><?php print $tema;?></p>

                <p><?php print $zakaz;?></p>

                <hr>

            endfor;

        endif;

    endif;

На рисунках ниже приведен вид страниц board.php и submit.php после ввода данных.

Посетители конечно могут вводить любые сообщения в доску объявлений, но это конечно не значит, что все из них будут нас устраивать. Мы конечно можем просто удалять не желательные строки из файла data.txt напрямую, зайдя на сервер через FTP, но это естественно не удобно. Лучше сделать это с помощью специальной HTML-страницы для администрирования. Рассмотрим как это сделать подробнее.

Прежде всего определим, что пароль для администрирования хранится в отдельном файле с именем password.txt. Извлечем пароль из этого файла:

   $pass_file = file("password.txt");
    $password = array_shift($pass_file);
На рисунке изображена форма для ввода пароля:

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

   $form = "
    <form action =\"admin.php\"  method =\"post\" >
    <input type = \"hidden\" name = seeform value = \"y\">
    Введите пароль адимнистратора<br>
    <input type = text name = entpass>
    <br><br>
    <input type=\"submit\" name = submit value=\"Все верно!\"><input type=\"reset\" value=\"Повторить\">
    </form>
    ";
Список сообщений отображается только при условии, если пароль введен верно:
   if ($password == $entpass):

    //Прочитать файл с сообщениями
    $work_file = file("data.txt");

    //Если файл не пустой, то отобразить сообщения
        if ($work_file != ""):

            $numbers = count($work_file);

                if ($numbers != 0):

                    for ($numbers; $numbers > 0 ;$numbers -= 1):

                        $work_str = array_shift($work_file);

                        $FIO = strtok ($work_str,"|");

                        $email = strtok ("|");

                        $tema = strtok ("|");

                        $zakaz = strtok ("|");
                        
                        ?>

    <h3><?php print $FIO;?></h3>

    <h3><a href=\"<?php print $email;?>\"><?php print $email;?></a></h3>

    <p class=\"courier\"><?php print $tema;?></p>

    <p><?php print $zakaz;?></p>

Вывод сообщений аналогичен используемому в board.php с одним отличием - после каждого сообщения выводится форма с кнопкой Submit. Нажатие на эту кнопку влечет за собой сохранение в переменной del_msg номера страницы, которую мы желаем удалить.

         <form action="admin.php" method="post">
            <input type = "hidden" name = del_msg value = "<?php print $numbers?>">
            <input type="submit" value="Удалить">
            </form>

            <hr>

            <?php

        endfor;

        print "<h3 align=\"center\"><a href=\"board.php\">Назад</a></h3>";
    endif;

    endif;

    else:

    // Здесь выводится ссылка на стартовую страницу конференции, что позволит 
    // выйти из режима удаления записей не выполнив удаления.
    print "<h3 align=\"center\"><a href=\"board.php\">Назад</a></h3>";

    endif;

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

   $work_file = file("data.txt");

    $numbers = count($work_file);

    $fd = fopen("data.txt","w");

        for ($numbers; $numbers > 0 ;$numbers -= 1):

            $work_str = array_shift($work_file);

                if ($del_msg != $numbers ):

                    fwrite($fd, $work_str);

                else:

                    print "<h3>Выбраное сообщение удалено!</h3>";
                endif;
        endfor;

        fclose($fd);

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

Присутствие файла с паролем в каталоге доски объявлений вынуждает нас организовать защиту от его просмотра посетителями напрямую через http. Для этого в каталоге доски объявлений разместим файл, содержащий директивы для Apache, которые бы запрещали прямой просмотр файлов с расширением .txt . Файл будет называться .htacces и будет содержать следующие директивы:

   <Files *.txt>
    order allow,deny
    deny from all
    </Files>

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



Copyright © Сайт поддержки пользователей САПР by Victor Tkachenko