Обработка формы в PHP
Львиная доля задач в PHP связана с обработкой данных, полученных от пользователя. И в большинстве случаев, эти данные получены из формы, поэтому обработка форм в PHP является важнейшим моментом при создании сайта, о котором я и расскажу в этой статье.
Для начала давайте создадим форму на HTML:
<html>
<head>
<title>Форма</title>
</head>
<body>
<form name = 'myform' action = 'req.php' method = 'post'>
Ваш логин: <input type = 'text' name = 'login' />
<br />
Ваш пароль: <input type = 'password' name = 'pass' />
<br />
<input type = 'submit' value = 'Войти' />
</form>
</body>
</html>
Это пример классической формы авторизации пользователя, которую, уверен, многие из Вас многократно заполняли на самых разных сайтах. Давайте теперь обсудим один важный момент: как отправляются данные? Существует два метода (мы с Вами будем только два рассматривать) - это GET и POST. Главное их отличие - это вид отправки: открытый (GET) и закрытый (POST). Самый лучший способ понять, в чём разница - это открыть данный HTML-код в браузере и нажать кнопку "Войти". Посмотрите на адресную строку, а потом поставьте другой метод, снова пройдите и вновь посмотрите на адресную строку. Отличие будет бросаться в глаза мгновенно.
Соответственно, в PHP существуют два массива: $_GET и $_POST, которые содержат данные, полученные каждым из этих методов. Также есть массив $_REQUEST, который содержит данные $_GET и $_POST одновременно. Я Вам советую использовать метод POST и массив $_POST, хотя, безусловно, зависит от ситуации, но в большинстве случаев делают именно так.
Теперь давайте обработаем данные. Давайте реализуем простой скрипт (в файле "req.php"):
<?php
$login = $_POST['login'];
$pass = $_POST['pass'];
if (($login == "Admin") && ($pass == "AdminPass"))
echo "Привет, Admin!";
else echo "Доступ закрыт";
?>
В данном скрипте мы получаем данные, полученные из формы методом POST (из массива $_POST, хотя с таким же успехом могли получить эти данные из $_REQUEST). Дальше проверяем логин и пароль и выводим: "Привет, Admin!" или "Доступ закрыт". Разумеется, чтобы создать систему авторизации пользователей на сайте, необходимо ещё узнать о cookie или о сессиях (в принципе, тоже cookie), но о них мы поговорим несколько позднее, потому что у нас впереди ещё очень много важных тем.
Аналогично, считываются и обрабатываются абсолютно любые данные из форм. То есть всё, что Вам нужно - это знать имя переменной (задаётся в HTML-форме) и дальше использовать массивы $_POST, $_GET и $_REQUEST.
-
- Михаил Русаков
Комментарии (84):
Вот Вы пишете "абсолютно любые", а массив через форму не передается(( А было бы неплохо...
Ответить
Обычное текстовое поле, куда пользователь может ввести набор данных через запятую, которые впоследствии можно преобразовать в массив. Если же нужно просто передать данные массива из формы, то тогда элемент hidden можно использовать.
Ответить
да я пробовал hidden, выдает просто "Array", а содержание массива теряется
Ответить
Разумеется теряется. Вы же наверняка пишите что-нибудь наподобие этого: <input type = 'hidden' value = '<?php echo $array;?>' /> А надо преобразовывать массив в строку, где элементы могут идти, например, через запятую. А чтобы получить массив, надо эту строку обратно преобразовать в массив. Функции explode() и implode() с этими двумя задачами прекрасно справляются.
Ответить
спасибо! я так и думал, что без строк тут не обойтись)) Кстати, вот и функция implode() реально пригодилась)
Ответить
Спасибо. статья очень помогла.
Ответить
Михаил! А как сделать уведомления (админу) о новых комментариях? И, возможно ли сделать это, если комменты записываются не в базу данных, а у файл?
Ответить
При обработке формы и добавлении нового комментария вызывайте функцию mail() с необходимыми данными. Куда записываются комментарии, значения не имеет.
Ответить
Михаил, как сделать вывод данных из mysql таблицы, отфильтрованной на основе формы (фильтр на чекбоксах и выпадающих списках)? Обработать форму нужно в отдельном файле или можно тут же?
Ответить
Обрабатывать форму можно, где угодно. А для вывода из базы на основе форму нужно делать на основе генерации SQL. Генерируете SQL запрос (через множество IF на проверку чекбоксов), выполняете и выводите результат.
Ответить
Можно сделать так, чтобы значения формы не сбрасывались в дефолт при отправке на обработку (обработка в том же файле)?
Ответить
Сохранять значения, например, в сессию, а потом их подставлять в форму.
Ответить
Михаил, а можно узнать какую конкретно строчьку нужно прописать в коде комментариев, для уведомления о новых комментах мне на Email? Все комменты записываются в файл .txt
Ответить
В скрипте-обработчике просто шлёте письмо с необходимыми данными через функцию mail().
Ответить
Помоги создать эту строчьку с функцией mail() Мыло напиши любое. Я не догнал. Вот обработчик: <?php $dirct="papka"; $otznam=$HTTP_POST_VARS['nom'].time(); $hdl = fopen("$dirct/$otznam", "w+"); fwrite($hdl,strip_tags($HTTP_POST_VARS['otziv'])); strip_tags(строка, '<a><b><i><u>'); fclose($hdl); Header("Location: http://tviksi.ru/igru.html"); ?>
Ответить
Перед Header("...") вызовите функцию mail(). Как пользоваться этой функцией, написано здесь: http://myrusakov.ru/email-php.html
Ответить
Михаил, а как сделать комментирование на сайте, сделел форму, на этой же странице и обработал? не пойму алгоритм. авторизация на сайте имеется
Ответить
Принять данные, записать их в базу (или хотя бы в текстовый файл). Вот и весь алгоритм.
Ответить
не получается, я пишу форму -> принемаю данные -> записываю в базу и все равно выводится не понятно что. Можете в крации написать скрипт? или же статью, я думаю не мне одному будет интересно.
Ответить
Здесь в самом простейшем случае будет порядка 150 строк. Сами понимаете, что в комментарий этой не вставить. Выводится непонятно что, потому что неправильно выводите значит. Почитайте про язык SQL и PHP. Не выборочно (как многие), а всё подряд. А выборочно читают уже очень опытные люди, у которых за плечами годы практики. Вам же нужно тщательно всё и детально изучать, начиная с самого тривиального и двигаться вглубь материала.
Ответить
хорошо, подскажите пожалуйста вот тут не правельно да? $c = $_POST['comment']; \\здесь я принял данные из формы, а как теперь записать в бд??? $mysqli->query('INSERT INTO comment (comment) values(что написать здесь?)'); Заранее спасибо!
Ответить
Правильно принимаете. Запрос: "INSERT INTO `comment` (`comment`) VALUES ('$c')"
Ответить
Благодарю
Ответить
и последний вопрос, я делаю выборку и мне выдает Array ( [comment] => привет [data] => 0000-00-00 00:00:00 ) вот так, как сделать чтобы выдовалось просто "привет" и дату отправки?
Ответить
echo Название_массива["comment"];
Ответить
echo $row["comment"]; не получилось
Ответить
аа не , не все получилось. Спасибо
Ответить
Никто не знает в чем проблема? Делал для админки возможность удаления банеров, вот код: $file_list = scandir("$_SERVER[DOCUMENT_ROOT]\admin\banera"); foreach($file_list as $value) { if (($value<>'.') && ($value<>'..')) {echo " <br> <input type='checkbox' name='$value' value='delet'> $value";}}; проблема такая: каждому элементу массива $_POST передается значние delet, которое должно передаваться только отмеченным чекбоксам, в чем тут может быть загвоздка?
Ответить
Только отмеченные чекбоксы и будут передаваться.
Ответить
Тогда почему в файле обработчике, прописав: foreach($file_list as $value) { if (($_POST[$value]='delet') && ($value<>'.') && ($value<>'..')) { unlink("$_SERVER[DOCUMENT_ROOT]/admin/banera/$value");echo "$_POST[$value]"; } } я получаю удаление всех файлов(даже если ничего неотмеченно)? Специально ввел echo "$_POST[$value]" чтобы проверить значение и везеде выводит delet(для каждого элемента массива, ставил я галочку или нет)
Ответить
Выведите print_r($_POST) в самом начале скрипта и посмотрите, действительно ли приходят. Уверен, что нет, если Вы нигде не ошиблись.
Ответить
Array ( [googlec886694543f3d6ce_html] => delet [login_ini] => delet [qqq_php] => delet ) вот что выводит при отмечании чекбоксов
Ответить
Вот эти 3 чекбоса и выделены, значит, всё работает правильно, и все ошибки уже непосредственно в Ваших циклах или в том, что перед ними.
Ответить
Михаил. Что следует сделать если задача состоит а том , что при нажатии на кнопку должен выполнится php скрипт который берет данные из бд и выводит их в текстовом поле. Кнопок на странице несколько. То есть страница не должна обновляться, а просто обновляться текстовое поле. Больше всего интересуют как связать скрипт с текстовым полем.
Ответить
http://myrusakov.ru/javascript-post.html
Ответить
Здравствуйте Михаил! Подскажите пожалуйста как соединить HTML с PHP??? Если можно, то напишите подробный код! Вашу статью по соединению файлов читал, но про HTML не понял! Взарание Спасибо!
Ответить
<?php тут PHP-код ?>Тут HTML-код
Ответить
Но куда вставлять PHP код? Между тегами body в HTML файле?
Ответить
В любое место, где он нужен, хоть прямо внутри тега.
Ответить
Спасибо! Просто где-то читал вы писали, что нельзя внедрять PHP в HTML
Ответить
Можно, но крайне нежелательно.
Ответить
А как тогда сделать по другому? Вот например у меня Отдельные файлы CSS и JavaScript соединены с HTML с помощью кода написанного в HTML между тегами HEAD! Можно ли сделать также с PHP??
Ответить
PHP - это серверный язык, его никак не надо подключать к клиентскому языку. Он выполняется ещё до загрузки страницы. В общем, учитесь писать движки, тогда и поймёте.
Ответить
Михаил, здравствуйте. сделал отдельно файл html, отдельно req.php в той же папке. в html php не прописывал. все работает. или я вас неправильно понял или еще что...спасибо вам за сайт- благодарю пользуясь возможностью.
Ответить
Здравствуйте, Михаил! Вот, пишу форму обратной связи. Всё ОК, только возникли небольшие проблемы. Вот тут тестовая страница (я тут эксперимент) http://sites-platon.ru/server/form.html. Вот php код, ошибка в 7-ой строчке: <?php $to = $_POST['e-mail']; $sub = $_POST['Tema']; $M = $_POST['M']; $N = $_POST['Name']; $F = $_POST['File']; $Z = $M,"<br>","От ",$N,"<br>",$F; mail($to, $sub, , $Z); ?>
Ответить
Надо вместо запятых точки использовать.
Ответить
unexpected ','
Ответить
Всё, разобрался! Спасибо!
Ответить
У меня вопрос к теме об авторизации пользователя, мы в html документе обращаемся к php, только вот при введении Admin и пароля AdminPass у меня выходит вся программа php файла целиком, а это <?php $login = $_POST['login']; $pass = $_POST['pass']; if (($login == "Admin") && ($pass == "AdminPass")) echo "Привет, Admin!"; else echo "Доступ закрыт"; ?> Почему так?
Ответить
Можете не отвечать, я разобралась)))))
Ответить
А я не разобралась. Подскажите, пожалуйста, что сделать
Ответить
а правда, что "action" надо указывать не имя файла обработчика, а его полный URL?
Ответить
Нужно указывать имя и расширение, а полный путь указывать необязательно.
Ответить
Нет, достаточно одно имя если обработчик и форма находится на одном уровне.
Ответить
Михаил! А как и где используется параметр формы name. То есть если я присвоил форме имя (<form name='NAME' action='test.php'>) где я смогу его использовать и как?
Ответить
В JavaScript.
Ответить
Тогда следующий вопрос. Возможно ли на странице сайта использовать сразу две формы с разными action? переменные с обоих форм будут уходить на страницу указанную в action? Или как то по другому?
Ответить
Можно, но отправить можно только одну форму.
Ответить
То есть на страницу обработчика формы будут переданы только те переменные которые указаны в форме со сработавшим action? (думаю понятно обьяснил) А переменные другой формы с этой же страницы НЕ передадутся?
Ответить
Да, всё верно.
Ответить
михаил, у меня есть вот такой код <form name = "" action = "$radio" method = "post"><input type = "radio" name = "page" value = "action" />action <input type = "radio" name = "page" value = "arcade" />arcade <input type = "radio" name = "page" value = "fighting" />fighting <input type = "radio" name = "page" value = "RPG" />RPG <input type = "radio" name = "page" value = "strategy" />strategy <input type = "radio" name = "page" value = "simulator" />simulator <input type = "radio" name = "page" value = "sport" />sport <input type = "radio" name = "page" value = "racing" />racing <form> как сделать так чтобы под каждое radio перемення $radio меняла свое значение ссылкой на файл обработки данных? буду очень благодарен!!!
Ответить
Не вижу здесь никакой переменной $radio и не ясен вопрос.
Ответить
короче говоря, мне нужно сделать так чтобы при выборе какого-нибудь radio обработка проволилась на другой странице. как это сделать?
Ответить
Если Вы хотите менять action в зависимости от выбранного radio, то нужно использовать JavaScript.
Ответить
Здравствуйте, Михаил! Подскажите пожалуйста, как сделать проверку обязательных и необязательных полей формы (точнее только необязательных). Имеется форма регистрации - Логин, пароль, почта, город. Первые три обязательны для заполнения, последнее нет, проверяю все поля регулярными выражениями, всякими проверками на корректность ввода. А как сделать чтобы при незаполненном поле Город скрипт передавал бы базе данных только первые три поля, а город оставлял бы пустым?
Ответить
В PHP надо проверять empty(переменная_город).
Ответить
Здравствуйте, Михаил! Есть 4 кнопки radio, как узнать какая из них именно нажата?
Ответить
Вы должны получить value из этого элемента, который и будет соответствовать выбранному варианту.
Ответить
Добрый день, Михаил! Делаю по вашим видио урокам сайт, на котором представлено 3 различных услуги, соответственно под каждую услугу своя html страничка с подключённой к ней (include ("forma.php");) общей формой. Теперь сам вопрос : как передать в базу данных, вместе с именем и телефоном, ещё и статичную переменную, которая характерезует данную услугу и задана на каждой страничке своя ??? З.Ы: я так понимаю надо передавать через <input type="hidden" name="variant" /> но как не пробовал, не получается..
Ответить
Алексей, Создайте БД, изучайте SQL и mySQL. 1.http://myrusakov.ru/sql-mysql-raznica.html 2.http://myrusakov.ru/mysql-connect.html 3.http://myrusakov.ru/mysql-query.html
Ответить
Я создал БД, и записываю туда имя и телефон из формы. Вот хотел узнать как в одну и ту же форму передавать значения , зависящие от страницы, к которой подключена форма
Ответить
У вас форма другая будет,соответственно оброаботчик другой. Можно извернуться через функцию если иначе,но впринципе смысла нет. А выглядело бы примерно так:Всегда передавать 3 переменные и вытаскивать нужную вам
Ответить
Михаил, проверял работоспособность php при помощи денвера, в этой же директории создал файл html, в котором хранится сама форма, при проверке(которую сто раз запускал при php) вижу только отработку php, формы не появляется. Совмещать PHP с html не стоит жеж, делать отдельными файлами?
Ответить
Дима, PHP и HTML совмещать можно, ничего в этом пагубного нет.
Ответить
Александр, естественно попробовал и совместить, у меня php отрабатывает параллельно, т.е сразу выбрасывается результат по php, предварительно не отработав код html. Вставляю перед body
Ответить
Михаил, просьба ответить на вопрос, не могу дальше идти. "Проверял работоспособность php при помощи денвера, в этой же директории создал файл html, в котором хранится сама форма, при проверке(которую сто раз запускал при php) вижу только отработку php, формы не появляется. Совмещать PHP с html не стоит жеж, делать отдельными файлами?"
Ответить
Дима, если у Вас есть вопросы, пишите в службу поддержки.
Ответить
Здравствуйте. Помогите, пожалуйста! У меня при нажатии на кнопку формы код не выполняется, а выводится всё содержимое php-файла, либо окно загрузки файла (зависит от браузера).
Ответить
Здравствуйте, Юлия. Прочтите данную статью: http://myrusakov.ru/html-open-txt.html
Ответить
Спасибо за ответ. Галочка у пункта "Скрывать расширения для зарегистрированных типов файлов" у меня не стояла. Не подскажете, в чём ещё может быть причина? php-файлы у меня работают. Не работают, когда идёт ссылка на них именно из формы. Не хотела вас тревожить, но просидев половину дня в поисковике и не найдя ответа, всё-таки решилась.
Ответить
Юлия, очень важно запускать к примеру Ваш index.html с формой через адресную строку,а не двойным кликом мыши. Тогда информация, которая будет отравлена с этой формы к примеру в обработчик action.php будет получена правильно и обработается, а не отобразится исходный код Вашего обработчика.
Ответить
Спасибо огромное!!!
Ответить
а как проверить поле textarea перед записью в базу на любой вид ссылок и в тегах [a]<a> и без них и вырезать чтобы оставался только чистый текст
Ответить
<?php $login = $_POST['login']; $pass = $_POST['pass']; if (($login == "Admin") && ($pass == "AdminPass")) echo "Привет, Admin!"; else echo "Доступ закрыт"; ?> Скажите, пожалуйста, как это делать. Где форма всё правильно, и когда нажимаю на кнопку НАЧАТЬ просто нова вкладка открывается, где ПРОСТО ОТОБРАЖАЕТСЯ ЭТОТ КОД И ВСЁ??? КАК ЭТО ДЕЛАТЬ?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.