2015-09-10 3 views
1

Я пытаюсь отправить основную форму контакта с помощью PHPMailer.Как объединить проверку формы и phpmailer ...?

Эта форма работает для меня:

<?php 

$first_name = $_POST['first-name']; 
$last_name = $_POST['last-name']; 
$email = $_POST['email']; 
$message = nl2br($_POST['message']); 

require 'PHPMailerAutoload.php'; 

$mail = new PHPMailer; 

//$mail->SMTPDebug = 3;        // Enable verbose debug output 

$mail->isSMTP();          // Set mailer to use SMTP 
$mail->Host = ''; // Specify main and backup SMTP servers 
$mail->SMTPAuth = true;        // Enable SMTP authentication 
$mail->Username = '';     // SMTP username 
$mail->Password = '';       // SMTP password 
$mail->SMTPSecure = 'tls';       // Enable TLS encryption, `ssl` also accepted 
$mail->Port = 587; 

$mail->addReplyTo($email, $first_name); 
$mail->addAddress($email, $first_name); 
$mail->addAddress('[email protected]', 'Staff'); 
$mail->From = '[email protected]'; 
$mail->FromName = 'Staff'; 


$mail->isHTML(true);         // Set email format to HTML 

$mail->Subject = 'Hotel Room Request'; 
$mail->Body = $message; 

$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; 

if(!$mail->send()) { 
    header('location: a_url_here'); 

} else { 
    header('location: a_url_here'); 

} 

Теперь я пытаюсь объединить его с проверки ошибок. Не знаю, как объединить его и по-прежнему заставить его работать. Это то, что у меня есть до сих пор, и это пропущено при подаче. Я не был уверен, где поставить функцию check_input, поэтому я помещаю ее в другую часть внизу. Как я могу сделать эту форму функциональной, поэтому она не только проверяет вход пользователя, но и отправляет его по электронной почте?

<?php 

$first_name = check_input($_POST['first-name'], "Please enter your name"); 
$last_name = check_input($_POST['last-name'], "Please enter your last name"); 
$email = check_input($_POST['email'], "Please enter your email address"); 
$message = check_input(nl2br($_POST['message']), "Please enter your message"); 


require 'PHPMailerAutoload.php'; 

$mail = new PHPMailer; 

//$mail->SMTPDebug = 3;        // Enable verbose debug output 

$mail->isSMTP();          // Set mailer to use SMTP 
$mail->Host = ''; // Specify main and backup SMTP servers 
$mail->SMTPAuth = true;        // Enable SMTP authentication 
$mail->Username = '';     // SMTP username 
$mail->Password = '';       // SMTP password 
$mail->SMTPSecure = 'tls';       // Enable TLS encryption, `ssl` also accepted 
$mail->Port = 587; 

$mail->addReplyTo($email, $first_name); 
$mail->addAddress($email, $first_name); 
$mail->addAddress('[email protected]', 'Staff'); 
$mail->From = '[email protected]'; 
$mail->FromName = 'Staff'; 


$mail->isHTML(true);         // Set email format to HTML 

$mail->Subject = 'Hotel Room Request'; 
$mail->Body = $message; 

$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; 

if(!$mail->send()) { 
    header('location: a_url_here'); 

} else { 

     function check_input($data, $problem = ' ') 
     { 
      $data = trim($data); 
      $data = stripslashes($data); 
      $data = htmlspecialchars($data); 
      if ($problem && strlen($data) == 0) 
      { 
       show_error($problem); 
      } 
      return $data; 
      } 

} 
?> 

ответ

1

Создать так называемый validator класс:

class Validator { 

    // set of rules for validator 
    // syntax: <field-name> => '<list-of-rules, joined-with-pipe>', 
    protected $rules = [ 
     'first-name' => 'required', 
     'last-name' => 'required', 
     'message' => 'required', 
     'email' => 'required|email', 
    ]; 

    // message to show if concrete field-rule failed 
    // ":field" will be replaced with field actual name 
    protected $messages = [ 
     'required' => 'Field :field is required', 
     'nonzero' => 'Field :field must not be zero' 
     'email' => 'Field :field must represent an emai address' 
    ]; 

    protected $errors; 

    // call this to validate provided $input 
    function validate($input) { 

     $errors = []; 

     // for each defined field-ruleset 
     foreach ($this->rules as $field => $rules) { 
      $rules = explode('|', $rules); 
      // for each rule 
      foreach ($rules as $rule) 
       // call function with name "checkNameofrule" 
       if (!$this->{"check" . ucfirst($rule)}($input, $field)) 
        // memorize error, if any 
        $errors[$field][] = $this->error($field, $rule); 
     } 

     // validation passed if there are no errors 
     return !($this->errors = $errors); 
    } 

    function errors() { 
     return $this->errors; 
    } 

    function error($field, $error) { 
     return str_replace(':field', $field, $this->messages[$field]); 
    } 

    // check for required fields 
    function checkRequired($input, $field) { 
     if (!isset($input[$field])) 
      return false; 

     return trim(htmlspecialchars(stripslashes($input[$field]))) != ''; 
    } 

    // check for valid email 
    function checkEmail($input, $field) { 
     return !!preg_match('#[email protected][^.]+\..+#', @$input[$field]); 
    } 

    // other custom checks 
    function checkNonzero($input, $field) { 
     return intval(@$input[$field]) != 0; 
    } 

} 

И использовать его как это:

$validator = new Validator(); 

// validating... 
if (!$validator->validate($_POST)) { 
    // looks like there are errors in input 

    echo "<div class=\"errors\">"; 
    echo "<b>Looks like you have errors in input:</b><br />"; 
    foreach ($validator->errors() as $field => $errors) { 
     foreach ($errors as $error) 
      echo "<p>{$error}</p>"; 
    } 
    echo "</div>"; 

} else { 

    // input had passed validation, send email... 

    require 'PHPMailerAutoload.php'; 

    $mail = new PHPMailer; 

    ... 

    if(!$mail->send()) { 
     header('location: a_url_here'); 
    } else { 
     header('location: a_url_here'); 
    } 

} 
0

Вы не должны проверять и визуализации формы в одном файле. Это приводит к плохой ремонтопригодности и смелому исполнению обязанностей. Попробуйте структурировать свой проект следующим образом:

form.php 
validate-and-send.php 

Форма содержит <form action=validate-and-send.php ...><input .... В другом файле содержится логика для проверки и отправки. Что-то вроде этого:

<?php 
$email = filter_var($_REQUEST['email'], FILTER_VALIDATE_EMAIL); 

if ($email) { 
    .... 
} 

if (/*all fields valid*/) { 
    // phpmailer code 
} else { 
    // redirect back to form 
} 

Сложная часть перенаправляется обратно в форму. Вы можете перенаправить с заголовком и установить все допустимые поля через get-parameters Location form.php?name=validname, или вы можете записать их в $ _SESSION и вывести их в форме из сеанса.

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

1. form.submit() -> ajax -> validate-and-send.php 
2a. validate-and-send.php -> "OK" -> form.php 
2b. validate-and-send.php -> JSON: { errors: [ {reason: "bad name"}, {reason: "bad email"}]} 
     -> form.php 
3. Display what happened with JS. 
Смежные вопросы