Форма ввода php

Опубликовано 2012.01.15 в разделе Php

Язык программирования PHP позволяет делать и обрабатывать пользовательские формы фактически любой сложности. В этой статье я научу вас создавать и обрабатывать формы.Для начала рассмотрим принцип работы форм и из чего они состоят. Форма представляет собой html код с различными полями ввода, которые заполняет пользователь. После нажатия кнопки отправки формы происходит передача значений всех полей формы обработчику этой формы. Отправка осуществляется методом POST или GET. По умолчанию используется GET. Рассмотрим простой пример,форма отправки имени,фамилии и номера телефона: Файл forma.html
  1. <form action="action.php" method="post" enctype="multipart/form-data">
  2. Ваше имя: <input type="text" name="name" /><br />
  3. Ваша фамилия: <input type="text" name="surname" /><br />
  4. Ваш телефон: <input type="text" name="phone" /><br />
  5. <input type="submit" value="Отправить форму" />
  6. </form>
В теге form указан путь к обработчику и метод передачи данных. Параметр enctype позволяет передавать через форму файлы. Например если нам нужно приложить к форме какой-нибудь документ-то этот атрибут обязателен. Тэги input - это элементу формы. Какой элемент-зависит от атрибута type. Теперь код обработчика. Файл action.php
  1. //Принимаем постовые данные
  2. $name=$_POST['name'];
  3. $surname=$_POST['surname'];
  4. $phone=$_POST['phone'];
  5.  
  6. //вывод на экран
  7. echo $name.' '.$surname.' ваш номер телефона '.$phone;
Это простейший пример php формы.В реал конечно же никому не интересно заполнять форму лишь для того, чтобы потом посмотреть что же вы заполнили... Чаще всего полученную информацию заносят в базу данных,отправляют на почту или записывают в файл. Мы рассмотрим все три случая. Начнем с простого-запись в файл. Менять будем только обработчик.

Форма с записью результата в файл

Оставляем нашу форму как есть и заносим в файл имя, фамилию, телефон и IP адрес посетителя.
  1. //Принимаем постовые данные
  2. $name=$_POST['name'];
  3. $surname=$_POST['surname'];
  4. $phone=$_POST['phone'];
  5.  
  6. //обращаемся к глобальной переменной SERVER
  7. $ip=$_SERVER['REMOTE_ADDR'];
  8.  
  9. //формируем строку для записи
  10. $str=$name.' '.$surname.', '.$phone.', '.$ip.'\r\n';
  11.  
  12. //открываем файл для записи.Если файл не существует-он будет создан
  13. $fopen = fopen('my_form_reports.txt', 'a+');
  14. //записываем строку
  15. fputs ($fopen, $str);
  16. //закрываем файл
  17. fclose ($fopen);
Вот и всё. Тестируйте.

Форма с записью результата в базу данных MySql

В случае с базой чуть посложнее. Тут очень важен момент безопасности. Данные необходимо профильтровать и лишь потом занести в БД, иначе злоумышленник может провести SQL инъекцию и уничтожить вашу базу данных.Обязательно используйте функцию mysql_real_escape_string. Пишем обработчик:
  1. //принимаем данные
  2. $name=$_POST['name'];
  3. $surname=$_POST['surname'];
  4. $phone=$_POST['phone'];
  5.  
  6. //соединяемся с БД
  7. mysql_connect('localhost', 'user_name', 'user_password');
  8. mysql_select_db('db_name');
  9.  
  10. //обязательно экранируем нежелательные символы функцией mysql_real_escape_string
  11. $sql="insert into `table_name` (name,surname,phone,ip) values
  12. (
  13. '". mysql_real_escape_string($name)."',
  14. '". mysql_real_escape_string($surname)."',
  15. '". mysql_real_escape_string($phone)."',
  16. '".$_SERVER['REMOTE_ADDR']."'
  17. )";
  18. $res=mysql_query($sql);
Будет лучшим использовать библиотеку PDO. Код будет выглядеть следующим образом:
  1. $name=$_POST['name'];
  2. $surname=$_POST['surname'];
  3. $phone=$_POST['phone'];
  4. //соединение с базой
  5. $db = new PDO('mysql:dbname=db_name; host=localhost',"user_name","user_password");
  6.  
  7. //далее сам запрос
  8. $sql="insert into `table_name` (name,surname,phone,ip) values (:name,:surname,:phone,:ip)";
  9. $sth=$db->prepare($sql);
  10. $sth->bindValue(':name', $name);
  11. $sth->bindValue(':surname', $surname);
  12. $sth->bindValue(':phone', $phone);
  13. $sth->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
  14. $sth->execute();
Обратите внимание,что при использовании PDO наши переменные не проходили никакой проверки. Но это не является уязвимостью. Библиотека PDO самостоятельно очистит всё лишнее и выполнит запрос. Чтоб узнать результат запроса-допишите в конце следующий код:
  1. $error=$sth->errorInfo();
  2. print_r($error);

Форма с отправкой e-mail средствами php

Опять правим форму. На этот раз экранируем ненужные символы для безопасного отображения в браузере. Используется для этого функция htmlspecialchars.
  1. //Принимаем постовые данные
  2. $name=$_POST['name'];
  3. $surname=$_POST['surname'];
  4. $phone=$_POST['phone'];
  5.  
  6. //Тут указываем на какой ящик посылать письмо
  7. $to = "email@yandex.ru";
  8. //Далее идет тема и само сообщение
  9. $subject = "Тема письма";
  10. $message = "
  11. Письмо отправлено из моей формы.<br />
  12. Пользователь указал:<br />Имя: ".htmlspecialchars($name)."<br />
  13. Фамилия: ".htmlspecialchars($surname)."<br />
  14. Телефон: ".htmlspecialchars($phone);
  15. $headers = "From: MySite.ru <site-email@mysite.ru>\r\nContent-type: text/html; charset=utf8 \r\n";
  16. mail ($to, $subject, $message, $headers);
  17. </site-email@mysite.ru>
Вот и всё. Если делаете форму, доступную для посетителей сайта-обязательно используйте капчу. Качайте исходники, разбирайтесь. Пишите комментарии, задавайте вопросы.

51 Комментариев

Оставить комментарий

  1. Гость 2017/06/15

    А установка только на сервер с PHP или грубо говоря можно попробывать на Windows?

    Ответить

    1. Админ 2017/06/28

      PHP и MySQL можно установить как на Windows, так и на Linux.
      Для винды попробуйте установить xampp, прямо на домашний компьютер с windows.

      Ответить

  2. Гость 2016/03/14

    Круто

    Ответить

  3. Гость 2016/02/19

    а как сделать так, что бы при обновлении страницы, введенное имя и email сохранялось именно в поле?

    Ответить

    1. Админ 2016/02/21

      Можно $_POST переменные сразу добавлять в атрибут value формы. Только нужно почистить их, чтобы нельзя было провести XSS атаку на сайт.

      Ответить

  4. Гость 2016/02/14

    Доброго дня. У меня вопрос. Как быть, если нужно отправить форму только после перехода на другую страницу по нажатии там одной кнопки? Да ещё , чтобы значение кнопки добавилось в виде текста в сообщение с формой? Либо в самой кнопке вставить php-скрипт, либо использовать перед кнопкой скрытое поле ? Форма находится на главной странице сайта, а дополнительная кнопка-на другой странице сайта. Как всё это осуществить? Я в программировании полный ноль.

    Ответить

    1. Админ 2016/02/15

      Привет. Можно покопать в сторону многошаговых форм(гуглить по запросу multistep), вроде даже модуль webform_steps для этого есть. Это если по-простому.
      Если кодить-то после отправки первой формы класть всё в сессию и при сабмите уже второй формы это всё сохранять куда нужно.

      Ответить

      1. Гость 2016/02/16

        Спасибо. проблема решена.

        Ответить

  5. Гость 2015/12/03

    Спасибо Автору!
    Взял для себя вариант с отправкой на почту.
    Появилась проблема - при отправке данных выполняется переход на файл php. А это пользователям сайта - не вариант.
    Нашел и добавил в конец тега ?php файла php строчечку
    header("Location: ".$_SERVER['HTTP_REFERER']);
    Это автоматический возврат на страницу с формой. Пользователь видит только обновление страницы и всё.

    Ответить

  6. Гость 2015/07/09

    А как можно реализовать форму с записью данных в rtf и отправкой этого rtf файла на почту? Очень нуждаюсь в ответе.

    Ответить

    1. Админ 2015/07/13

      Для создания rtf файла возможно пригодится эта библиотека. Или можно самостоятельно изучить разметку rtf файла(наверняка это xml) и записать её в файл функцией file_put_contents к примеру.
      Отправить e-mail со вложением можно так.

      Ответить

  7. Гость 2014/04/07

    Что-то мне не сильно дошло))) например у меня есть база данных назовём её так BDR и имеется в этой бд таблица ttr, что нужно добавить в код что-бы добавлять с формы текст в эту таблицу? Заранее извиняюсь может это я что то неправильно понимаю.

    $name=$_POST['name'];
    $surname=$_POST['surname'];
    $phone=$_POST['phone'];

    //соединяемся с БД
    mysql_connect('localhost', 'user_name', 'user_password');
    mysql_select_db('db_name');

    //обязательно экранируем нежелательные символы функцией mysql_real_escape_string
    $sql="insert into `table_name` (name,surname,phone,ip) values
    (
    '". mysql_real_escape_string($name)."',
    '". mysql_real_escape_string($surname)."',
    '". mysql_real_escape_string($phone)."',
    '".$_SERVER['REMOTE_ADDR']."'
    )";
    $res=mysql_query($sql);

    Ответить

    1. Админ 2014/04/08

      Вместо

      1. mysql_select_db('db_name');

      пишем


      и вместо
      1. insert into `table_name`

      пишем
      1. insert into `ttr`

      Ответить

      1. Гость 2014/04/08

        Не пойму почему ваш код не пашит? вот к примеру вот этот вариант вполне работоспособный

        mysql_connect("localhost", "root", "")
        or die("

        Ошибка подключения к базе данных! " . mysql_error() . "

        ");
        mysql_select_db("gg")
        or die("

        Ошибка выбора базы данных! ". mysql_error() . "

        ");
        $first_name = trim($_REQUEST['first_name']);
        $last_name = trim($_REQUEST['last_name']);
        $email = trim($_REQUEST['email']);
        $facebook = trim($_REQUEST['facebook']);
        mysql_query("set CHARACTER SET cp1251");
        $insert_sql = "INSERT INTO users (first_name, last_name, email, facebook)" .
        "VALUES('{$first_name}', '{$last_name}', '{$email}', '{$facebook}');";
        mysql_query($insert_sql);
        echo "

        Новая запись вставлена в базу!

        ";

        Ответить

        1. Админ 2014/04/09

          Я вам порекомендую использовать UTF-8, вместо Windows-1251
          Обязательно почитать об SQL инъекциях, так как ваш код уязвим.
          А также разобраться в суперглобальных переменных - почему вы используете $_REQUEST ?

          На каком участке в моём коде возникает ошибка?

          Ответить

  8. Гость 2014/04/04

    Автор - Вы молодец. просто и понятно как все это делать!

    Ответить

  9. Гость 2014/04/02

    а как сделать, чтобы и в базу и на емейл?

    Ответить

    1. Админ 2014/04/03

      Просто соедините эти 2 кода и всё.
      Вот так:

      1. //получаем данные
      2. $name=$_POST['name'];
      3. $surname=$_POST['surname'];
      4. $phone=$_POST['phone'];
      5.  
      6. //соединение с базой
      7. $db = new PDO('mysql:dbname=db_name; host=localhost',"user_name","user_password");
      8.  
      9. //сохранение в БД
      10. $sql="insert into `table_name` (name,surname,phone,ip) values (:name,:surname,:phone,:ip)";
      11. $sth=$db->prepare($sql);
      12. $sth->bindValue(':name', $name);
      13. $sth->bindValue(':surname', $surname);
      14. $sth->bindValue(':phone', $phone);
      15. $sth->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
      16. $sth->execute();
      17.  
      18. //отправка на e-mail
      19. $to = "email@yandex.ru";
      20. //Далее идет тема и само сообщение
      21. $subject = "Тема письма";
      22. $message = "
      23. Письмо отправлено из моей формы.<br />
      24. Пользователь указал:<br />Имя: ".htmlspecialchars($name)."<br />
      25. Фамилия: ".htmlspecialchars($surname)."<br />
      26. Телефон: ".htmlspecialchars($phone);
      27. $headers = "From: MySite.ru <site-email@mysite.ru>\r\nContent-type: text/html; charset=utf8 \r\n";
      28. mail ($to, $subject, $message, $headers);

      Ответить

  10. Гость 2013/12/05

    Ну сам нашел
    javascript который перенаправляет на нужную нам страницу.
    location.replace("http://newcoder.ru/cat/web/");

    Ответить

    1. Админ 2013/12/06

      Можно и так, а можно и на стороне php редиректнуть пользователя.

      1. header('Location: ваш URL');

      Ответить

  11. Гость 2013/12/05

    Я чайник но у меня заработала с первого раза. А как сделать так чтоб открывалась не пустая страница а просто обновлялась страница??? весьма буду признателен за помощь :)

    Ответить

  12. Гость 2013/11/24

    Всё хорошо срабатывает на варианте с библиотекой PDO! Но есть один момент.
    В базу пишет кириллицу в форме ????? и mysql_query('SET NAMES cp1251'); не помогает. Выдаёт ошибку:
    Warning: mysql_query() [function.mysql-query]: Access denied for user 'mikcor'@'localhost' (using password: NO) in /var/www/vhosts/u---973.plsk.regruhosting.ru/domain.ru/invoice/invoice.php on line 43

    Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /var/www/vhosts/u---8973.plsk.regruhosting.ru/domain.ru/invoice/invoice.php on line 43

    Какие мысли есть у Вас?
    Буду признателен!!!

    Ответить

    1. Админ 2013/11/24

      Значит соединение с БД не прошло. Пароль,логин и хост точно верные? Обратите внимание на хост, некоторые хостинги заставляют писать не localhost, а например mysql.hostername.ru (в панели управления это точно описано)

      Попробуйте написать это в самом начале php скрипта.

      1. header('Content-Type: text/html; charset=UTF8');


      Сам файл сохранён в UTF-8 без BOM ?

      И почему cp1251? нужно
      1. mysql_query("SET NAMES utf8");

      Ответить

      1. Гость 2013/11/24

        Соединение с БД проходит, т.к. поля с цифрами заполняются корректно.
        По поводу сохранения файла всё корректно, т.к. в указанном файле только код PHP и страницы создаются правильно (работаю в Dreamweaver уже много лет), могу конечно и в блокноте написать, но вопрос не в этом.
        Нужен в этой кодировке т.к. форма интегрируется уже в готовый сайт с готовой БД и нудно будет выводить их этой БД и другие производные.
        База то конечно MyISAM utf8_general_ci, нов се таблицы в ней MyISAM cp1251_general_ci. Вы думаете на лету перекодирует? header('Content-Type: text/html; charset=UTF8'); попробую... но без неё на почту приходит корректный шрифт.

        Ответить

        1. Админ 2013/11/25

          Я с Dreamweaver имел такие же проблемы. Есть отличный редактор - PhpStrorm, PhpDesigner, NetBeans наконец.
          Попробуйте в Notepad++ тогда скрипт сохранить. Если проблема уйдёт - ищите проблему в настройках Dreamweaver.

          Ответить

          1. Гость 2013/11/25

            Да с Notepad++ я попробовал в первую очередь - не помогает!
            Проверил кодировку БД запросом - SHOW GLOBAL VARIABLES LIKE "char%";.
            И получил весёлый результат:
            Variable_name || Value
            -------------------------||----------
            character_set_client || latin1
            character_set_connection || latin1
            character_set_database || latin1
            character_set_filesystem || binary
            character_set_results || latin1
            character_set_server || latin1
            character_set_system || utf8
            character_sets_dir || /usr/share/mysql/charsets/

            И тут я "завис" т.к. весь движок сайта на этой БД работает в нормальной кодировке.
            А я честно говоря в БД не силён.
            Может кто подскажет как поступить. Вспомнил кстати что запросы на создание моей таблицы с кодировками utf8 и cp1251 в этой БД у меня не прошёл, и чтобы не терять время я просто их создал своими "шаловливыми" ручками в кодировке cp1251_general_ci.
            Да и строка header('Content-Type: text/html; charset=UTF8'); не помогла все поля с цифрами и латиницей вписываются Ок! а кириллица нет.

            Ответить

            1. Админ 2013/11/26

              Ну если остальной сайт работает нормально с такими же таблицами - посмотри как в других скриптах соединение с БД проходит.
              Обрати внимание на другие таблицы - кодировка указана на всю таблицу, и на каждое текстовое поле в отдельности. И вот второе более приоритетно.

              Ответить

              1. Гость 2013/11/29

                Спасибо за участие. Но пришлось воспользоваться другим вариантом, правда с некоторыми изменениями (по безопасности) http://htment.hop.ru/forum/topic.php?forum=44&topic=2, и добавлением в файлы insert_data.php и get_data.php строки mysql_query("SET NAMES utf8"); и всё стало на свои места. К сожалению вашем варианте, так не получилось. Но ввод в БД конечно же необходимо делать mysql_real_escape_string или PDO.

                Ответить

                1. Админ 2013/11/29

                  Так mysql_query("SET NAMES utf8"); и предлагалось в самом начале)))

                  Ответить

                  1. Гость 2013/11/29

                    Я помню, но в предложенном варианте у Вас это не работало!!! И это факт. Причина мне не известно и наверно известна только богу MySql. :-)

                    Ответить

                    1. Админ 2013/11/30

                      Ответить

              2. Гость 2013/11/27

                Было бы не плохо если бы так всё было просто и банально. Но к сожалению нет. Это я проверил в первую очередь. В БД есть таблицы USERS где есть подобные поля. Я сравнил их данные со своими созданными, они одинаковые. К сожалению результат остался прежним ?????. И мне причина не понятна до сих пор. Думаю попробовать создать таблицу в отдельной БД, подключиться к ней, и посмотреть на результат.

                Ответить

                1. Админ 2013/11/28

                  Тогда уже сложновато будет так сказать в чём именно ошибка, не видя скриптов и БД.

                  Ответить

  13. Гость 2013/07/24

    Все отлично, все понятно, и мне очень все нравится, но есть одно но, я просто не понимаю как добавить возможность отправки файла, использовал вашу "Форма с отправкой e-mail средствами php" очень прошу, помогите, скажите что куда надо добавить? чтобы ко мне на потчу отправлялся файл. Вставка файла в html уже прописана, нужно только чтото вписать в php.
    вот html форма

    1. <form id="contFrm" action="mail.php" method="post" enctype="multipart/form-data" width="880px">
    2.  
    3. <input type="text" name="name" place="Имя" size="36" />
    4. <input type="text" name="surname" place="Фамилия" size="36" style="margin-left:10px;" />
    5. <input type="text" name="email" place="Адрес email" size="36" />
    6. <input type="text" name="tel" pre-fix="+7" place="Телефон" size="36" />
    7. <input type="text" name="city" place="Город" size="36" />
    8. <input type="text" name="url" pre-fix="http://" place="Ссылка на ваш профиль в соц. сети" size="36" />
    9. <center>
    10.  
    11. <input type="file" value="Загрузить бланк" name="file">
    12. <input type="submit" value="Отправить" name="submit">
    13. <input type="reset" value="Очистить форму" />
    14.  
    15. </center>
    16.  
    17. </form>
    18.  
    19. А вот и сам php файл привязанный к html.
    20.  
    21. <?php
    22.  
    23. $name=$_POST['name'];
    24. $surname=$_POST['surname'];
    25. $email=$_POST['email'];
    26. $tel=$_POST['tel'];
    27. $city=$_POST['city'];
    28. $url=$_POST['url'];
    29.  
    30. $to = "cargo.stg@gmail.com";
    31.  
    32. $subject = "Новый бланк заказа";
    33. $message = "
    34. Письмо с формы отправки бланка заказа.<br /><br />
    35. Информация о клиенте:<br/><br />Имя: ".htmlspecialchars($name)."<br/><br />
    36. Фамилия: ".htmlspecialchars($surname)."<br /><br />
    37. Email: ".htmlspecialchars($email)."<br /><br />
    38. Телефон: ".htmlspecialchars($tel)."<br /><br />
    39. Город: ".htmlspecialchars($city)."<br /><br />
    40. Социальная сеть: ".htmlspecialchars($url);
    41. $headers = "From: $name $surname <$email>\r\nContent-type: text/html; charset=windows-1251 \r\n";
    42. mail ($to, $subject, $message, $headers);
    43.  
    44. ?>

    Ответить

    1. Админ 2013/07/25

      С вложением чуточку сложнее, вот статья на эту тему.
      http://php-include.ru/stati/otpravka-e-mail-s-vlozheniem

      Ответить

  14. Гость 2013/06/02

    Все работает. Правда в php я новичок, сразу бросилось в глаза переменная $_POST. По-видимому это какая-то служебная переменная, надо в нете посмотреть.

    Ответить

    1. Админ 2013/06/03

      Это суперглобальная переменная. С неё нужно работать аккуратно. так же, как и с $_GET или $_COOKIE

      Ответить

  15. Гость 2013/04/03

    Форма с отправкой e-mail средствами php
    у меня не заработала
    закачал на сервер тоже неработает
    может надо прописать почтовые протоколы сервера?

    Ответить

    1. Админ 2013/04/04

      Напиши так:

      1. $result = mail ($to, $subject, $message, $headers);
      2. print_r($result);

      и посмотри отрабатывается ли функция mail. Может ещё до неё ошибки какие-то и дело вовсе не в почте? Вывод ошибок на экран включён?
      Может в спам письмо попадает?

      Ответить

  16. Гость 2013/04/01

    Уважаемый!
    Если не сложно, опубликуйте корректно работающий код php-обработчика, позволяющий произвести отправку средствами php e-mail, содержащего некий файл ЛЮБОГО типа в качестве аттача.
    Предположим, что сами данные (name, email, message и сам file) загружаются через некоторую форму.
    (т.е. прошу к последнему опубликованному Вами примеру добавить обработку и отправку файла).
    Заранее спасибо!

    Ответить

  17. Гость 2013/03/20

    Спасибо большое! Все работает.

    Ответить

  18. Гость 2013/02/18

    А как дату и время прикрутить?

    Ответить

    1. Админ 2013/02/18

      Получить текущее время можно функцией time(), а сделать её читабельной функцией date().
      Например тут в переменной $data будет текущий час,минуты и секунды.

      1. $data = date("H:i:s", time());

      Если нужен другой формат времени - вот тут посмотрите обозначения.

      Ответить

  19. Гость 2012/06/08

    Спасибо за решение вопроса по созданию обработчика форм!


    ЗЫ, а как у Вас меню сделано ?

    Ответить

    1. Админ 2012/06/09

      Пожалуйста.
      Вот оно http://php-include.ru/stati/menyu-v-stile-imac

      Ответить

  20. Гость 2012/05/19

    не роботает.

    Ответить

    1. Гость 2013/01/20

      Всё работает. Нужно только добавлять в конце.

      Т.е. вместо:

      1. //Принимаем постовые данные
      2. $name=$_POST['name'];
      3. $surname=$_POST['surname'];
      4. $phone=$_POST['phone'];
      5.  
      6. //вывод на экран
      7. echo $name.' '.$surname.' ваш номер телефона '.$phone;


      нужно создать файл action.php с таким содержимым:
      1. <?
      2.  
      3. //Принимаем постовые данные
      4. $name=$_POST['name'];
      5. $surname=$_POST['surname'];
      6. $phone=$_POST['phone'];
      7.  
      8. //вывод на экран
      9. echo $name.' '.$surname.' ваш номер телефона '.$phone;
      10.  
      11. ?>

      Ответить

      1. Админ 2013/01/21

        Конечно. А лучше вначале писать

        Ответить

    2. Админ 2012/05/19

      Что не работает?
      Код правильный и работает. Если у вас что-то не работает-ищите у себя ошибки.

      Ответить

  21. Админ 2012/01/25

    На самом деле ничего сложного..достаточно 1 раз сделать и сразу научишься.

    Ответить

  22. Гость 2012/01/25

    Спасибо! Нашел полезную информацию. Срочно понадобилась форма ввода данных в MySQL все говорят что это просто а я в PHP чайник. Щас попробую сам сделать )))

    Ответить

Ваш комментарий успешно создан

Ваш комментарий

  • Для выделения кода оберните его в тэги <code> и </code>
  • Отметьте кредитку