2014-01-03 5 views
1

У меня возникли трудности с моим кодом php, который проверяет форму на самой странице перед отправкой на мой адрес электронной почты.PHP preg_match Проверка формы

Это мой PHP, который находится выше DOCTYPE HTML

<?php 
$name = $_POST['name']; 
$email = $_POST['email']; 
$subjectTitle = $_POST['subjectTitle']; 
$comment = $_POST['comment']; 
$errormsg = "Invalid Entry"; 
$validmsg = "Thank you for your message"; 

if($_POST['submit']) { 
    if(empty($_POST['name'])) {  
     $nameError = true; 
    } 
    if(empty($_POST['email'])) {   
     $emailError = true; 
    }  
    if(empty($_POST['subjectTitle'])) {  
     $subjectError = true; 
    }  
    if(empty($_POST['comment'])) { 
     $commentError = true; 
    } 
    else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {  
     $error = true;  
    }    
    else {   
     $to = "EMAIL_ADD_GOES_HERE";   
     $name = trim($_POST['name']); 
     $email = trim($_POST['email']); 
     $subjectTitle = trim($_POST['subjectTitle']); 
     $comment = trim($_POST['comment']);   
     $subject = "Contact Form Enquiry";   
     $messages = "\r\n Name: $name \r\n Email: $email \r\n Subject: $subjectTitle \r\n Comments: $comment"; 
     $headers = "From:" . $name; 
     $mailsent = mail($to, $subject, $messages, $headers);  
     if($mailsent) {   
      $sent = true; 
      $name = "";   
      $email = ""; 
      $subjectTitle = ""; 
      $comment = "";       
     }   
    } 
} 
?> 

и для моего HTML, для облегчения просмотра, я просто положить в виде части.

<html> 
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post"> 
    Name: <input type="text" name="name" id="name" value="<?php echo $name; ?>"> 
    <?php if($nameError == true) {echo $errormsg;} ?> 

    Email: <input type="text" name="email" id="email" value="<?php echo $email; ?>"> 
    <?php if($emailError == true) {echo $errormsg;} ?> 

    Subject: <input type="text" name="subjectTitle" id="subjectTitle" value="<?php echo $subjectTitle; ?>"> 
    <?php if($subjectError == true) {echo $errormsg;} ?> 

    Comments: <textarea name="comment" id="comment"><?php echo $comment; ?></textarea> 
    <?php if($commentError == true) {echo $errormsg;} ?> 
</form> 
</html> 

В моем html нет другого PHP-кода, кроме указанного выше.

Эта валидация работает только в том случае, если любое поле остается пустым. Он выведет сообщение об ошибке в самой странице и НЕ отправит электронное письмо, и именно так оно должно работать.

Однако я столкнулся с какой-то странной проблемой, которая, похоже, не может найти причину/теория/логика. Если и посмотреть на код PHP, если у меня не было, что еще, если заявление

else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {   
    $error = true; 
} 

проверка не удается, и все равно будет отправлять по электронной почте, когда ключи пользователя в текстовое поле. Например, если пользователь не заполняет имя, адрес электронной почты и тему, а только комментарии, он все равно будет отправлен. Однако, как только я поставлю этот оператор else if, он исправляет проблему.

Но главной проблемой является preg_match. Я хочу, чтобы поля имени допускали только пробел и буквы, и я хочу, чтобы поле электронной почты разрешало отправлять только электронные письма. Поэтому, когда я пытался поставить этот код в,

if (!preg_match("/^[a-zA-Z ]*$/",$name)) { 
    $nameError = true; 
} 

или расчесывать его с чеком имя пустое поле

if (empty($_POST['name']) || (!preg_match("/^[a-zA-Z ]*$/",$name))) { 
    $nameError = true;  
} 

не проверяет правильность. Он делает то, что, когда пользователь вводит номер в поле имени, а также заполняет все остальное, он отображает сообщение об ошибке, а также сообщение благодарности и отправляет его по электронной почте, что не так, как должно работать.

Могу ли я получить руководство по устранению проблемы? Я ошибаюсь в своем кодировании, а также мне хотелось бы знать, почему это другое утверждение if, которое у меня есть в php, не имеет смысла, но мне нужно, чтобы получить правильную проверку.

Большое спасибо за чтение, застряли на этом в течение последних 6 дней, и я действительно не знаю, как это исправить. Пожалуйста, помогите мне.

Приветствия

+0

Будьте последовательны. Если вы назначаете '$ name = $ _POST ['name']', тогда используйте '$ name' в остальной части кода - запутанно продолжать использовать' $ _POST'. – Barmar

+0

Установка '$ nameError' ничего не делает, остальная часть кода никогда не проверяет его. – Barmar

ответ

2

Попробуйте это.

Я сделал следующие изменения:

  • Обрежьте значения перед проверкой.
  • Используйте переменные, которые были назначены с $_POST в проверках проверки.
  • Используйте переменную $error, к которой я добавляю ошибки.
  • Используйте + вместо * в регулярном выражении, поэтому оно не будет соответствовать пустому значению, и нам не нужна явная проверка empty(). Также используйте модификатор i, чтобы сделать его нечувствительным к регистру, а не A-Za-z.
  • И самое большое важное часть: Я установил логику else if в конце. Вы делали все только empty(), если комментарий не был пустым.
<?php 
$name = trim($_POST['name']); 
$email = trim($_POST['email']); 
$subjectTitle = trim($_POST['subjectTitle']); 
$comment = trim($_POST['comment']); 

$errormsg = "Invalid Entry"; 
$validmsg = "Thank you for your message"; 
$error = ''; 

if($_POST['submit']) { 

    if(!preg_match('/^[a-z ]+$/i', $name)) { 
     $error .= 'Name missing or incorrect<br>'; 
    } 

    if(empty($email)) { 
     $error .= 'Missing email<br>'; 
    } 

    if(empty($subjectTitle)) { 
     $error .= 'Missing title<br>'; 
    } 

    if(empty($comment)) { 
     $error .= 'Missing comment<br>'; 
    } 

    if ($error) { 
     echo $error;  
    } else { 
     $to = "EMAIL_ADD_GOES_HERE"; 

     $subject = "Contact Form Enquiry"; 

     $messages = "\r\n Name: $name \r\n Email: $email \r\n Subject: $subjectTitle \r\n Comments: $comment"; 
     $headers = "From:" . $name; 
     $mailsent = mail($to, $subject, $messages, $headers); 

     if($mailsent) { 

      $sent = true; 

      $name = "";   
      $email = ""; 
      $subjectTitle = ""; 
      $comment = ""; 

     } 

    } 

} 

?> 
+0

Это работает. Огромное спасибо. – gosi123

2

изменения

else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) { 
    $error = true; 
}  
else { 

в

if (!$nameError && !$emailError && !$subjectError && !$commentError) { 

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

В качестве альтернативы вы можете установить $error = true всякий раз, когда вы устанавливаете $xyzError и тестируете только if (!$error) {.

+0

Огромное вам спасибо, я объединил это, просто сделал несколько изменений и поместил это с кодом, и он работает. Спасибо огромное! – gosi123

2

Ваша первая проблема в том, что вы никогда не проверяете $nameError или $commentError и т. Д. ...Вы можете потерять оператор if, если вы установили $error = true; или проверили все переменные.

(я лично использую один $error, а затем добавить сообщение к одной $message переменного при выполнении этого рода вещей, но это все личные предпочтения)

Это, пожалуй, вторая проблема тоже. Вы никогда не проверяете $nameError. Также вам не нужна двойная проверка, если вы измените регулярное выражение на: /^[a-zA-Z]+$/. + вместо * говорит «1 или более символов». * означает «0 или более символов».

Для проверки электронной почты используйте filter_var() с FILTER_VALIDATE_EMAIL. См. Документы здесь: http://php.net/filter_Var

+0

Благодарим за подтверждение по электронной почте. Оно работает! – gosi123

Смежные вопросы