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