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

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

             
Веб-курсы


Что это?

Оглавление

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

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

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

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

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

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



Реклама

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







Шаг 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>)не предусматривают переносов.

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

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