Как не просить пользователя заполнить все поля формы, когда в одном поле есть ошибка - PullRequest
0 голосов
/ 09 апреля 2020

Новичок в php, буду признателен за вашу помощь с этим:

Я создал скрипт формы регистрации для проверки ввода пользователя с помощью нескольких обработчиков ошибок. (проверьте правильность повторного ввода адреса электронной почты, pwd и pwd и т. д. c).

Если пользователь заполнил все поля, но в одном было сообщение об ошибке (не удалось передать обработчик ошибок), я хотел отправить обратно другие поля в той же форме, чтобы пользователю не пришлось заново заполнять их. Так что, если пароли не совпадают, я хочу перезагрузить ту же страницу, но с другой заполненной областью.

Я могу видеть информацию в URL страницы, но не в полях формы. ниже моей формы HTML

<div class="register-content">
                <form action="includes/signup.inc.php" method="POST" class="margin-bottom-0">
                    <label class="control-label">Name <span class="text-danger">*</span></label>
                    <div class="row row-space-10">
                        <div class="col-md-6 m-b-15">
                            <input type="text" name="uFirst" class="form-control" placeholder="First name" required />
                        </div>
                        <div class="col-md-6 m-b-15">
                            <input type="text" name="uLast" class="form-control" placeholder="Last name" required />
                        </div>
                    </div>

                    <label class="control-label">Username <span class="text-danger">*</span></label>
                    <div class="row m-b-15">
                        <div class="col-md-12">
                            <input type="text" name="uName" class="form-control" placeholder="Username" required />
                        </div>
                    </div>

                    <label class="control-label">Email <span class="text-danger">*</span></label>
                    <div class="row m-b-15">
                        <div class="col-md-12">
                            <input type="text" name="mail" class="form-control" placeholder="Email address" required />
                        </div>
                    </div>


                    <label class="control-label">Password <span class="text-danger">*</span></label>
                    <div class="row m-b-15">
                        <div class="col-md-12">
                            <input type="password" name="pwd" class="form-control" placeholder="Password" required />
                        </div>
                    </div>

                    <label class="control-label">Re-enter Password <span class="text-danger">*</span></label>
                    <div class="row m-b-15">
                        <div class="col-md-12">
                            <input type="password" name="pwd-repeat" class="form-control" placeholder="Re-enter Password" required />
                        </div>
                    </div>

ниже моего php кода

<?php if(isset($_POST['signup-submit'])) {

  require 'dbh.inc.php';

  $firstName=$_POST['uFirst'];
  $lastName=$_POST['uLast'];
  $userName=$_POST['uName'];
  $email=$_POST['mail'];
  $password=$_POST['pwd'];
  $passwordRepeat=$_POST['pwd-repeat'];

  if (!filter_var($email, FILTER_VALIDATE_EMAIL) && !preg_match("/^[a-zA-Z0-9]*$/", $username)) {
    header("location: ../signup.php?error=invalidemail&uid&uFirst=".$firstName."&uLast=".$lastName);
    exit();

  } else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    header("location: ../signup.php?error=invalidemail&uFirst=".$firstName."&uLast=".$lastName."&uName=".$userName);
    exit();

  } else if (!preg_match("/^[a-zA-Z0-9]*$/", $username)) {
    header("location: ../signup.php?error=invaliduid&uFirst=".$firstName."&uLast=".$lastName."&mail=".$email);
    exit();

  } else if ($password !== $passwordRepeat) {
    header("location: ../signup.php?error=passwordnotmatching&uFirst=".$firstName."&uLast=".$lastName."&uName=".$userName."&mail=".$email);
    exit();

?>

1 Ответ

1 голос
/ 09 апреля 2020

Существует несколько способов решения этой проблемы. В конечном счете, есть два высокоуровневых параметра:

  1. Передача действительных значений обратно в новую форму
  2. Никогда не удаляйте действительные значения (например, JavaScript + AJAX)

При текущей настройке (1) будет проще. Чтобы работать с вашим текущим дизайном, вам нужно было бы где-то хранить значения для передачи обратно в форму для визуализации. Простейшим было бы добавить их в параметры URL (строку запроса), но другие варианты включают файлы cookie или хранилище сеансов.

Простейшим вариантом было бы объединить вашу форму и проверку в одну конечную точку, а не разделять их , Таким образом, у вас уже есть данные публикации при визуализации формы с сообщениями об ошибках.

Получив значения, вы можете просто вставить их в форму HTML с атрибутом value (обязательно HTML кодировать (htmlentities) любые пользовательские значения, чтобы избежать уязвимостей XSS).

Например:

 <input type="text" name="uFirst" class="form-control" placeholder="First name" value="<?= htmlentities($firstName) ?>" required />

Я только что заметил (из одного из комментариев), что вы уже передают ваши действительные значения в строке запроса с существующим перенаправлением. В этом случае вы можете просто сделать что-то вроде этого:

 <input type="text" name="uFirst" class="form-control" placeholder="First name" value="<?= htmlentities($_GET["uFirst"]??"") ?>" required />

Кодирование значений очень важно. Неправильное кодирование значений, особенно из пользовательского ввода, может позволить злоумышленникам создать значения, выходящие за пределы HTML и изменяющие страницу, уязвимость, известная как межсайтовый скриптинг (или сокращенно XSS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...