Шаг 2
Форма
Для того чтобы отправить информацию с Вашего компьютера на сервер, необходимо её как-то упаковать. Делается это формой, есть такая штука. Выглядит так:
1
2
|
<form action="?" method="post"></form>
|
Всё, что находится между этими тегами, будет упаковано и отправлено на сервер. Не теги имеется в виду, а данные, которые юзер введет в поля в этой форме. Делаем следующее:
1
2
3
4
5
| <form action="?" method="post">
<input name="text" type="text" /><br />
<input name="ok" type="submit" />
</form>
|
Обратите внимание на:
1. action - это адрес скрипта, на который будут отправлены данные
2. method - метод передачи. Есть два метода - GET и POST. При первом методе всё, что будет написано в поле, прилепится к адресу в адресной строке, при втором методе будут данные будут переданы в теле запроса. Предпочтительнее второй метод, так как при первом имеется ограничение по количеству передаваемых символов в силу того, что есть ограничение на размер URL. Но иногда, особенно в поисковиках, GET удобнее, так как можно скопировать ссылку на результат поиска. Яндекс, Гугл и иже с ними всегда пользуются этим методом.
3. name - это имя элемента формы, в данном случае текстового поля. Чтобы на сервере можно было определить, какой элемент формы
поставил (передал) данные..
4. У кнопки тоже есть имя, для того, что бы знать, какая именно кнопка была нажата.
5. Тип кнопки - submit говорит о том, что при её нажатии данные всех вовлеченных элементов формы с этим
submit будут отправлены на сервер.
Всё, как говорится "клиент дошел до нужной кондиции". Теперь пишем обработчик, то есть собственно серверную программу, которая будет принимать и обрабатывать полученные данные.
Небольшая хитрость - форму и обработчик желательно помещать в один файл, это поможет вернуть данные, если форма заполнена неверно. Если в action формы не писать ничего, запрос отправится на этот же файл.
Но - всё по порядку.
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
|
<?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);
?> <form action="" method="post"> <input name="text" type="text" /><br /> <input name="ok" type="submit" /> </form> <?php
$text = !empty($_POST['text'])?$_POST['text']:null;
echo $text;
|
Готово.
Вот теперь в это поле можете написать Hello, World! и нажать кнопку.
Что произошло.
1. Браузер отправил запрос из адресной строки на сервер.
2. Сервер сформировал вывод и отправил обратно ответ.
4. Браузер получил ответ и "нарисовал" форму.
5. Вы ввели в эту форму данные и отправили на сервер.
6. Сервер получил эти данные, на основании их сформировал новую страницу и отправил обратно.
7. Браузер получил новый документ, отрисовал по нему новую страницу, на
которой среди прочего вывел результат обработки.
Теперь вопрос - для чего такая конструкция?
1
2
3
|
$text = !empty($_POST['text']) ? $_POST['text'] : null;
|
А вот попробуйте написать просто
1
2
3
|
echo $_POST['text'];
|
и тут же получите нотайс - предупреждение об ошибке. Потому что переменную, прежде чем к ней обращаться, нужно определить. Инициализировать. То есть задать первоначальное значение, пусть даже NULL, то есть пустоту. А сама эта веревка с вопросиком и двоеточием -
тернарный оператор.
А теперь тонкости. Наберите в поле вот это:
<Hello, World!>
И нажмите кнопку. Видно что-нибудь? Не видно. Но не потому, что нету, можете посмотреть исходный код страницы. Просто это интерпретируется как тег и не выводится в монитор.
Вот мы там в заголовке написали мол
Content-Type: text/html Это что значит?
Что данные, которые формирует сервер это не просто текст, а текст на
языке
hypertext markup language - разметки гипертекста.
А наш оператор
echo умеет только тупые примитивные символы плоского
текста отправлять. А язык разметки устроен так, что некоторый набор символов
в нем служит для специальных целей - для собственно разметки.
Это как минимум
< > & "
Но любой уважающий себя язык просто обязан уметь передавать документы
в том числе и с применением таких символов в самом тексте.
HTML выходит из положения так, что требует
для символа использовать другое написание (специальные коды)
< =>
<
> =>
>
& =>
&
" =>
"
и тогда всё будет как и хотел автор текстового наполнения страницы. Делает это функция
htmlspecialchars().
Сделайте теперь так:
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
|
<?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);
?> <form action="" method="post"> <input name="text" type="text" /><br /> <input name="ok" type="submit" /> </form> <?php
$text = !empty($_POST['text']) ? $_POST['text'] : null; // Заменяем сущности на эквиваленты echo htmlspecialchars($text);
|
и почувствуйте разницу. Так вот, всё, что выводится в браузер и представляет из себя
plain text, и что требуется изобразить в
языке
hypertext, нужно обрабатывать этой функцией.
Теперь усложним задачу. При отправке данных запись в поле исчезает. А что, если что-то не так? Бедный юзер должен всё заново переписывать? Будем вежливы и вернем ему форму с данными. Для этого немного изменим ход событий. Сначала примем переменную, потом выведем форму.
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
|
<?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);
// Переносим инициализацию выше формы и вернем значение в инпут $text = !empty($_POST['text']) ? $_POST['text'] : null; ?> <form action="" method="post"> <input name="text" type="text" value="<?php echo htmlspecialchars($text) ?>"/><br /> <input name="ok" type="submit" /> </form> <?php // Заменяем сущности на эквиваленты echo htmlspecialchars($text);
|
Обратите внимание, что в параметре value="" должны быть именно кавычки, а не апострофы, иначе апостроф в тексте порвет тег, так как он не является штатным символом разметки.
При вводе имени O'Reilly случится примерно следующее:
1
2
|
<input name="test" type="text" value='O'Reilly' />
|
то есть часть имени (Reilly) выйдет в тело тега. Это грозит, как минимум, искажением данных, как худший вариант - XSS атакой.
Вот так верно:
1
2
|
<input name="test" type="text" value="O'Reilly" />
|
Теперь усложним еще больше. Не просто выведем данные, а изменим содержание страницы в зависимости от.
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
|
<?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);
$text = !empty($_POST['text']) ? $_POST['text'] : null; ?> <form action="" method="post"> <input name="text" type="text" value="<?php echo htmlspecialchars($text) ?>"/><br /> <input name="ok" type="submit" /> </form> <?php // Проверим нажата ли кнопка if(!empty($_POST['ok'])) echo htmlspecialchars($text); else echo 'Напишите что-нибудь';
|
То есть:
Если переменная ok не пуста (нажата кнопка), выводим текст сообщения. Если нет, то дефолтную (по умолчанию) надпись.
Это и есть оператор
if... else, основа логической составляющей программы. Еще больше усложним:
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
|
<?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);
$text = !empty($_POST['text']) ? $_POST['text'] : null; ?> <form action="" method="post"> <input name="text" type="text" value="<?php echo htmlspecialchars($text) ?>"/><br /> <input name="ok" type="submit" /> </form> <?php // Проверим нажата ли кнопка и заполнено ли поле if(!empty($_POST['ok']) && !$text) echo 'Поле не заполнено.'; elseif(!empty($_POST['ok'])) echo htmlspecialchars($text); else echo 'Напишите что-нибудь';
|
Это уже основы валидации - проверки правильности заполнения полей формы.
Обратите внимание на логику.
Если есть переменная
ok и переменная
$text пуста
(функция
empty() и знак инверсии
!), выводим сообщение об ошибке,
еще -
если нажата кнопка, выводим текст,
еще - выводим дефолтную надпись. Выполняться программа будет до первого соответствия, то есть если удовлетворяется первое условие (
!empty($_POST['ok']) && !$text), то второе и третье выполняться не будут.
Теперь попробуем текст побольше:
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
|
<?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);
$text1 = !empty($_POST['text1']) ? $_POST['text1'] : null; $text2 = !empty($_POST['text2']) ? $_POST['text2'] : null; ?> <form action="" method="post"> <input name="text1" type="text" value="<?php echo htmlspecialchars($text1) ?>"/><br /> <textarea name="text2" cols="40" rows="10"><?php echo htmlspecialchars($text2); ?></textarea><br /> <input name="ok" type="submit" /> </form> <?php // Более сложная проверка if(!empty($_POST['ok'])) { if(!$text1) echo 'Текстовое поле не заполнено.'; elseif(!$text2) echo 'Текстовая область не заполнена.'; else echo htmlspecialchars($text1), '<br>', htmlspecialchars($text2); } else { echo 'Напишите что-нибудь'; }
|
Тут, как видите, появились блоки. Сначала проверяем, нажата ли кнопка. Потом, если нажата, проверяем заполнение. А если не нажата, сразу выводим дефолтную надпись, игнорируя проверки в первом блоке.
Теперь нюансы. Наберите в текстарее текст с переносами, используя enter. Видите, на выводе текст оказался без переносов. Это потому что язык опять же
hypertext markup language.
А он считает любые пустые символы (перенос строки в том числе) за один пробел.
А для переноса строки применяет тег
<br />. Заменить переносы на этот тег поможет функция
nl2br()
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
|
<?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);
$text1 = !empty($_POST['text1']) ? $_POST['text1'] : null; $text2 = !empty($_POST['text2']) ? $_POST['text2'] : null; ?> <form action="" method="post"> <input name="text1" type="text" value="<?php echo htmlspecialchars($text1) ?>"/><br /> <textarea name="text2" cols="40" rows="10"><?php echo htmlspecialchars($text2); ?></textarea><br /> <input name="ok" type="submit" /> </form> <?php
if(!empty($_POST['ok'])) { if(!$text1) echo 'Текстовое поле не заполнено.'; elseif(!$text2) echo 'Текстовая область не заполнена.'; else // Заменяем сущности на эквиваленты и во втором тексте переносы на тег <br /> echo htmlspecialchars($text1), '<br>', nl2br(htmlspecialchars($text2)); } else { echo 'Напишите что-нибудь'; }
|
Именно в таком порядке
1
2
3
|
nl2br(htmlspecialchars($text2));
|
не наоборот.
Почему?
Потому что иначе добавленные функцией
nl2br() символы
<br /> гипертекстовой
разметки
будут восприняты функцией
htmlspecialchars() как
plain text и
преобразованы в
строку <br /> а ведь нам же не надо рисовать
теги?
И использовать её имеет смысл только в текстовых областях (
<textarea>), так как текстовые поля (
<input>)не предусматривают переносов.
Ну, вот и весь принцип в двух словах.