Рейтинг@Mail.ru
 





Шаг 4

Сброс POST параметров

Если Вы сейчас еще раз нажмёте кнопку, или обновите страничку (кнопка F5), сообщение запишется еще раз. Это очень любят делать разного рода хулиганы и флудеры.

Что бы надавать флудерам по рукам, нужно сбросить пост данные в случае удачной записи. Делается это формированием новой страницы. А для этого используется перенаправление С помощью заголовков, которые формирует функция header()
Отправим браузеру заголовок: мол давай ка перейдем на другую страницу.
А раз там в адресе $_SERVER['PHP_SELF'] - это адрес Вашего файла со скриптом, то откроется то же самое, но данные из формы исчезнут. И теперь хоть заобновляйся - все будет шоколадно.

Вспомните, нельзя отправлять заголовок раньше вывода, по этому меняем структуру.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php



/**  
* The guest book 
* Гостевая книга  
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
///////////////////////////////////////////////////////// 
/**  
* We establish the charset and level of errors  
* Устанавливаем кодировку и уровень ошибок  
*/  
    
header("Content-Type: text/html; charset=utf-8");  
    
error_reporting(E_ALL); 

///////////////////////////////////////////////////////////////// 
//                        VARIABLES 
//                        ПЕРЕМЕННЫЕ 
///////////////////////////////////////////////////////////////// 
         
    
$text1 = !empty($_POST['text1']) ? $_POST['text1'] : null;   
    
$text2 = !empty($_POST['text2']) ? $_POST['text2'] : null;  
         
///////////////////////////////////////////////////////////////// 
//                        SCRIPT 
//                        СКРИПТ 
/////////////////////////////////////////////////////////////////

    
if(isset($_POST['ok']))  
    {  
        if(!
$text1)   
            echo 
'Текстовое поле не заполнено.';   
        elseif(!
$text2)   
            echo 
'Текстовая область не заполнена.';       
        else  
        {   
         
// пишем файл
            
file_put_contents('text.txt'$text2FILE_APPEND); 
         
// и перенаправляем браузер на новую страницу 
            
header('location: http://'$_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
         
// Останавливаем скрипт (все равно браузер уже ушел)      
            
exit(); 
        }  
    }  
    else   
        echo 
'Напишите что-нибудь';  
  
///////////////////////////////////////////////////////////////// 
//                        VIEW 
//                    ОТОБРАЖЕНИЕ 
/////////////////////////////////////////////////////////////////
?>  
<form action="?" method="post">  
Логин:<br />  
<input name="text1" type="text"  value="<?php echo htmlspecialchars($text1?>"/><br />  
Сообщение:<br />  
<textarea name="text2" cols="40" rows="10"><?php echo htmlspecialchars($text2);?></textarea><br />  
<input name="ok" type="submit" />  
</form>  
<?php  

    
if(file_exists('text.txt'))  
        echo 
nl2br(htmlspecialchars(file_get_contents('text.txt')));  

  

Так как мы изменили структуру, то вывод ошибок теперь выше формы, что не всегда интересно. Особенно когда необходимо разделить логику и вывод. По этому делаем так (а за одно выведем сразу оба сообщения об ошибках):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php


/**  
* The guest book 
* Гостевая книга  
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
///////////////////////////////////////////////////////// 
/**  
* We establish the charset and level of errors  
* Устанавливаем кодировку и уровень ошибок  
*/  
    
header("Content-Type: text/html; charset=utf-8");  
    
error_reporting(E_ALL);

///////////////////////////////////////////////////////////////// 
//                        VARIABLES 
//                        ПЕРЕМЕННЫЕ 
///////////////////////////////////////////////////////////////// 
         
    
$text1 = !empty($_POST['text1']) ? $_POST['text1'] : null;   
    
$text2 = !empty($_POST['text2']) ? $_POST['text2'] : null;  
    
$info  = array();  
         
///////////////////////////////////////////////////////////////// 
//                        SCRIPT 
//                        СКРИПТ 
/////////////////////////////////////////////////////////////////

    
if(isset($_POST['ok']))  
    {
          
// Собираем ошибки в массив (если они есть) 
        
if(!$text1)   
            
$info[] = 'Текстовое поле не заполнено.'
               
        if(!
$text2)   
            
$info[] = 'Текстовая область не заполнена.';  
         
// Если массив ошибок пуст,          
        
if(count($info) == 0)
        {
         
// пишем файл
            
file_put_contents('text.txt'$text2FILE_APPEND); 
         
// и перенаправляем браузер на новую страницу 
            
header('location: http://'$_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
         
// Останавливаем скрипт (все равно браузер уже ушел)      
            
exit(); 
        }  
    }  
    else   
        
$info[] = 'Напишите что-нибудь';
  
///////////////////////////////////////////////////////////////// 
//                        VIEW 
//                    ОТОБРАЖЕНИЕ 
/////////////////////////////////////////////////////////////////
?>  
<form action="?" method="post">  
Логин:<br />  
<input name="text1" type="text"  value="<?php echo htmlspecialchars($text1?>"/><br />  
Сообщение:<br />  
<textarea name="text2" cols="40" rows="10"><?php echo htmlspecialchars($text2);?></textarea><br />  
<input name="ok" type="submit" />  
</form>  
<?php  
   
// Выводим служебную информацию, "склеивая" элементы массива через разделитель <br/>
    
echo implode('<br>'$info) .'<br>';

    if(
file_exists('text.txt'))  
        echo 
nl2br(htmlspecialchars(file_get_contents('text.txt')));  

 


Теперь у нас вся логика приема данных вверху, а вывод внизу.

Но как же так мы записали разные значения в одну переменную? Если Вы еще не знакомы с массивами - милости просим.

Функция implode() складывает элементы массива в одну строку через разделитель. Им у нас по совместительству тег переноса строки <br>. Вот мы и получили оба текста ошибки сразу.