Как допилить проверку email нормально

233
05 января 2018, 00:09

Здравствуйте,есть такой код:

                           
                            <!-- Contact Form -->   						 
<form id="contact" method="POST" onsubmit="this.action=window.location.href+'#contact';this.submit()"> 
 
<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> 
<p>Введіть цифри: <br> 
		<?php  
		$i=1; 
		do 
		{ 
		$num[$i] = mt_rand(0,9); 
		echo "<img src='img/".$num[$i].".gif' border='0' align='bottom' vspace='5px'>"; 
		$i++; 
		} 
		while ($i<5); 
		$captcha = $num[1].$num[2].$num[3].$num[4]; 
		?> 
<input name="captcha" type="hidden" value="<?php echo $captcha ;?>"> 
<input name="pr" style=" margin-bottom:11px" type="text" size="6" maxlength="4"></p> 
<p><input type="submit" class="bt1" value="Відправити повідомлення"></p> 
 
 
<?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['pr'])){$pr = $_POST['pr']; if ($pr == '') {unset($pr);}} 
if (isset($_POST['captcha'])){$captcha = $_POST['captcha'];} 
 
  
 
/* Проверяем заполнены ли все поля */ 
if (isset($name) && isset($email) && isset($message) && isset($pr)) 
{ 
 
/* Убираем все лишние пробелы, а также преобразуем все теги HTML в символы*/ 
$name = htmlspecialchars(trim($name)); 
$email = htmlspecialchars(trim($email)); 
$message = htmlspecialchars(trim($message)); 
 
/* Проверяем правильность ввода email-адреса */ 
if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) 
{ 
echo "<p>Невірний формат e-mail адреси!</p>"; 
} 
 
/* Проверяем правильность ввода капчи */ 
  if ($captcha == $pr) 
  { 
/* Формируем сообщение */ 
$address = "my@gmail.com"; 
$sub = "Повідомлення з site.ru"; 
$mes = "Автор: $name \nE-mail відправника: $email \nТекст листа: \n$message"; 
 
/* Отправка сообщения */ 
$verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = utf-8\r\nFrom:$email"); 
      if ($verify == 'true') 
      { 
       echo "Дякуємо! Ваше повідомлення відправлено"; 
      } 
      else  
	  { 
	  echo "Ваше повідомлення не відправлено!"; 
	  } 
  } 
  else 
  { 
  echo "Ви не вірно ввели числа"; 
  } 
} 
else 
 
   
?>

Но,его недостаток в том,что он отправляет сообщение даже если email указан без @ как это исправить ?

Answer 1

Т.к. у Вас сейчас при даже неверном email скрипт благополучно работает дальше, вам надо изменить следующее:

UPD: Лучше использовать filter_var().

/* Проверяем правильность ввода email-адреса */
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
{
    // Тут либо завершайте скрипт, либо делайте else и туда суйте следующий код.
} else {
    // А тут надо остальное ...
}

P.S. Не стоит использовать это регулярное выражение =)

Результат:

<!-- Contact Form --> 
<form id="contact" method="POST" onsubmit="this.action=window.location.href+'#contact';this.submit()"> 
 
  <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> 
  <p>Введіть цифри: <br> 
    <?php 
$i = 1; 
do { 
    $num[$i] = mt_rand(0, 9); 
    echo "<img src='img/" . $num[$i] . ".gif' border='0' align='bottom' vspace='5px'>"; 
    $i++; 
} while ($i < 5); 
$captcha = $num[1] . $num[2] . $num[3] . $num[4]; 
?> 
      <input name="captcha" type="hidden" value="<?php 
echo $captcha; 
?>"> 
      <input name="pr" style=" margin-bottom:11px" type="text" size="6" maxlength="4"></p> 
  <p><input type="submit" class="bt1" value="Відправити повідомлення"></p> 
 
 
  <?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['pr'])) { 
    $pr = $_POST['pr']; 
    if ($pr == '') { 
        unset($pr); 
    } 
} 
 
if (isset($_POST['captcha'])) { 
    $captcha = $_POST['captcha']; 
} 
 
/* Проверяем заполнены ли все поля */ 
if (isset($name) && isset($email) && isset($message) && isset($pr)) { 
     
    /* Убираем все лишние пробелы, а также преобразуем все теги HTML в символы*/ 
    $name    = htmlspecialchars(trim($name)); 
    $email   = htmlspecialchars(trim($email)); 
    $message = htmlspecialchars(trim($message)); 
     
    /* Проверяем правильность ввода email-адреса */ 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
        echo "<p>Невірний формат e-mail адреси!</p>"; 
    } else { 
// ADDED ELSE 
      /* Проверяем правильность ввода капчи */ 
      if ($captcha == $pr) { 
          /* Формируем сообщение */ 
          $address = "my@gmail.com"; 
          $sub     = "Повідомлення з site.ru"; 
          $mes     = "Автор: $name \nE-mail відправника: $email \nТекст листа: \n$message"; 
         
          /* Отправка сообщения */ 
          $verify = mail($address, $sub, $mes, "Content-type:text/plain; charset = utf-8\r\nFrom:$email"); 
          if ($verify == 'true') { 
            echo "Дякуємо! Ваше повідомлення відправлено"; 
          } else { 
              echo "Ваше повідомлення не відправлено!"; 
          } 
       } else { 
        echo "Ви не вірно ввели числа"; 
       } 
    } 
}  
     
?>

READ ALSO
Как обратиться к динамическому обьекту gtkmm

Как обратиться к динамическому обьекту gtkmm

Имеется код на C++ (бибилиотека gtkmm)mainBox наполняется обьектами типа Gtk::Label

221
Агрегация и наследование

Агрегация и наследование

Можно ли два класса одновременно связать путем агрегации и наследования?

188
Заполнить масив обьектов из файла

Заполнить масив обьектов из файла

Задача Нужно чтобы был в файлике был список студентов и производить с ними операции добавлять студентов удалять и тпНе знаю как лучше сделать...

242
Ошибка Stack around the variable was corrupted

Ошибка Stack around the variable was corrupted

Передо мной постала простая задача в заданой строке вставить некоторое количество пробелов между словами чтобы длина строки была 60 символовНо...

245