validation — ошибка PHP при проверке имени пользователя

Я строю веб-сайт с использованием PHP, и мне нужно проверить, правильно ли введено пользователем имя или нет. Поскольку JavaScript на стороне клиента, я не могу полностью на это полагаться, поэтому вот моя функция на стороне сервера для проверки имени пользователя:

function validate_name($name) {
$name = trim($name);  // only for the purpose of debugging <---- edited comment
echo $name;
if (strlen($name) <= 1) {
return "small";
} else if (has_numbers($name)) {
return "numbers";
} else {
return true;
}
}

После этого я проверяю ввод и отображаю результат соответственно:

function final_check() {
if (validate_name($_POST["first_name"]) == "small") {
echo "<span class='error'>Your first name cannot be empty</span>";
return false;
} else if (validate_name($_POST["first_name"]) == "numbers") {
echo "<span class='error'>Numbers are not allowed in your first name</span>";
return false;
}
return true;
}

Когда я ничего не ввожу в first_name поле, я получаю пустое сообщение об ошибке; когда я ввожу числа, я получаю сообщение об ошибке чисел. Однако, когда я действительно ввожу правильное имя, мне выдается пустое сообщение об ошибке.

Вот данные поста:

Array
(
[email] => ewf@gmail.com
[first_name] => qwe
[last_name] => wqe
[password] => qwe
[re_password] => qwe
[gender] => Male
)

Выход:

Your first name cannot be empty

Есть идеи, что я делаю не так? Я был в тупике в течение последнего часа, пытаясь это исправить, и я не смог найти решение.

3

Решение

Array
(
[email] => ewf@gmail.com
[first_name] => qwe
[last_name] => wqe
[password] => qwe
[re_password] => qwe
[gender] => Male
)

// First_name length = 3

function validate_name($name) {
$name = trim($name);
echo $name;
if (strlen($name) <= 1) {
return "small";
} else if (has_numbers($name)) {
return "numbers";
} else {
return true;      // satisfy this case return true
}
}

и здесь это становится как

function final_check() {
if (validate_name($_POST["first_name"]) == "small") {   // if(1 == 'small')
echo "<span class='error'>Your first name cannot be empty</span>";
return false;
} else if (validate_name($_POST["first_name"]) == "numbers") {
echo "<span class='error'>Numbers are not allowed in your first name</span>";
return false;
}
return true;
}

if (1 == ‘small’) — это сравнение строк с логическим значением, которое всегда будет возвращать true.

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

6

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

Ваша логика верна, однако, как указали другие вопросы, строка с логическим сравнением вернет true.

Чтобы это исправить, вы должны использовать === вместо == и все должно быть хорошо

1

То, что я предлагаю здесь, это изменить ваш validate_name функция, так что он будет иметь только один тип возвращаемого значения, поскольку в настоящее время он может возвращать либо string или boolean, что не очень хорошая практика.

Например, вы можете сделать что-то вроде:

function validate_name($name) {
$name = trim($name);
echo $name;
if (strlen($name) <= 1) {
return "small";
} else if (has_numbers($name)) {
return "numbers";
} else {
return "ok"; // or return ""; or whatever string you want.
}
}

Кроме того, чтобы оптимизировать код и улучшить читабельность, вы можете изменить final_check функционировать так, что будет только один вызов validate_name используя промежуточную переменную.

function final_check() {
$valid = validate_name($_POST["first_name"]);
if ($valid == "small") {
echo "<span class='error'>Your first name cannot be empty</span>";
return false;
} else if ($valid == "numbers") {
echo "<span class='error'>Numbers are not allowed in your first name</span>";
return false;
}
return true;
}
1

попробуй с

if (validate_name($_POST["first_name"]) == "small" && !validate_name($_POST["first_name"])) {
echo "<span class='error'>Your first name cannot be empty</span>";
return false;
} else if (validate_name($_POST["first_name"]) == "numbers" && validate_name($_POST["first_name"])) {
echo "<span class='error'>Numbers are not allowed in your first name</span>";
return false;
}

true == 'small' также вернется true

или попробуйте с === будет строго соответствовать значениям

if (validate_name($_POST["first_name"]) === "small") {
echo "<span class='error'>Your first name cannot be empty</span>";
return false;
} else if (validate_name($_POST["first_name"]) === "numbers"=) {
echo "<span class='error'>Numbers are not allowed in your first name</span>";
return false;
}
1

Я думаю, что вы должны изменить только функцию final_check ()

function final_check() {
if(validate_name($_POST["first_name"])){
return true;
}else{
if (validate_name($_POST["first_name"]) == "small") {
echo "<span class='error'>Your first name cannot be empty</span>";
return false;
} else if (validate_name($_POST["first_name"]) == "numbers") {
echo "<span class='error'>Numbers are not allowed in your first name</span>";
return false;
}
}
}
-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector