Передача данных из формы для самых маленьких :)
Запоминаем! В стандарте мы имеем 2 метода передачи информации от одной страницы к другой (для последующей обработки). Итак!
№1 – POST
№2 – GET
В чем отличия? А вот в чем! Первый метод (POST) – невидим(запоминаем это – хотя это не так важно, но знать нужно)!!!! Второй метод (GET) – видимый.
На примере ссылок сейчас вам и продемонстрирую! Итак есть форма (самая простая и элементарная – отправка имени и пароля, для авторизации пользователя на сайте).
<form action="" method="post">
Имя::<input type="text" name="user_name" />
Пароль::<input type="password" name="user_pass" />
<input type="submit" name="submit" value="Отправить" />
</form>
Что есть в этой форме? Как мы видим любая форма начинается с открытия тега <form>. Что можем прописать в этом теге? Да в принципе только несколько параметров. А именно – action – в этом теге прописывается ссылка, на страницу в кот. передается форма, если обработчик формы находится на странице с самой формой, то поле action оставляем пустым. Далее! Тег method. Собственно вокруг него весь сыр-бор и происходит. Тег method определяет как именно будет обрабатываться форма. Или POST или GET. Итак. Выбираем для начала POST. Выбрали? Отлично! Поехали дальше. Дальше нам нужны поля… Ну, надо же куда-то писать текст. Итак. Поля. Поля обозначаются тегом <input />. Заметили вот такой значок (/) в конце тега перед закрытием его. Это слеш! А нужен он для того, что бы все было правильно по W3C(что это посмотрите в интернете). А еще он нужен, так же и для вот чего.
Лирическое отступление :) . Есть вот такая структура
<a href="google.ru">Это Google. He is searching GOD!!!</a>
Тег </a> закрывает тег <a>. Его роль не велика. Но есть и другой вид тегов. Например тег переноса строки, а именно <br />. Его некому закрыть :) поэтому он закрывает сам себя :D именно слешем (/). Таких тегов не много на самом деле, так, если с ходу назвать, то я вспомню ну пожалуй 3 – 4. Не больше! Их конечно больше, но сразу чего-то не вспоминаются. Итак вот они: <input />, <br />, <hr />, <img src= "" />. Их надо просто запомнить, и все. И лучше закрывать, так красившее и просто, правильнее.
Продолжаем, <input />. Input переводится как «вставить», но не то, что вы делаете, со своей девушкой, нет, даже не думайте так, а вставить текст (мы же о нем сейчас говорим). Итак вставить, т.е. input. В нем так же есть параметры (а куда без них). На данном этапе нам нужно их только несколько. А именyо. Type(тип), name(имя). Что такое type. Пишется вот так. Сначала естественно <input type="text" />. Т.е. type(тип) данных, что мы передаем – текст.
Лирическое отступление :).
Тип (type) может быть разный. Например – password – то есть пароль. Где то, что мы вводим, отображается звездочками (*). Так может быть file – это для закачки файла. (К сведению, если мы закачиваем через форму файл (картинку к примеру), то в теге <form> появляется дополнительный параметр – enctype="multipart/form-data" (никак не запоминается :( ) и тогда тег формы нашей выглядит вот так <form action="" method="post" enctype="multipart/form-data">). Еще type может принимать значение hidden – то есть – скрытый, так же иногда необходим, как страховка, или например можно в него положить текущую дату и время, пользователю не надо это видеть, а нам надо это в БД положить. Ну, это как пример, там, по правде говоря, много для чего он применяется.
Еще есть type="submit" – это для кнопки, в вольном переводе – «отправить» или подтвердить.
Итак, поехали дальше, а то лирики много получилось. Пока что мы имеем, вот что
<form action="" method="post">
Имя::<input type="text" />
</form>
Это естественно не все :). В input нам надо имя указать, а то обработчик ничего не поймет :). Имя, или name – указывается для того, что бы обработчик понял, что переданные в него данные, равны строго этому полю, а не Васи, или Диме, или, не дай бог, сессии, с ней вообще запутаться все, что угодно может. Так вот. Name. Ну тогда так и напишем. name="user_name" – то есть, все что уйдет из этого поля, весь текст, все закарючки, что пользователь введет, будут равны – user_name. Ах, да, наверно, не правильно я выразился, скорее не равны, а то вы подумаете, что если я введу, в поле user_name, например такой текст "Полетели на Марс, там яблоки с виноградом поспели", то это выражение будет выглядеть вот так. user_name = "Полетели на Марс, там яблоки с виноградом поспели".
Нет! Нет, и еще раз, НЕТ! Если я говорю равно, то имею ввиду, следующее, user_name => "Полетели на Марс, там яблоки с виноградом поспели". То есть, "Полетели на Марс, там яблоки с виноградом поспели", эта фраза, по сути, принадлежит, user_name.
Итак, теперь наша форма, выглядит так:
<form action="" method="post">
Имя::<input type="text" name="user_name" />
</form>
Собственно, большая часть окончена. (Окончено то, что касается формы)
Теперь, дабы, кроме имени, можно было ввести пароль (к примеру), мы вот так напишем наш еще один <input>: Пароль::<input type="password" name="user_pass" />. Так что теперь, форма выглядит так
<form action="" method="post">
Имя::<input type="text" name="user_name" />
Пароль::<input type="password" name="user_pass" />
</form>
Итак, но как же отправить, вы спросите, нормально да?, где сама кнопка??? Потерялась? Нет! Она просто не написана. Так что приступаем… Что бы данные, таки кудато ушли, или, не так, что бы данные все такИ ушли, их надо «послать», но не так, как вы посылаете, свое начальство, естественно про себя, а то тьфу тьфу тьфу – уволят. А послать, в смысле передать в запрос. Итак. Послать, или SEND, как угодно назовите, пишется так: <input type="submit" name="send" value="Отправить" />. Что тут. type="submit" – о нем выше было сказано, name – так же говорилось. Появилось только, неведомое, value. По правде говоря, value, это значение, не очень важное. Так себе, не фонтан. Но! Оно необходимо для того, что бы надпись кот. будет на кнопки, была бы, такой как вы захотите, если не напишите, value – то катастрофы не произойдет, браузер сам это сделает по умолчанию. Итак, после всего сказанного, наша форма имеет такой вид:
<form action="" method="post">
Имя::<input type="text" name="user_name" />
Пароль::<input type="password" name="user_pass" />
<input type="submit" name="send" value="Отправить ">
</form>
Собственно все с формой. Закончили!
Конечно, много не нужной лирики было, но по другому писать не умею. Журналистика дает о себе знать :). Итак. Приступаем к самому интересному. Как мы уже определились, сначала, будем юзать POST. Итак, условимся, что наша форма выглядит таким образом.
<form action="" method="post">
Имя::<input type="text" name="user_name" />
Пароль::<input type="password" name="user_pass" />
<input type="submit" name="send" value="Отправить ">
</form>
Итак, СУПЕРГЛОБАЛЬНЫЙ МАССИВ POST. Испугались? Нет? Ну и ладно! :D
Сначала, я напишу, а потом буду объяснять.
<?php
if(isset($_POST['send'])){
$user_name = !empty($_POST['user_name']) ? htmlspecialchars($_POST['user_name']) : NULL;
$user_pass = !empty($_POST['user_pass']) ? htmlspecialchars($_POST['user_pass']) : NULL;
if($user_name === NULL && $user_pass === NULL){
echo 'Вы не ввели <font color="red"><b>имя/пароль</b></font>';
}else{
echo '<b>Ваше имя:</b> ' . $user_name;
echo '<br />';
echo '<b>Ваш пароль: </b>' . $user_pass;
}
}
?>
Сразу оговорюсь, что этот код – примитив, но логику даст понять. Итак, что мы имеем?
<?php – это понятно, надеюсь. Открывает тег php для того что бы в нем писать.
if(isset($_POST['send'])){- тут проверяем существует ли вообще, нажатая кнопка «Отправить». Если она существует, а мы ее таки нажали, то идем дальше
$user_name = !empty($_POST['user_name']) ? htmlspecialchars($_POST['user_name']) : NULL; - эта строчка, есть ни что иное, как так называемый – тернарный оператор. По сути, это все равно что:
if(!empty($_POST['user_name'])){
$user_name = htmlspecialchars(($_POST['user_name']);
}else{
$user_name = NULL;
}
Проверяем, не пусто ли поле user_name, и если не пусто то обрабатывает htmlspecialchars– что это такое почитайте в интеренте, скажу только, что это очень важная встроенная функция, ее надо знать и применять.
Иначе приравниваем $user_name к логическому нулю.
То же самое происходит и с $user_pass. Разницы, в принципе, никакой, разве что имя переменной – другое, и данные из другого input’a поступают. А так, логика одна.
Итак, теперь у нас есть $user_name и $user_pass. Возьмем, идеальный вариант – они не пусты, в них есть значения, и они корректно обработаны. Дальше мы видим вот это:
($user_name === NULL || $user_pass === NULL){
Это по сути проверка, на то, что данные правильно введены и значения имеют отличные от логического NULL. А если же нет. То есть одно поле пусто, то это уже логическая ошибка, и нужно показать сообщение об этом: (|| - это значит ИЛИ, то есть, грубо говоря, вот так $user_name === NULL ИЛИ $user_pass === NULL)
echo 'Вы не ввели <font color="red"><b>имя/пароль</b></font>';
ИНАЧЕ, если все гуд, то просто выводим такой сообщение
}else{
echo '<b>Ваше имя:</b> ' . $user_name;
echo '<br />';
echo '<b>Ваш пароль: </b>' . $user_pass;
}
И закрываем } – такой скобкой, блок с if(isset($_POST[‘send’])){
В итоге мы имеем, следующую структуру файла:
<?php
if(isset($_POST['send'])){
$user_name = !empty($_POST['user_name']) ? htmlspecialchars($_POST['user_name']) : NULL;
$user_pass = !empty($_POST['user_pass']) ? htmlspecialchars($_POST['user_pass']) : NULL;
if($user_name === NULL || $user_pass === NULL){
echo 'Вы не ввели <font color="red"><b>имя/пароль</b></font>';
}else{
echo '<b>Ваше имя:</b> ' . $user_name;
echo '<br />';
echo '<b>Ваш пароль: </b>' . $user_pass;
}
}
?>
<form action="" method="post">
<input type="text" name="user_name" />
<input type="password" name="user_pass" />
<input type="submit" name="submit" value="Отправить" />
</form>
А теперь про видимость и не видимость. Как мы помним POST – не видим. Это значит, что, именно визуального его как бы нет, но он есть. А именно: Есть у нас, такая страница, mysite.com. На ней есть такая форма, что выше, и если мы отправим, форму, то ничего в адресной строке не меняется.
А ТЕПЕРЬ, если сделать изменения: Вот так:
<?php
if(isset($_GET['send'])){
$user_name = !empty($_GET['user_name']) ? htmlspecialchars($_GET['user_name']) : NULL;
$user_pass = !empty($_GET['user_pass']) ? htmlspecialchars($_GET['user_pass']) : NULL;
if($user_name === NULL || $user_pass === NULL){
echo 'Вы не ввели <font color="red"><b>имя/пароль</b></font>';
}else{
echo '<b>Ваше имя:</b> ' . $user_name;
echo '<br />';
echo '<b>Ваш пароль: </b>' . $user_pass;
}
}
?>
<form action="" method="get">
<input type="text" name="user_name" />
<input type="password" name="user_pass" />
<input type="submit" name="send" value="Отправить" />
</form>
Заметили? Нет? Ну что ж так. Я поменял, метод в передачи формы. Теперь он так выглядит
<form action="" method="get"> Зампетили метод стал GET? Ну вот и славно, теперь, в обработчике, все POST поменяйте на GET. GET – это такой же СУПЕРГЛОБАЛЬНЫЙ МАССИВ. Но! И вот где. Обратите внимание на свой адрес в адресной строке. Как он поменялся?! А именно приобрел вид:
http://www.mysite.com/?user_name=max&user_pass=m4a1fox&send=Отправить
Что тут получается? Слово max принадлежит параметру (или name="user_name" в форме) user_name, а слово m4a1fox принадлежит параметру (или name="user_pass" в форме) user_pass. Есть так же и отправить, которая принадлежит параметру (или name="send" в форме) send. Вот и все.
Еще запомните, что GET имеет определенное ограничение, по кол-ву символов. То есть оно – конечно! А вот POST можно использовать досхочу, не знаю, правда может и там есть какие-нибудь ограничений по символам, но это уж ОЧЕНЬ большой получается текст.
P.S. Прошу прощения за много букаф! Как я говорил, чего-то пробило меня. Жур.фак все таки!
Спустя 3 месяца, 8 дней, 12 часов, 24 минуты (10.01.2012 - 04:38) Commander Keen написал(а):
Спасибо товарищу m4a1fox за интересную статью. Для себя, как новичка в PHP почерпнул кое-что новое. Разрешите добавить по следующему утверждению:
Цитата |
А вот POST можно использовать досхочу, не знаю, правда может и там есть какие-нибудь ограничений по символам, но это уж ОЧЕНЬ большой получается текст. |
Да, насколько я понял, ограничение есть, и по дефолту равно 8 мегабайтам (PHP 5.2.13). Отвечает за это встроенная директива "php.ini" - "post_max_size". И на сколько я ещё понял, эту переменную с помощью функции "ini_set" изменить мы не можем (а кстати почему, ув. эксперты?), но можем менять значение, путём правки самого "php.ini" - там есть параметр с одноимённым названием (подробнее о нём можно прочесть здесь).
Я не в коем случаи не пытаюсь поправить m4a1fox или кого-либо учить, я просто дополнил и без того хорошо изложенную информацию, чтобы в будущем, таким новичкам как я тема данного вопроса была бы раскрыта более полно и понятно.
Уважаемые эксперты, если я где-то что-то не то сказал - поправьте меня пожалуйста. С уважением.
Спустя 1 час, 1 минута, 6 секунд (10.01.2012 - 05:39) Эли4ка написал(а):
оригинальная статья-без каких-либо премудростей..
Спустя 18 минут, 45 секунд (10.01.2012 - 05:57) Guest написал(а):
@m4a1fox:
Я одного понять не могу: зачем ты портишь входящие данные функцией htmlspecialchars?
То что выводим надо обрабатывать через нее, а не то что вводим.
Я одного понять не могу: зачем ты портишь входящие данные функцией htmlspecialchars?
То что выводим надо обрабатывать через нее, а не то что вводим.
Спустя 4 минуты, 58 секунд (10.01.2012 - 06:02) Commander Keen написал(а):
А вот кстати, задам вопрос по теме htmlspecialchars:
Почему бы сразу не вводить чистые данные? Мне кажется так даже логичнее будет. В базе не будет ничего такого. Или это как негласное правило? Традиция такая? Вот можете смотреть на меня как на дурака-параноика, но я бы вообще и при вводе всё чекал и при выводе. Может глупо, за то чисто )
Почему бы сразу не вводить чистые данные? Мне кажется так даже логичнее будет. В базе не будет ничего такого. Или это как негласное правило? Традиция такая? Вот можете смотреть на меня как на дурака-параноика, но я бы вообще и при вводе всё чекал и при выводе. Может глупо, за то чисто )
Спустя 57 минут, 13 секунд (10.01.2012 - 07:00) Игорь_Vasinsky написал(а):
да. можете не использовать. это защита от XSS
Спустя 1 час, 34 минуты, 2 секунды (10.01.2012 - 08:34) twin написал(а):
Цитата (Игорь_Vasinsky @ 10.01.2012 - 04:00) |
да. можете не использовать. это защита от XSS |
Это не защита от XSS, а грубейшее нарушение принципов обработки данных.
Спустя 1 минута, 58 секунд (10.01.2012 - 08:36) Commander Keen написал(а):
Что-то я совсем запутался. Не использовать что? И в чём выражается это самое грубейшее нарушение?
Спустя 16 минут, 14 секунд (10.01.2012 - 08:52) twin написал(а):
Функция htmlspecialchars() заменяет HTML сущности на эквиваленты. Эквиваленты, понятные браузерам и предназначенные для вывода на экран первозданного текста. Если заменить сущности на эквиваленты не перед выводом, а на входе в скрипт, мы обрекаем его на работу с искаженными данными.
К примеру. Я пишу в поле "пароль" такой текст: <twin>. После обработки этой функцией на входе, мы имеем в переменной такой текст: <twin>, а пароль для аутентификации именно такой, так я и ввожу. В результате
<twin> != <twin>
и я иду лесом.
Есть еще куча неприятностей, это один из примеров. Так вот, функция предназначена для корректной работы с браузером, а посему применять её нужно только перед отдачей данных в поток, не ранее.
Вот
К примеру. Я пишу в поле "пароль" такой текст: <twin>. После обработки этой функцией на входе, мы имеем в переменной такой текст: <twin>, а пароль для аутентификации именно такой, так я и ввожу. В результате
<twin> != <twin>
и я иду лесом.
Есть еще куча неприятностей, это один из примеров. Так вот, функция предназначена для корректной работы с браузером, а посему применять её нужно только перед отдачей данных в поток, не ранее.
Вот
<?php
if(isset($_GET['send'])){
$user_name = !empty($_GET['user_name']) ? $_GET['user_name'] : NULL;
$user_pass = !empty($_GET['user_pass']) ? $_GET['user_pass'] : NULL;
// Тут мы можем безболезненно работать с первозданными данными
if($user_name === NULL || $user_pass === NULL){
echo 'Вы не ввели <font color="red"><b>имя/пароль</b></font>';
}else{
echo '<b>Ваше имя:</b> ' . htmlspecialchars($user_name);
echo '<br />';
echo '<b>Ваш пароль: </b>' . htmlspecialchars($user_pass);
}
}
?>
<form action="" method="get">
<input type="text" name="user_name" />
<input type="password" name="user_pass" />
<input type="submit" name="send" value="Отправить" />
</form>
Спустя 7 минут, 48 секунд (10.01.2012 - 09:00) Michael написал(а):
Мне кажется twin, что ТС так не думал хранить данные в базе. Кода же к базе нету. Просто мухи с котлетами смешал - обработку вывода при обработке ввода.
Спустя 1 минута, 59 секунд (10.01.2012 - 09:02) Invis1ble написал(а):
Yegor Opanasjuk
Цитата |
И на сколько я ещё понял, эту переменную с помощью функции "ini_set" изменить мы не можем (а кстати почему, ув. эксперты?), но можем менять значение, путём правки самого "php.ini" - там есть параметр с одноимённым названием |
Спустя 25 секунд (10.01.2012 - 09:02) Игорь_Vasinsky написал(а):
ест-но для БД он бы использовал md5 sha1 и т.д., я его знаю.
Спустя 4 минуты, 30 секунд (10.01.2012 - 09:07) twin написал(а):
Причем тут база вообще? Я о принципах обработки данных и их грубом нарушении.
Спустя 3 минуты, 34 секунды (10.01.2012 - 09:10) Commander Keen написал(а):
Боюсь, что сморожу, но вы уж меня простите. Я на самом деле не об этой функции говорил, что "htmlspecialchars()", а функция которая срезает ненужные теги - "strip_tags()" (ну не нужны же мне в базе данные которые мне не нужны, тем более всякие <script></script>). Ей-то можно чистить перед вводом в базу? А про htmlspecialchars - понятно, что данные зайдут не те, что хотелось бы. Это даже я понимаю
Цитата |
судя по написанному здесь - менять можно не только в php.ini, но также в .htaccess и httpd.conf |
Вот, даже и там. Спасибо за дополнение.
Спустя 2 минуты, 40 секунд (10.01.2012 - 09:13) Michael написал(а):
У него в примере обработки то и нет вообще, только ввод и вывод, но вообще да - пусть исправляет, а то запутает читающих.
Yegor Opanasjuk, ну так если не нужные, то срезай конечно. Помню правда вроде с html комментами эта функция работала странновато.
Yegor Opanasjuk, ну так если не нужные, то срезай конечно. Помню правда вроде с html комментами эта функция работала странновато.
Спустя 3 минуты, 52 секунды (10.01.2012 - 09:17) twin написал(а):
Цитата (Yegor Opanasjuk @ 10.01.2012 - 06:10) |
Боюсь, что сморожу, но вы уж меня простите. Я на самом деле не об этой функции говорил, что "htmlspecialchars()", а функция которая срезает ненужные теги - "strip_tags()" (ну не нужны же мне в базе данные которые мне не нужны, тем более всякие <script></script>) |
А почему так? Чем они там, в базе, помешали? Почему ты вот тут на форуме можешь написать:
Цитата |
всякие <script></script> |
а на твоем сайте это будет безвозвратно потеряно?
Спустя 5 минут, 13 секунд (10.01.2012 - 09:22) Commander Keen написал(а):
Цитата |
Цитата всякие <script></script> а на твоем сайте это будет безвозвратно потеряно? |
Аааа, тоочноо Семён Семёнович То есть получается, что в базу можно пхать весь приходящий шлак (кроме самого откровенного), а при выводе нужно обработать. Но только при выводе? Так?
Upd. На все мои глупые вопросы ответил FAQ и его шестой вопрос. Спасибо за ответы.