Отображение ошибки веб-формы PHP - PullRequest
0 голосов
/ 12 ноября 2011

Я новичок в PHP. У меня есть следующий код для веб-формы. Он отлично работает, как есть, но я хотел бы сделать следующее:

  1. Возвращать ошибки в виде массива (?), Чтобы я мог отображать ошибки в виде отдельных строк под каждым входом.

и

  1. Запретить возможность отправки формы дважды.

Любая помощь будет принята с благодарностью.

<form id="form1"  method="post" action="<?= $_SERVER['PHP_SELF'] ?>">
<fieldset>
<legend>Contact Me</legend> 
<?php 


    if (isset($_POST['Submit'])) {  

        if ($_POST['firstname'] != "") {  
            $_POST['firstname'] = filter_var($_POST['firstname'], FILTER_SANITIZE_STRING);  
            if ($_POST['firstname'] == "") {  
                $errors .= 'Please enter a valid first name.<br/><br/>';  
            }  
        } else {  
            $errors .= 'Please enter your first name.<br/>';  
        }

           if ($_POST['lastname'] != "") {  
            $_POST['lastname'] = filter_var($_POST['lastname'], FILTER_SANITIZE_STRING);  
            if ($_POST['lastname'] == "") {  
                $errors .= 'Please enter a valid last name.<br/><br/>';  
            }  
        } else {  
            $errors .= 'Please enter your last name.<br/>';  
        }  

        if ($_POST['email'] != "") {  
            $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);  
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {  
                $errors .= "$email is <strong>NOT</strong> a valid email address.<br/><br/>";  
            }  
        } else {  
            $errors .= 'Please enter your email address.<br/>';  
        }  


        if ($_POST['message'] != "") {  
            $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);  
            if ($_POST['message'] == "") {  
                $errors .= 'Please enter a message to send.<br/>';  
            }  
        } else {  
            $errors .= 'Please enter a message to send.<br/>';  
        }  

        if (!$errors) {  
            $mail_to = '***@****.com';  
            $subject = 'New Mail from Web Site';  
            $message  = 'From: ' . $_POST['firstname'] . " " .  $_POST['lastname'] . "\n";  
            $message .= 'Email: ' . $_POST['email'] . "\n";                   
            $message .= "Message:\n" . $_POST['message'] . "\n\n";  
            mail($mail_to, $subject, $message);  

            echo "<p>Thank you for your email!<br/><br/></p>";  
        } else {  
            echo '<div style="color: #00CC00">' . $errors . '<br/></div>';  
        }  
    }

?>  

<label>First Name:</label>   
<input type="text" name="firstname" value="<?php echo $_POST['firstname']; ?>" size="50" />

<label>Last Name:</label>  
<input type="text" name="lastname" value="<?php echo $_POST['lastname']; ?>" size="50" />    
<label>Email Address:</label>  
<input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/>    
<label>Message:</label>  
<textarea name="message" rows="5" cols="50"><?php echo $_POST['message']; ?></textarea>  
<br/>  
<input type="submit" class="moveright" name="Submit" value="Submit" /> 
</fieldset> 
</form> 

Ответы [ 3 ]

2 голосов
/ 12 ноября 2011

Вместо добавления каждой ошибки в строку, сделайте следующее: $ errors [] = 'текст ошибки';

РЕДАКТИРОВАТЬ: как уже говорили другие, хорошей практикой является инициализация массива перед началом установки значений, например, так: $ errors = array ();

Что касается запрета на отправку формы дважды, для этого требуется JavaScript. Вот ссылка на помощь: http://www.webmasterworld.com/forum91/3781.htm

2 голосов
/ 12 ноября 2011

Вы можете использовать массив для ошибок вместо того, чтобы объединять их в одну строку.Затем вы можете проверить каждую ошибку на указанном входе формы.

Пример проверки ошибок

// instead of: $errors .= 'Please enter a message to send.<br/>';
if ($_POST['message'] == "")
    $errors['message'] = 'Please enter a message to send.<br/>';

Пример отображения ошибок

<label>Message:</label>
<?php if ($errors['message'] != "") echo $errors['message']; ?>
<textarea name="message" rows="5" cols="50"><?php echo $_POST['message']; ?></textarea>  
1 голос
/ 12 ноября 2011

Чтобы превратить ваши ошибки в массив, инициализируйте его перед обработкой формы следующим образом:

$errors = array();
if (isset($_POST['Submit'])) {  
...

Каждый раз, когда возникает ошибка, вместо того, чтобы объединять ее с .=, используйте синтаксис добавления массива []:

$errors[] = 'Please enter a message to send.'; 

Чтобы форма не отправлялась дважды, мы часто используем переменную в $_SESSION, чтобы указать, что она была заполнена. При успешной отправке установите флаг $_SESSION['success']. Не забудьте также инициализировать сеанс в начале скрипта:

session_start();
$_SESSION['success'] = FALSE;
$errors = array();

// Only process the form if the session flag isn't set:
if (isset($_POST['Submit']) && !$_SESSION['success']) {  
...
// Later, on success, 
echo "<p>Thank you for your email!<br/><br/></p>";  
// Set the flag to prevent resubmission.
$_SESSION['success'] = TRUE;
...