CSS — простой тест проверки формы — изменение цвета границы для пустого результата

У меня есть эта простая форма входа, которую я тестирую. Я использую PHP, XAMPP, тестирую в Chrome.

Это код для формы:

<form action="login.php" method="POST">

<label>User: </label>
<input type="text" name="user" <?php if($errors){echo 'style="border:1px solid red;"';}?>>
<?php echo '<script>console.log("Value for $errors: '.$errors.'")</script>';?>

<label>Password: </label>
<input type="password" name="password" <?php if($errors){echo "style='border:1px solid red;'";}?>>

<div class="text-center">
<button type="submit" name="submit">Sign in</button>
</div>
</form>

Этот код является частью login.php, и в самом начале у меня есть следующие строки PHP:

<?php

session_start();

$user = "";
$password = "";
$errors = 0;

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

if(isset($_POST['user'])){
if(!empty($_POST['user'])){
$user = $_POST['user'];
}
}else{
$errors = 1;
}

if(!empty(isset($_POST['password']))){
$password = $_POST['password'];

}else{
$errors = 1;
}

$_SESSION['user'] = $user;
$_SESSION['password'] = $password;

}

?>

Атрибут action в форме вызывает сам себя (вызывает тот же файл -> login.php)
В сценарии PHP я пытаюсь добиться этого, если форма была отправлена, затем выполнить всю проверку и т. Д. Что касается простой проверки, я пытаюсь присвоить значения POST, полученные переменным, ЕСЛИ то, что было получено, СУЩЕСТВУЕТ, И ЭТО НЕ ПУСТО , Если пусто или не существует -> $ errors = 1;

Дело в том, что … если есть ошибки с двумя входами, я хочу, чтобы они изменили цвет границы на красный. Так я и сделал:

<label>User: </label>
<input type="text" name="user" <?php if($errors == 1){echo 'style="border:1px solid red;"';}?>>
<?php echo '<script>console.log("Value for $errors: '.$errors.'")</script>';?>

Последние строки, которые я добавил, чтобы попытаться напечатать в консоли значение $ errors, которое всегда показывает 0.

Я попробовал небольшое перенаправление, используя empty ($ user), и при отправке формы, не касаясь входов, это действительно показывает, что значения пусты. Тем не менее, я не до конца понимаю, почему, будучи пустым, $ errors всегда имеет значение 0.

Заранее спасибо! 🙂

0

Решение

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

PHP сторона

<?php

error_reporting(E_ALL); ini_set('display_errors', 1);

$errors = 0; // so you don't get 'red' applied without submitting the form

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

if(isset($_POST['user'])){ // check for POST'd value
if(!empty($_POST['user'])){
$user = $_POST['user'];
// $errors = 0; <- $errors would remain '0' but not needed, just for the logic
} else {
$errors = 1; // form is processed but $user is POST'd empty
}
} else {
$errors = $errors; // needed if one field is set but not the other one
// so we don't set $errors back to '0'
}

// same logic applies to 'password' -> no need to comment it out again :)

if(isset($_POST['password'])){
if(!empty($_POST['password'])){
$password = $_POST['password'];
} else {
$errors = 1;
}
} else {
$errors = $errors;
}

// added this to show users if they forgot something or not
if($errors == 0) {
$warning_mess = "Form fields have been filled, thx !";
} else {
$warning_mess = "Please fill all fields before submitting.";
}

// before submitting, give users a warning about fields
} else { $warning_mess = "Form fields need to be filled"; }

?>

ФОРМА сторона

<input type="text" name="user"<?php if($errors == "1"){ echo 'style="border:1px solid red;"'; } ?> />

Я просто добавил проверку на значение «$ errors» с == чтобы убедиться, что у нас есть 0/1 ->, это может быть полезно, если вы хотите позже изменить ситуацию и настроить настраиваемое сообщение об обработке ошибок для каждого поля.

Конечно, вам нужно обрезать, проверять и дезинфицировать все данные, поступающие от пользователей, нет необходимости говорить ^^

1

Другие решения

В проверке значений есть недостаток.

if ( isset( $_POST['user'] ) ) {
if ( ! empty( $_POST['user'] ) ) {
$user = $_POST['user'];
}
} else {
$errors = 1;
}

Ваша форма имеет поле с названием user который подает поэтому $_POST['user'] будет установлен. Если он установлен, то не имеет значения, пуст он или нет, ваш код не изменится $error 1. У вас есть вложенный цикл, который не учитывает это.

empty() собирается проверить, установлен ли он тоже, так что вам не нужно isset(),

if ( ! empty( $_POST['user'] ) ) {
$user = $_POST['user'];
} else {
$errors = 1;
}

То же самое относится и к паролю. Объединяя empty() с isset() не имеет смысла. Скопируйте подход от пользователя.

0