BloGGood.ru

Блог Костаневича Степана

WordPress, PHP, HTML, CSS, Windows

Блог на разные темы, seo-оптимизация, раскрутка сайта, создание сайта, вкусные эффекты для сайта и многое другое…

Главная » Php приемчики » Форма обратной связи с капчей на PHP

Форма обратной связи с капчей на PHP

2016-12-19 / Вр:23:25 / просмотров: 18437

Не думал писать на эту тему… Эта статья создана по просьбе одного из читателей BlogGood.ru, который оставил комментарий с просьбой написать статью о том, как на форму обратной связи установить капчу.
В статье найдете полностью готовый код , который вы сможете скачать.

Капча – это хороший способ защитить форму обратной связи, регистрации, входа в админку или в кабинет.
Эту капчу, которую я предлагаю, можно привязать к любой форме.
Вот так будет выглядеть капча и форма обратной связи:

Форма обратной связи с капчей на PHP

Форма обратной связи не отправится, пока не будет правильно введена капча (цифры на картинке).
Для реализации капчи вам нужно будет подготовить 10 изображений с цифрами 0-9 (либо скачайте их тут).

Код капчи (captcha)
Создайте файл с названием «captcha.php» и вставьте в него вот такой код:

<p>Введите числа с картинки: <br>
<?php
$i=1;
do
{
$num[$i] = mt_rand(0,9);
echo "<img src='/images/".$num[$i].".gif' border='0' align='bottom' vspace='5px'>";
$i++;
}
while ($i<6);
$captcha = $num[1].$num[2].$num[3].$num[4].$num[5];
?>
<input name="captcha" ENGINE="hidden" value="<?php echo $captcha ;?>">

Для генерации случайных чисел здесь используется php функция «mt_rand()».
Генерирует в диапазоне от 0 до 9.
После того, как сгенерировалось число, оно записывается в массив «$num()». Потом выводится соответствующее изображение и так 5 раз, благодаря циклу «while». Вот так и получаем на экран 5 цифр.
Все эти 5 цифр записываются в переменную «$captcha».
Переменная «$captcha» будет передаваться обработчику формы для проверки на соответствие цифр, что были введены в поле.

Обработчик формы и капчи (проверка и отправка данных)
Создайте файл «form-handler.php» и вставьте вот такой код:

<?php
/* Проверяем, существуют ли переменные, которые передала форма обратной связи.
Если не существуют, то мы их создаем.
Если форма передала пустые значения, мы их удаляем */
if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}}
if (isset($_POST['email'])) {$email = $_POST['email']; if ($email == '') {unset($email);}}
if (isset($_POST['message'])) {$message = $_POST['message']; if ($message == '') {unset($message);}}
if (isset($_POST['captcha_validation'])){$captcha_validation = $_POST['captcha_validation']; if ($captcha_validation == '') {unset($captcha_validation);}}
if (isset($_POST['captcha'])){$captcha = $_POST['captcha'];}

/* Проверяем, заполнены ли все поля */
if (isset($name) && isset($email) && isset($message) && isset($captcha_validation))
{

/* Проверяем правильность ввода капчи */
if ($captcha == $captcha_validation)
{

/* если капча верна, отправляем сообщение */
/* Настройки сообщения */
$address = "test@test";
$sub = "Сообщение с сайта BlogGood.ru!!!";
$mes = "Имя: $name \nE-mail: $email \nСодержание письма: \n$message";

/* Уведомление об отправке письма */
$verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = windows-1251\r\nFrom:$email");
if ($verify == 'true')
{
echo "Сообщение отправлено!";
}
else
{
echo "Сообщение не отправлено!";
}
}
else
{
echo "Вы неправильно ввели цифры с картинки";
}

}
else
{
echo "Вы заполнили не все поля!";
}
?>

В этом коде все, что касается обработки данных, проверки полей, ввода капчи и отправки самого письма.
В коде есть комментарий, где какая часть за что отвечает.
Вам только нужно поменять на свое усмотрение содержание письма и заменить обязательно мой email (test@test) на собственный (строка №21):

/* Настройки сообщения */
$address = "test@test";
$sub = "Сообщение с сайта BlogGood.ru!!!";
$mes = "Имя: $name \nE-mail: $email \nСодержание письма: \n$message";

Теперь сама форма.

Форма обратной связи с капчей
Вставьте вот этот код в то место, где нужно, чтобы выводилась форма:

<form action="form-handler.php" method="post">
<p>Введите имя:<br>
<input type="text" name="name"></p>
<p>Введите email:<br>
<input type="text" name="email"></p>
<p>Введите сообщение:<br>
<textarea name="message" cols="40" rows="5" ></textarea>
</p>
<!-- вывод капчи из файла captcha.php -->
<?php require ("captcha.php"); ?>

<input name="captcha_validation" style=" margin-bottom:11px" type="text" size="6" maxlength="5"></p>
<p><input type="submit" class="bt1" value="Отправить сообщение"></p>
</form>

Внимание: файлы «form-handler.php» и «captcha.php» должны находиться в одной папке с формой или же, если так не получается, не забываем менять путь к обработчику «form-handler.php»

<form action="form-handler.php" method="post">

И к капче

<?php require ("captcha.php"); ?>

Как правильно указать путь к файлу, читайте вот тут.

Кстати, если к форме добавить класс, то можно при помощи CSS добавить к капче различные эффекты, например, искажение (см. тут):

echo "<img src='/images/".$num[$i].".gif' border='0' align='bottom' vspace='5px' class='captcha'>";

Файл «captcha.php»

Проверим работу капчи?
Да, проверим, чтобы не было сомнений на счет работоспособности кода.
Вначале я введу в капчу неправильные цифры.

Форма обратной связи с капчей на PHP

Если нажать «Отправить сообщение», то вы увидите вот это уведомление:

Вы неправильно ввели цифры с картинки

Капча не дала нам отправить сообщение, так как была допущена ошибка при вводе цифр.
Пробуем ввести правильно капчу:

Форма обратной связи с капчей на PHP

Если нажать «Отправить сообщение», то вы увидите вот это уведомление:

Сообщение отправлено!

Проверяем почту:

Форма обратной связи с капчей на PHP

Ну, что вам сказать, все работает! Ура-а-а-а! :!:
Пользуйтесь!

Ах да, чуть бы не забыл – вы можете скачать исходник.

[скачать исходник]

Понравился пост? Помоги другим узнать об этой статье, кликни на кнопку социальных сетей ↓↓↓

Получай обновления блога!!! Подпишись:

Популярные статьи:

38 Ответов на комментарий - Форма обратной связи с капчей на PHP

  1. Александр

    Как всегда спасибо Степан за хороший и Нужный пост ! :arrow:

  2. Avatar photo Степан => автор блога

    Пожалуйста, Александр!

  3. Иван

    наверное, хорошая форма, но фокус не удался. для новичков в php желательно разъяснять более подробно что и куда необходимо записывать. согласитесь, что php-монстры не будут искать такую информацию.

  4. Avatar photo Степан => автор блога

    Я думаю, новичков в php нужно не с капчи начинать, а с основы PHP.
    Основные разъяснение по коду в статье есть.

  5. Иван

    думаю, у меня не получается из-за неправильно прописанных путей к файлам. файлы captcha.php и form-handler.php я создал в папке с темой. там же разместил папку images с изображениями цифр для капчи. перепробовал все варианты с указанием пути к файлам – бесполезно. не могли бы вы показать как должен выглядеть код

     <form action="form-handler.php" method="post"> 

    и

     echo "<img src='/images/".$num[$i].".gif' border='0' align='bottom' vspace='5px'>"; 

    в данном случае?

  6. Avatar photo Степан => автор блога

    Попробуйте вот так:

    <form action="<?php bloginfo('template_url'); ?>/form-handler.php" method="post">

    и

    echo "<img src='". bloginfo('template_url') ."/images/".$num[$i].".gif' border='0' align='bottom' vspace='5px'>";

    Если Вы пользуетесь вордпресс, тогда есть готовый плагин:
    /wordpress/zashhita-adminki-wordpress-s-pomoshhyu-kapchi.html/

  7. Николай

    Вот какую сделал я:

  8. Avatar photo Степан => автор блога

    Прикольно!
    Расскажете, Николай, как сделали или это много писать?

  9. иван

    подскажите, пожалуйста, как еще должна выглядеть строчка

     <!-- вывод капчи из файла captcha.php -->
    <?php require ("captcha.php"); ?> 

    ? файл captcha.php находится в папке с темойю капча никак не выводится :sad:

  10. Avatar photo Степан => автор блога

    Попробуйте вот так:

    <!-- вывод капчи из файла captcha.php -->
    <?php require ("wp-content/themes/НАЗВАНИЕ_ТЕМЫ/captcha.php"); ?>
    

    в коде “НАЗВАНИЕ_ТЕМЫ” – нужно поменять на название вашей темы (название папки)

  11. иван

    спасибо за помощь, но форма так и не заработала. все пути к файлам прописал, перепроверил 100 раз – не работает :sad: . у меня версия php-7.0., сайт на wp. может ли быть причина в том что версия php-7? просто у меня и раньше была реализована форма обратной связи без плагина, но когда произвел переход с 5.3 на 7.0, то форма обратной связи тоже работать перестала. однако, плагин ФОС отрабатывал нормально. просто хотел обойтись на этот раз без плагина, но видимо не судьба. :???:

  12. Avatar photo Степан => автор блога

    Это нужно мне садиться и смотреть в чем проблема. Там может быть не значительная ошибка и все, форма работать на сайте не будет.

  13. nesnayka

    Это все хорошо, но хотелось бы отметить несколько вещей.
    1. Защита формы. От кого? От того, кто и так не будет пытаться ее брутфорсить?
    Вот это:

    <input name="captcha" ENGINE="hidden" value="<?php echo $captcha ;?>">

    в форме – это же то же самое, что мы показываем в капче.
    Возникает вопрос, если скрипту, пытающемуся подобрать логин/пароль, в явном виде отдается капча, которую вставить в запрос к серверу – дело одной ф-ции, то какой смысл в этой капче?

    2. Картинки для цифр.
    Они должны генерироваться каждый раз разные. Иначе скачав их однажды и получив их текстовое представление (в base64) скрипт сможет, сравнивая то, что выводит форма, с уже имеющимися данными, подставлять цифры, которым эти картинки соответствуют.

    Вывод: Цель, для которой используется капча – защита от автоотправки формы – не достигнута.

    По сути, что нужно:
    1. Не выводить в форме код в явном виде (хранить его в сессионных переменных).
    2. Генерировать каждый раз разные изображения.

    Если интересно, могу выложить готовый код капчи с пользовательскими настройками, не страдающей перечисленными выше недостатками. :smile:

    PS.
    Что еще хотелось бы отметить, так это немного неправильную организацию условий. В таком количестве вложенных if’ов с else, почти нереально понять, что к чему относится.
    Вместо

    if(isset([переменная])){
    if(isset([переменная])){
    if(isset([переменная])){
    ...
    }else{
    echo [что-то];
    }
    }else{
    echo [что-то];
    }
    }else{
    echo [что-то];
    }
    

    в данном случае гораздо лучше смотрелось бы

    if(!isset([переменная])){
    echo [что-то];
    exit();
    }
    if(!isset([переменная])){
    echo [что-то];
    exit();
    }
    if(!isset([переменная])){
    echo [что-то];
    exit();
    }
    ...
    
  14. Александр

    Степан, здравствуйте!
    Помогите, пожалуйста, разобраться.

    Сделал все, как в примере, но при нажатии на кнопку “отправить сообщение” постоянно выдается “сообщение не отправлено”.
    Не могу понять в чем дело.

    код формы на странице feedback.php:

    <form action="form-handler.php" method="post">
    <p><input ENGINE="text" name="name" /><b> Введите имя*</b></p>
    <p><input type="text" name="email" /><b> Введите email*</b></p>
    <p><input type="text" name="subj" /> <b>Тема сообщения</b></p>
    <p><b>Введите сообщение:</b><br>
    <textarea name="message" cols="40" rows="5" ></textarea>
    </p>
    
    <?php require ("captcha.php"); ?>
    
    <input name="captcha_validation" style=" margin-bottom:11px" type="text" size="6" maxlength="5"></p>
    <p><input type="submit" class="bt1" value="Отправить сообщение"></p>
    </form>
    
    
    

    код на странице form-handler.php:

    <?php
    /* Проверяем существуют ли переменные, которые передала форма обратной связи. 
       Если не существуют, то мы их создаем.
       Если форма передала пустые значения мы их удаляем */
    if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}}
    if (isset($_POST['email'])) {$email = $_POST['email']; if ($email == '') {unset($email);}}
    if (isset($_POST['subj'])) {$subj = $_POST['subj']; if ($subj == '') {unset($subj);}}
    if (isset($_POST['message'])) {$message = $_POST['message']; if ($message == '') {unset($message);}}
    if (isset($_POST['captcha_validation'])){$captcha_validation = $_POST['captcha_validation']; if ($captcha_validation == '') {unset($captcha_validation);}}
    if (isset($_POST['captcha'])){$captcha = $_POST['captcha'];}
    
     
    
    /* Проверяем заполнены ли все поля */
    if (isset($name) && isset($email) && isset($subj) && isset($message) && isset($captcha_validation))
    {
    
    /* Проверяем правильность ввода капчи */
      if ($captcha == $captcha_validation)
      {
    	  
    /* если капча верна, отправляем сообщение */
    /* Настройки сообщения */
    $address = "ххххххххххх@yandex.ru";
    $sub = "Сообщение с сайта hvatay-skidku.ru!";
    $mes = "Имя: $name \nE-mail: $email \nТема: $subj \nСодержание письма: \n$message";
    
    /* Уведомление об отправки письма */
    $verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = windows-1251\r\nFrom:$email");
          if ($verify == 'true')
          {
           echo "Сообщение отправлено!";
          }
          else 
    	  {
    	  echo "Сообщение не отправлено!";
    	  }
      }
      else
      {
      echo "Вы не правильно ввели цифры с картинки";
      }
     
    
    }
    else
    {
    echo "Вы заполнили не все поля!";
    }
    ?>
    
  15. Avatar photo Степан => автор блога

    Здравствуйте, Александр!
    Вы не полностью сделали как на примере. У меня нет поля “Тема сообщения”.
    По началу я думал, что вы не прописали переменную в обработчике. Но все вижу, что сделано корректно и правильно.
    Проверил Ваш код у себя, у меня отправка письма идет. Очень странно.
    Тут я вижу без бубна не обойтись. Я мог бы глянуть у вас на сайте, но мне нужны будут доступы и время.

  16. Александр

    Степан, здравствуйте!
    Я разобрался, функция отправки почты php mail ( ) была отключена, поэтому не работала форма обратной связи.

  17. Sergio

    Спасибочки! Все отлично работает.

  18. Alex

    Привет!
    Спасибо большое за капчу. Жил себе блог 7 лет, и тут на тебе – повалился спам на почту через форму… Ну и пришлось воспользоваться твоим решением – теперь снова всё ок.

  19. Avatar photo Степан => автор блога

    Здравствуйте! Пожалуйста!
    Если вдруг снова СПАМ появится, попробуйте “reCAPTCHA”

  20. Антон

    Здравствуйте, Степан! Отличный скрипт. Есть маленький вопрос, картинка капчи немного выше формы её ввода, их как-то можно разместить в одну линию? Спасибо!

  21. Avatar photo Степан => автор блога

    Здравствуйте, Антон!
    Установите код и дайте мне ссылку.
    Я вам скажу далее, что прописать в CSS, чтобы капча спустилась ниже.

  22. Антон

    Код установил

  23. Avatar photo Степан => автор блога

    В CSS пропишите:

    img.captcha {
        margin-bottom: 5px;
    }
    
  24. Серега

    Всё сделал точь в точь, но почему-то картинки для капчи не отображаются в форме :| Папка с картинками находится в корневой директории, так же как и всё остальное…

  25. Avatar photo Степан => автор блога

    Вы для вордпресса хотите вставить капчу?

  26. Серега

    Нет, вообще без CMS. Капча для статичной страницы.

  27. Alex

    Здравствуйте! А как прикрутить кнопку обновления к вашей капче?

  28. Avatar photo Степан => автор блога

    перепроверьте название папки, где лежат картинки. Папка должна называться “images”.
    А лучше, дайте ссылку, где Вы установили капчу, я посмотрю в исходном коде.

  29. Avatar photo Степан => автор блога

    Здравствуйте! Вы можете воспользоваться событиями HTML5

  30. Олег

    Добрый день, вопрос картинки с изображениями не понял в какую папку сохранять , не увидел путь к изображениям. Спасибо

  31. Avatar photo Степан => автор блога

    Здравствуйте, Олег!
    Пункт №7:

    <img src='/images/".$num[$i].".gif'

    то есть, в корневую папку “images”

  32. Саша

    Здравствуйте! У Вас ссылка на изображения с цифрами битая – ведет на ya.ru можете исправить?

  33. Avatar photo Степан => автор блога

    Здравствуйте. Спасибо, исправил!

  34. Fotinia

    Здравствуйте. Всё работает, спасибо. А как можно добавить к форме возможность прицепить файл (текстовый или картинку)?

  35. Марк

    Здравствуйте, у вас папки zip пустые.

  36. Avatar photo Степан => автор блога

    Здравствуйте.
    Это у Вас что-то с архиватором.

  37. Николай

    Здравствуйте.
    Форма обратной связи
    Двеннадцатая строка, закрывающий тег зачем?

  38. Avatar photo Степан => автор блога

    Здравствуйте.
    Конкретней, в каком коде?
    Если Вы про это “?>”, тогда откройте основы php.
    Можно обойтись и “echo” было, но зачем…

Добавить комментарий

;-) :| :x :twisted: :smokes: :smile: :shock: :sad: :rose: :roll: :razz: :pop-corne: :oops: :o :mrgreen: :lol: :idea: :grin: :gazeta: :evil: :cry: :cool: :coffe: :arrow: :???: :?: :!:

Чтобы добавить в комментарий код HTML, PHP, CSS, JavaScript, нужно сделать так: [code] ваш код [/code]

Метки: , ,

Мои цели на 2018-2019:

1). Закончить тему «Bootstrap»

2). Закончить тему «Все про PHP и MySQL»

3). Создать портфолио и мини интернет-магазин шаблонов

4). Довести количество статей до 800

5). Добиться посещаемости 3000 человек/сутки

6). Увеличить число подписчиков до 250

Статистика по блогу

Количество записей на блоге: 810
Количество страниц на блоге: 20
Количество рубрик на блоге: 28
Количество меток на блоге: 72
Количество комментариев на блоге: 4716