Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2017, 22:53   #1
Pa-X-an
 
Регистрация: 15.01.2017
Сообщений: 9
По умолчанию Помогите вставить Капчу.

Друзья! В рнр не силен, поэтому прошу помощи профессионалов!

есть такой скрипт формы обратной связи:

Код:

<?php

// Шаблон для проверки формата E-mail
$pat = '^([a-z0-9\._\-]+)@([a-z0-9\.\-]+)(\.[a-z]{2,})$';

// Шаблон для проверки формата телефон
$pat1 = '^[0-9\._ \(\)\+-]{7,}$';

// Шаблон для проверки имени (инверсный!)
$txt_pat = "/[^0-9a-z '\.A-ZА-Яа-я--]/";
$tomail="email@email.ru"; $PROJ_NAME="с сайта ****.ru";


if (isset($_POST['spam'])) {$spam = $_POST['spam'];}

// Если массив POST не пустой, отправка состоялась
if (!empty($_POST) && !isset($sent)) {
  // «Распаковываем» массив POST и отсекаем пробельные символы
  foreach ($_POST as $var=>$val)
    // ...но проверяем, не подсунули ли нам поле с адресом
    if ($var != 'tomail') $$var = trim($val);
    // Если подсунули – прекращаем работу скрипта
    else exit;
  // Статусное сообщение. Пока оно пустое...
  $state_msg='';
  $msg_color='navy';
  // Сверяем имя с шаблоном
  $fname = (isset($fname)? preg_replace($txt_pat, '', $fname) : '');
  // Сверяем адрес E-mail с шаблоном
  $mail = ((isset($mail) && eregi($pat,$mail))? strtolower($mail) : '');
    // Сверяем телефон с шаблоном
  $phone = ((isset($phone) && eregi($pat1,$phone))? strtolower($phone) : '');
  
   $date_ = date("d.m.y"); 

  // Теперь проверяем заполнение всех полей
  
session_start();
if (isset($_SESSION["captcha"]) && $_SESSION["captcha"]===$_POST["captcha"]) echo "Текс введен верно";
else echo "Текст введен не верно";
unset($_SESSION["captcha"]);


if (empty($fname)) {
    // Если имя пустое...
    $state_msg='Введите имя.';
  
  } elseif (empty($city)) {
    // Если город пустой...
    $state_msg='Вы не ввели город';

  } elseif (empty($phone)) {
    // Если телефон пустой...
    $state_msg='Вы не ввели телефон';

  } elseif (empty($mail)) {
    // Если адрес пустой...
    $state_msg='Неверный формат (или не указан) E-mail.';

  } elseif (empty($comment)) {
    // Если сообщение пустое...
    $state_msg='Вы не ввели текст заказа/сообщения';

  } elseif (empty($spam)) /* Проверка скрытого поля */{
  
  
  //else { // Если все поля заполнены верно...



function getNumber() {
    
    $filename = 'orderNum.txt';
    $number = file_get_contents($filename);
    $number++;
    file_put_contents($filename, $number);
    return $number;
}

    // Готовим Subject письма...
    $orderNumber = getNumber();
    $subj='=?windows-1251?B?'. base64_encode('Заказ c сайта  №'.$orderNumber.' от '.$date_ ).'?=';
   
    // Готовим заголовки письма...

 // Готовим сообщение об успешной отправке...
 
    $msg_color='red';

   $state_msg='Ваш заказ/сообщение № '.$orderNumber.' от '.$date_.' отправлено.<br>
Нажмите <a href="'.$_SERVER['REQUEST_URI'].'">здесь,</a>,
чтобы отправить еще одно сообщение.';
    $user_ip=$_SERVER['REMOTE_ADDR'];
    $agent=$_SERVER['HTTP_USER_AGENT'];




    $header='From: '.$mail."\n";
    $header.='Content-Type: text/plain; charset="windows-1251"'."\n";
    $header.="Content-Transfer-Encoding: 8bit\n";
    // Собираем текст письма...
    $post_message='Обращается '.$fname."\n";
    $post_message.="E-mail:\n";
    $post_message.=''.$mail."\n";
    $post_message.='Город: '.$city."\n";
    $post_message.='Телефон: '.$phone."\n";
    $post_message.="Сообщение:\n";
    $post_message.=$comment."\n\n";
    // На всякий случай включаем IP-адрес отправителя...
    $post_message.='IP-адрес '.$user_ip."\nОтправлено ".date("d-m-Y H:i:s");
    $post_message.='  Браузер '.$agent."\n";
    // ... и наконец, отправляем письмо.
    mail($tomail,$subj,$post_message,$header);
    // А переменная $sent – признак успешной отправки.
    $sent=1;
  }
} else { // Если в массиве POST пусто, форма еще не передавалась
  // Готовим приглашение
  $msg_color='navy';
  $state_msg='Форма для заказа/сообщения.';
  // Поля имени, адреса и текста в этом случае должны быть пустыми
  $fname=$mail=$comment='';
}

// Если сообщение еще не отправлялось, выводим форму
if (!isset($sent)) $outstr='
<form method=post action="'.$_SERVER['REQUEST_URI'].'">


<table border=0>

<tr><td align=center colspan=2 style="color:'.$msg_color.'">
'.$state_msg.'</td></tr>


 
<td width=70%><input type=text name="fname" size=40 value="'.$fname.'" placeholder="Ваше Ф.И.О."></td></tr>

 
<td><input type=text name="mail" size=40 value="'.$mail.'" placeholder="E-mail "></td></tr>

 
<td><input type=text name="city" size=40 value="'.$city.'" placeholder="Город (адрес и индекс)"></td></tr>

<td><input type=text name="phone" size=40 value="'.$phone.'" placeholder="Телефон (только цифры)"></td></tr>

<td><input name="spam" type="text" style="display:none" value="" /> </td></tr> 

</table>

 

<table width=50% border=0>

<tr><td align=left valign=top> <font size="2" color="black">Ваш заказ или сообщение:</font></td></tr>
</table>

<table width=50% border=0>
<tr><td colspan=2> <textarea name=comment cols=45 rows=6 placeholder="Ваш заказ или сообщение." ></textarea>'.$comment.' </textarea>
</td></tr>

<tr>
<td> 

<input type=submit id="continue" name=subm value="Отправить">
</td>

<img src="/captcha.php" alt="Картинка" /><br />
Текст на картинке: <input type="text" name="captcha" /><br />

</form>

';
else { // А если сообщение уже отправлено...
  // Посылаем в заголовке редирект (303 Refresh) на этот же адрес
  // с задержкой на 3 секунды, чтобы пользователь увидел сообщение
     $ret_uri=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
   //  header("Refresh: 3; URL=http://".$ret_uri);
  // Выводим сообщение об отправке
  echo ("<br><br><font color=".$msg_color.">".$state_msg."</font>");

  exit;
} 

?>
Как к нему прикрутить капчу? вот такую нашел - http://www.w3box.ru/captcha/

там написано загрузить файл captcha.php и шрифт на свой сервер и вставить этот HTML код:

Код:
<form action="/check.php" method="post">
<img src="/captcha.php" alt="Картинка" /><br />
Текст на картинке: <input type="text" name="captcha" /><br />
<input type="submit" name="submit" value="Проверить" />
</form>
и этот РНР:

Код:
<?php
session_start();
if (isset($_SESSION["captcha"]) && $_SESSION["captcha"]===$_POST["captcha"]) echo "Текс введен верно";
else echo "Текст введен не верно";
unset($_SESSION["captcha"]);
?>
вот только не пойму как эти коды прикрутить к моему коду?

Буду благодарен за помощь!

Последний раз редактировалось Pa-X-an; 16.01.2017 в 02:49.
Pa-X-an вне форума Ответить с цитированием
Старый 15.01.2017, 23:08   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Понятнее, чем этот процесс описан на сайте разработчиков, пожалуй и не объяснить.
Разве что написать готовый код.
Andkorol вне форума Ответить с цитированием
Старый 16.01.2017, 02:10   #3
Pa-X-an
 
Регистрация: 15.01.2017
Сообщений: 9
По умолчанию

Вставляю код РНР в свой код и капча не срабатывает, сообщение отсылается вне зависимости от правильности ввода цифр.

Последний раз редактировалось Pa-X-an; 16.01.2017 в 03:21.
Pa-X-an вне форума Ответить с цитированием
Старый 16.01.2017, 02:17   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Я не вижу кода, в который добавлен код каптчи.
Когда будет такой код – будем искать в нём ошибки.
А пока это всё пустое «бла-бла-бла, мне на этом форуме не помогли».

P.S.: на этом форуме реально помогают только тем, кто сам хоть какие-то усилия прилагает для решения свое задачи – а не просто типа «сделайте всё за меня – а то я ничего не понимаю», таким помогают в разделе «Фриланс».

Последний раз редактировалось Andkorol; 16.01.2017 в 02:36.
Andkorol вне форума Ответить с цитированием
Старый 16.01.2017, 02:41   #5
Pa-X-an
 
Регистрация: 15.01.2017
Сообщений: 9
По умолчанию

вставил так: см. первое сообщение, выделил красным.

Последний раз редактировалось Pa-X-an; 16.01.2017 в 02:48.
Pa-X-an вне форума Ответить с цитированием
Старый 16.01.2017, 02:46   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Фразы «Текст введен верно» или «Текст введен не верно» выводятся на экран после отправки формы?
Andkorol вне форума Ответить с цитированием
Старый 16.01.2017, 02:54   #7
Pa-X-an
 
Регистрация: 15.01.2017
Сообщений: 9
По умолчанию

Да,
если ввожу неверные числа - выводится : - Ваше сообщение отправлено. Текст введен не верно.

если ввести верно - то : - Ваше сообщение отправлено. Текст введен верно.

В обоих случаях сообщение отправляется.
Pa-X-an вне форума Ответить с цитированием
Старый 16.01.2017, 03:10   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Код проверки каптчи нужно немного изменить:
PHP код:
$captcha false;
if (isset(
$_SESSION["captcha"]) && ($_SESSION["captcha"] === $_POST["captcha"])){
    
$state_msg "Текст введен верно";
    
$captcha true;
}
else {
    
$state_msg "Текст введен не верно";
}
unset(
$_SESSION["captcha"]); 
В последнее условие добавить также проверку переменной каптчи:
PHP код:
} elseif (empty($spam) && !empty($captcha)) /* Проверка скрытого поля и каптчи */
$state_msg вообще лучше сделать массивом, а не строкой – и собирать в этот массив ВСЕ ошибки при заполнении полей формы.
Это удобнее, если ошибка не одна (как может быть с каптчей + любое неверно заполненное поле) – но для этого нужны более радикальные изменения в коде.

Последний раз редактировалось Andkorol; 16.01.2017 в 03:12.
Andkorol вне форума Ответить с цитированием
Старый 16.01.2017, 03:20   #9
Pa-X-an
 
Регистрация: 15.01.2017
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Код проверки каптчи нужно немного изменить:
Спасибо большое, дружище! Заработало!
Pa-X-an вне форума Ответить с цитированием
Старый 16.01.2017, 12:50   #10
Pa-X-an
 
Регистрация: 15.01.2017
Сообщений: 9
По умолчанию

Еще вопрос возник.

Мне приходят дубликаты сообщений. Допустим несколько дней назад или даже месяц человек отправил сообщение, и после этого точно такое же сообщение мне приходит постоянно уже несколько раз. Толи человек добавил сайт в закладки и при каждом заходе повторяется сообщение, то ли еще по каким-то причинам, не могу понять.
Вы не сталкивались с такой проблемой? и как это вылечить?
Pa-X-an вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
распознать капчу D_E_N Фриланс 9 29.07.2014 00:02
Помогите вставить баннер Stripes HTML и CSS 3 30.11.2013 16:54
Сохранить капчу... Teen4jump Работа с сетью в Delphi 1 26.12.2008 21:18