Форма отправки почты несмотря на ошибки проверки - PullRequest
1 голос
/ 09 апреля 2011

Я только что создал свою первую контактную форму PHP с проверкой, и все же она отправляет электронное письмо независимо. Должно быть, я что-то пропустил. Кто-нибудь может это заметить?

<?php if($_SESSION['instance'] == '1') {

    $email = $_POST['ENQemail'];
    $firstname = $_POST['ENQfirst_name'];
    $lastname = $_POST['ENQlast_name'];
    $message = $_POST['ENQmessage'];
    $secword = $_POST['ENQsecword'];



  if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
    $ERRemail = 'invalid email address';
  }
  if (strlen($firstname < 2)) {

    $ERRfirstname = 'Please enter your first name';
  }
  if (strlen($lastname < 2)) {

    $ERRlastname = 'Please enter your surname';
  }
  if (strlen($message < 50)) {

    $ERRmessage = 'Your message must be at least 50 characters';
  }
  if ($secword == $_SESSION['instance']) {

    $ERRsecword = 'Your security word did not match the image';
  }

  else {

      $to = "enquire@divethegap.com";
  $subject = "DTG Enquiry - ".$firstname." ".$lastname ;
  $message = $message;
  $headers = "From: ".$firstname." ".$lastname." ".$email. "\r\n" .
             "Content-type: text/html" . "\r\n";

  mail($to, $subject, $message, $headers);


  }
    }
?>

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 09 апреля 2011

Внизу исправлена ​​версия логики. Вы пропустили "еще, если" с.

Также следующая строка выглядит так, как будто она должна проверять неравенство, но это зависит от вашего кода, чтобы вы знали лучше:

if ($secword == $_SESSION['instance'])

Вот полное исправление:

    <?php if($_SESSION['instance'] == '1') {

    $email = $_POST['ENQemail'];
    $firstname = $_POST['ENQfirst_name'];
    $lastname = $_POST['ENQlast_name'];
    $message = $_POST['ENQmessage'];
    $secword = $_POST['ENQsecword'];



  if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
    $ERRemail = 'invalid email address';
  }
  else if (strlen($firstname < 2)) {

    $ERRfirstname = 'Please enter your first name';
  }
  else if (strlen($lastname < 2)) {

    $ERRlastname = 'Please enter your surname';
  }
  else if (strlen($message < 50)) {

    $ERRmessage = 'Your message must be at least 50 characters';
  }
  else if ($secword == $_SESSION['instance']) {

    $ERRsecword = 'Your security word did not match the image';
  }

  else {

      $to = "enquire@divethegap.com";
  $subject = "DTG Enquiry - ".$firstname." ".$lastname ;
  $message = $message;
  $headers = "From: ".$firstname." ".$lastname." ".$email. "\r\n" .
             "Content-type: text/html" . "\r\n";

  mail($to, $subject, $message, $headers);


  }
    }
?>
0 голосов
/ 09 апреля 2011

Оператор else, который содержит код отправки электронного письма, связан только с оператором предыдущий if.Это означает, что единственный раз, когда он будет не вызван, это если $secword == $_SESSION['instance'] оценивается как false.Не имеет значения, успешны ли другие проверки правильности или нет.

Одна стратегия состоит в том, чтобы отслеживать все ошибки, которые произошли, сохраняя их в массиве.Если массив пуст, то вы знаете, что все поля в порядке и отправка электронного письма безопасна:

$errors = array();
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
  $errors[] = 'invalid email address';
}
if (strlen($firstname < 2)) {
  $errors[] = 'Please enter your first name';
}
//...

if (count($errors) == 0){
  //send the email
  mail(...);
} else {
  //display the error messages
}

В противном случае ваш код выглядит довольно хорошо!Вот некоторые другие предложения:

  • Чтобы использовать сеансы в PHP, вы должны сначала вызвать функцию session_start().Это должно быть самое первое, что делает ваш PHP-скрипт.

  • Функция ereg() устарела в последней версии PHP.Это означает, что функция может быть удалена в будущей версии PHP.Вместо этого рекомендуется использовать функцию preg_match() (обратите внимание, что при preg_match() строка регулярного выражения должна начинаться и заканчиваться символом /).

0 голосов
/ 09 апреля 2011

Вы делаете все проверки независимо друг от друга, и вы отправляете электронное письмо, если изображение безопасности правильное, независимо от того, прошла ли проверка все остальное или нет, потому что ваш else для отправки электронного письма совпадает с if ($secword == $_SESSION['instance']) {

Вы можете выполнить одно из следующих действий:

  1. Изменить все if с, но первый, на elseif с, чтобы только если для всех проверок будет введен последний else (который отправляет электронное письмо)

    if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
        $ERRemail = 'invalid email address';
    }
    elseif (strlen($firstname < 2)) {
        $ERRfirstname = 'Please enter your first name';
    }
    elseif (strlen($lastname < 2)) {
        $ERRlastname = 'Please enter your surname';
    }
    elseif (strlen($message < 50)) {
        $ERRmessage = 'Your message must be at least 50 characters';
    }
    elseif ($secword == $_SESSION['instance']) {
        $ERRsecword = 'Your security word did not match the image';
    }
    else {
      $to = "enquire@divethegap.com";
      $subject = "DTG Enquiry - ".$firstname." ".$lastname ;
      $message = $message;
      $headers = "From: ".$firstname." ".$lastname." ".$email. "\r\n" . "Content-type: text/html" . "\r\n";
    
      mail($to, $subject, $message, $headers);
    }
    
  2. Установите флажок, указывающий, не прошла ли какая-либо проверка.И в конце, отправьте электронное письмо только если все получилось:

    $isValid = true;
    
    if(invalidEmail){
        $isValid =false;
    }
    
    if(invalidName){
        $isValid =false;
    }
    
    //finally send mail if all validation passed
    if($isValid) {
       //send email
    }
    
...