2016-12-20 2 views
0

Мне нужно создать подтверждение для этой формы, и я не знаю, как это сделать правильно.Проверка формы (PHP)

<?php 
$errName = ''; 
$errEmail = ''; 
$errMessage = ''; 
$result = ''; 

if (isset($_POST["submit"])) { 
    $name = $_POST['name']; 
    $email = $_POST['email']; 
    $message = $_POST['message']; 
    $from = '[email protected]'; 
    $to = '[email protected]'; 
    $subject = 'Form'; 

    $body = "Name: $name \n E-mail: $email \n Message: $message"; 
} 

if (!$_POST['name']) { 
    $errName = 'Write Name here.'; 
} 

if (!$_POST['email'] || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
    $errEmail = 'Write correct e-mail'; 
} 

if (!$_POST['message']) { 
    $errMessage = 'Write your message'; 
} 

if (!$errName && !$errEmail && !$errMessage) { 
    if (mail ($to, $subject, $body, $from)) { 
     $result = "<div style='color:white;font-size:15px;font-weight:700;'>Your message has been sent.</div>"; 
    } else { 
     $result = "<div style='color:red;font-size:15px;font-weight:700;'>Your message has not been sent, try again!</div>"; 
    } 

} 

?> 

Форма работает правильно, но если в качестве примера я не буду писать одну вещь, нет ошибки, сообщение просто не отправлено. Какие-нибудь идеи, что не так?

+2

Ну в первую очередь. Подтвердите данные ПЕРЕД загрузкой в ​​переменные – RiggsFolly

+0

Что вы имеете в виду? – d4vinc1

+0

Если вы хотите увидеть свои ошибки Добавьте [отчет об ошибках] (http://stackoverflow.com/questions/845021/how-to-get-useful-error-messages-in-php/845025#845025) на наверх ваших файлов _while testing_ сразу после открытия PHP-тега, например, ' RiggsFolly

ответ

0

Проблема, которую я вижу с вашим исходным кодом, состоит в том, что переменные, содержащие сообщение об ошибке ($ errName, $ errEmail, $ errMessage), никогда нигде не повторяются. Они просто проверяются, если они содержат какой-либо контент, и если ни один из них не выполняет этого, вызывается функция почты, иначе ничего.

Я считаю, что лучшим подходом к этому было бы использование блока try/catch. Ваш подход продолжает проверять действительные переменные, даже если предыдущая переменная уже не прошла проверку, и из-за этого почта будет предотвращена. В этом приложении пара дополнительных простых проверок не будет составлять ничего значительного, ресурсосберегающего. Но в более широком применении это хорошая идея не тратить ресурсы, если вы уже знаете, что что-то сработает.

Я переписал ваш код с помощью предлагаемого блока try/catch.

<?php 

if (isset($_POST["submit"])) { 

    $name  = (string) $_POST['name']; 
    $email  = (string) $_POST['email']; 
    $message = (string) $_POST['message']; 

    $from  = '[email protected]'; 
    $to   = '[email protected]'; 
    $subject = 'Form'; 

    $body = "Name: $name \n E-mail: $email \n Message: $message"; 

    try { 

     if (!$name) { 

      throw new Exception('Write Name here.'); 

     } 

     if (!$email || !filter_var($email, FILTER_VALIDATE_EMAIL)) { 

      throw new Exception('Write correct e-mail'); 

     } 

     if (!$message) { 

      throw new Exception('Write your message'); 

     } 

     if (mail ($to, $subject, $body, $from)) { 

      $result = "<div style='color:white;font-size:15px;font-weight:700;'>Your message has been sent.</div>"; 

     } else { 

      throw new Exception("Your message has not been sent, try again!"); 

     } 

    } catch(Exception $e){ 

     $result = "<div style='color:red;font-size:15px;font-weight:700;'>" . $e->getMessage() . "</div>"; 

    } 

    echo $result; 

} 

?> 

Если переменная не проходит одну из ваших проверок, новое Исключение выдается с соответствующим сообщением об ошибке. Это останавливает дальнейшее выполнение в блоке try и перемещает выполнение в блок catch. Переменная $ result заполняется вашим стилизованным сообщением об ошибке, которое получает echo'd в конце. Аналогично, если почта успешно отправлена, переменная $ result заполняется сообщением об успешности, которое получает echo'd.

+0

Большое вам спасибо, я запомню, что – d4vinc1

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