AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.







Шаг 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>. Вот мы и получили оба текста ошибки сразу.

Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009