Вопрос по php – PHP Показывать сообщения об ошибках в порядке и повторно отображать правильные поля

2

У меня есть форма электронной почты, которая проверяет три поля: имя, действующий адрес электронной почты и комментарии. Но способ, которым он настроен сейчас, поскольку имя и комментарии находятся в одной функции, сначала проверяет имя и комментарии, даже если адрес электронной почты недействителен, как я могу переписать его, чтобы он проверял поля по порядку. Кроме того, я хотел бы повторно отобразить поля, в которых нет ошибок, поэтому пользователю не нужно вводить снова. Пожалуйста помоги. Спасибо

<?php
$myemail = "[email protected]";
$yourname = check_input($_POST['yourname'], "Enter your name!");
$email = check_input($_POST['email']);
$phone = check_input($_POST['phone']);
$subject = check_input($_POST['subject']);
$comments = check_input($_POST['comments'], "Write your comments!");

if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email))
  {
    show_error("Enter a valid E-mail address!");
  }

exit();

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

function show_error($myError)
{
?>
<!doctype html>
<html>
<body>
<form action="myform.php" method="post">
 <p style="color: red;"><b>Please correct the following error:</b><br />
 <?php echo $myError; ?></p>
 <p>Name: <input type="text" name="yourname" /></P>
 <P>Email: <input type="text" name="email" /></p>
 <P>Phone: <input type="text" name="phone" /></p><br />
 <P>Subject: <input type="text" style="width:75%;" name="subject" /></p>
 <p>Comments:<br />
 <textarea name="comments" rows="10" cols="50" style="width: 100%;"></textarea></p>
 <p><input type="submit" value="Submit"></p>
</form>
</body>
</html>
<?php
exit();
}
?>
Я попытался поместить регулярное выражение в функцию check_input, но затем это ошибка электронной почты показала независимо. Mosaic

Ваш Ответ

4   ответа
1

библиотека проверки формы, РНР & APOS; sфильтр Например, расширение предлагает проверку и дезинфекцию для некоторых типов, хотя это и не полное решение.

Если вы настаиваете на его реализации самостоятельно, вам придется рассмотреть одну проблему: порядок элементов в форме или порядок ввода пользователем в$_POST, В большинстве браузеров они должны быть одинаковыми, но не существует стандарта, обеспечивающего это. Если вы хотите выйти из порядка формы, вам нужно определить структуру формы в одном месте и использовать эту информацию для таких вещей, как создание или проверка формы (следствиеНе повторяйте себя (СУХОЙ) принцип). Итерация по соответствующей структуре даст вам желаемый порядок: циклический переход по форме дает вам порядок формы, тогда как циклический переход по форме$_POST дает вам порядок ввода пользователя.

Похоже, вы хотите больше, чем просто проверить данные; Вы также хотите подготовить его к использованию, процесс под названием «санитарная обработка».

Когда дело доходит до санитарной обработки, определите различные виды дезинфицирующих средств, а не одинcheck_input функция. Конкретными дезинфицирующими средствами могут быть функции или объекты с__invoke метод. Создайте карту полей формы для дезинфицирующих средств (например, массив входного имени для обратных вызовов sanitizer). Порядок элементов в отображении устанавливает порядок санации; если вы используете единую структуру для определения информации о форме, порядок отображения и порядок очистки будут одинаковыми.

Вот очень общая схема:

# $fields could be form structure or user input
foreach ($fields as $name => $data) {
    # sanitize dispatches to the appropriate sanitizer for the given field name
    $form->sanitize($name, $data);
    # or:
    //sanitize($name, $data);
    # or however you choose to structure your sanitization dispatch mechanism
}

Что касается установки входного значения для предоставленных пользователем данных, просто выведите значение элемента при выводе элемента. Как и для любого пользовательского ввода (на самом деле, для всех форматированных выходных данных), правильно экранируйте данные при их выводе. Для атрибутов HTML это означает использование (например,)htmlspecialchars, Обратите внимание, что вы должны избегать только исходящих данных. Это означает, что ваши функции очистки не должны вызыватьhtmlspecialchars.

Вы можете улучшить удобство использования, поместив каждую ошибку рядом с соответствующим вводом, добавив & quot; error & quot; Класс для элемента и стиль «ошибка» класс, чтобы выделить его. Улучшить доступность путем упаковки<label> элементы вокруг текста метки.

Error: User Rate Limit Exceeded Mosaic
1

<?php
$errors = array();

if (isset($_POST['send'])) {
    // check data validity
    if (!mailValid($_POST['email']))
        $errors[] = 'Mail is not valid';
    ...

    // send data by email
    if (!$errors) {
        // send mail and redirect
    }
}
?>
<html>
    ...
    <?php
    if ($errors) {
        // display errors
        foreach ($errors as $error) {
            echo "$error<br />";
        }
    }
    ?>
    <form ...>
        ...
        Email: <input type="text" name="email" value="<?php echo isset($_POST['email']) ? htmlspecialchars($_POST['email']) : '' ?>" />
        ...
    </form>
    ...
</html>
1

filter_var а такжеin_array проверки:

<?php
$myemail = "[email protected]";

//Pre made errors array
$errors=array('name'=>'Enter Your name',
              'email'=>'Please enter valid email',
              'phone'=>'Please enter valid phone number',
              'subject'=>'Please enter valid subject, more then 10 chars',
              'comment'=>'Please enter valid comment, more then 10 chars');

//Allowed post params and its validation type
$types = array('name'=>'string',
               'email'=>'email',
               'phone'=>'phone',
               'subject'=>'string',
               'comment'=>'string');

//A simple val,idation function using filter_var
function validate($value,$type){
    switch ($type){
        case "email":
            return ((filter_var($value, FILTER_VALIDATE_EMAIL))?true:false);
            break;
        case "phone":
            return ((preg_match("/^[0-9]{3}-[0-9]{4}-[0-9]{4}$/", $value))?true:false);
            break;
        case "string":
            return ((strlen($value) >=10 )?true:false);
            break;

        default:
            return false;
            break;
    }
}


//If forms been posted
if(!empty($_POST) && $_SERVER['REQUEST_METHOD'] == 'POST'){
    //Assign true, if all is good then this will still be true
    $cont=true;
    $error=array();
    foreach($_POST as $key=>$value){
      //if key is in $types array
      if(in_array($key,$types)){
        //If validation true
        if(validate($value, $types[$key])==true){
            $$key=filter_var($value, FILTER_SANITIZE_STRING);
        }else{
            //Validation failed assign error and swithc cont to false
            $error[$key]=$errors[$key];
            $cont=false;
        }
      }
    }
}

if($cont==true && empty($error)){
    //Send mail / do insert ect
}else{
    //Default to form
?>
<!doctype html>
<html>
<body>
<form action="" method="post">
 <p>Name: <input type="text" name="name" value="<[email protected]($name);?>"/> <[email protected]$error['name'];?></P>
 <P>Email: <input type="text" name="email" value="<[email protected]($email);?>" /> <[email protected]$error['email'];?></p>
 <P>Phone: <input type="text" name="phone" value="<[email protected]($phone);?>"/> <[email protected]$error['phone'];?></p><br />
 <P>Subject: <input type="text" style="width:75%;" name="subject" /> <[email protected]$error['subject'];?></p>
 <p>Comments: <[email protected]$error['comment'];?><br />
 <textarea name="comment" rows="10" cols="50" style="width: 100%;"><[email protected]($comment);?></textarea></p>
 <p><input type="submit" value="Submit"></p>
</form>
</body>
</html>
<?php
}?>
5

я бы посоветовал вам проверить ВСЕ поля сразу и отобразить все соответствующие сообщения об ошибках в форме. Основная причина в том, что это может быть плохой пользовательский опыт, если им приходится отправлять вашу форму целую кучу раз, потому что они должны исправлять одну ошибку за раз. Я предпочел бы исправить свой адрес электронной почты, пароль, комментарии и выбор за одну попытку, а не исправлять одну за раз, просто чтобы показать, что является следующей ошибкой.

Тем не менее, вот несколько советов по проверке формы, как вы хотите. Обычно я подхожу к форме, делая то, что вы хотите. Предполагается, что HTML-код вашей формы и процессор форм (PHP) находятся в одном файле (что у вас есть сейчас). Вы можете разделить два, но методы для этого могут быть немного разными.

Have one function or code block that outputs the form and is aware of your error messages and has access to the previous form input (if any). Typically, this can be left outside of a function and can be the last block of code in your PHP script. Set up an array for error messages (e.g. $errors = array()). When this array is empty, you know there were no errors with the submission Check to see if the form was submitted near the top of your script before the form is output. If the form was submitted, validate each field one at a time, if a field contained an error, add the error message to the $errors array (e.g. $errors['password'] = 'Passwords must be at least 8 characters long';) To re-populate the form inputs with the previous values, you have to store the entered values somewhere (you can either just use the $_POST array, or sanitize and assign the $_POST values to individual variables or an array. Once all the processing is done, you can check for any errors to decide whether the form can be processed at this point, or needs new input from the user. To do this, I typically do something like if (sizeof($errors) > 0) { // show messages } else { // process form } If you are re-displaying the form, you simply need to add a value="" attribute to each form element and echo the value that was submitted by the user. It is very important to escape the output using htmlspecialchars() or similar functions

С этими вещами, вот некоторые изменения вашей формы, чтобы сделать это:

<?php
$myemail = "[email protected]";
$errors  = array();
$values  = array();
$errmsg  = '';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    foreach($_POST as $key => $value) {
        $values[$key] = trim(stripslashes($value)); // basic input filter
    }

    if (check_input($values['yourname']) == false) { 
        $errors['yourname'] = 'Enter your name!';
    }

    if (check_input($values['email']) == false) {
        $errors['email'] = 'Please enter your email address.';
    } else if (!preg_match('/([\w\-]+\@[\w\-]+\.[\w\-]+)/', $values['email'])) {
        $errors['email'] = 'Invalid email address format.';
    }

    if (check_input($values['comments']) == false) {
        $errors['comments'] = 'Write your comments!';
    }

    if (sizeof($errors) == 0) {
        // you can process your for here and redirect or show a success message
        $values = array(); // empty values array
        echo "Form was OK!  Good to process...<br />";
    } else {
        // one or more errors
        foreach($errors as $error) {
            $errmsg .= $error . '<br />';
        }
    }
}

function check_input($input) {
    if (strlen($input) == 0) {
        return false;
    } else {
        // TODO: other checks?

        return true;
    }
}
?>
<!doctype html>
<html>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
 <?php if ($errmsg != ''): ?>
 <p style="color: red;"><b>Please correct the following errors:</b><br />
 <?php echo $errmsg; ?>
 </p>
 <?php endif; ?>

 <p>Name: <input type="text" name="yourname" value="<?php echo htmlspecialchars(@$values['yourname']) ?>" /></P>
 <P>Email: <input type="text" name="email" value="<?php echo htmlspecialchars(@$values['email']) ?>" /></p>
 <P>Phone: <input type="text" name="phone" value="<?php echo htmlspecialchars(@$values['phone']) ?>"/></p><br />
 <P>Subject: <input type="text" style="width:75%;" name="subject" value="<?php echo htmlspecialchars(@$values['subject']) ?>" /></p>
 <p>Comments:<br />
 <textarea name="comments" rows="10" cols="50" style="width: 100%;"><?php echo htmlspecialchars(@$values['comments']) ?></textarea></p>
 <p><input type="submit" value="Submit"></p>
</form>
</body>
</html>

У меня есть более продвинутый пример, который вы можете увидетьВот это может дать вам некоторое руководство.

Надеюсь, это поможет.

Error: User Rate Limit Exceededthumbsup :)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Mosaic

Похожие вопросы