Рейтинг@Mail.ru
 





Шаг 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 выходит из положения так, что требует для символа использовать другое написание (специальные коды)
<      =>      &lt;
>      =>      &gt;
&     =>      &amp;
"      =>      &quot;
и тогда всё будет как и хотел автор текстового наполнения страницы. Делает это функция 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>)не предусматривают переносов.

Ну, вот и весь принцип в двух словах.