anton_reut
@anton_reut
Начинающий веб-разработчик

PHP, регистрация, проверка полей?

Знаю что нет проверки на длину и еще много чего но можно ли писать проверки так?

if($_POST['submit']){
	
	$salt = 'Здесь будет 32 рандомных символа';
	
	$login = $_POST['login'];
	$pass1 = hash('sha256', $_POST['password'].$salt);
	$pass2 = hash('sha256', $_POST['password2'].$salt);

	// Проверка заполненности и подобия паролей.
	if(!empty($pass1 AND $pass2) && $pass1==$pass2){
		$passcheck = true;
	}
	else {
		$passcheck = false;
		$errors[] = "Ошибка! Пароли не совпадают или поля не заполнены!";
	}
	
	// Проверка заполнен ли логин.
	if(!empty($login)){
		$logincheck = true;
	}
	else {
		$logincheck = false;
		$errors[] = "Ошибка! Заполните поле Логин!";
	}
	
	//Итоговая проверка корректности всех полей.
	if($passcheck == true && $logincheck == true){
		echo "Процесс регистрации...";
	}
	else{
		echo "Правильно заполните поля!" . "<br>";
		// Выводим список ошибок из массива $errors[].
		foreach($errors as $error){
			echo $error . "<br>";
		}
	}
	

}
  • Вопрос задан
  • 170 просмотров
Решения вопроса 3
l3ftoverz
@l3ftoverz Куратор тега PHP
Туды сюды
Как думаешь, что тут происходит?:
empty($pass1 AND $pass2)

Тебе не нужны бесполезные переменные $passcheck и $logincheck, объяви в начале пустой массив $errors и вместо if($passcheck == true && $logincheck == true) сможешь написать просто if (empty($errors)) { ..good } else { ...bad }

Да и сравнивать перменные с true\false внутри if условия - глупо и бесполезно.
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) нет смысла хэшить пароли для сравнения, тем более не нужно использовать hash для шифрования паролей, есть специальные функции для этого.
2) Для логина используются проверки регулярками, в соответствии с вашими условиями(длинна, символы, латиница, тире...) + наличие такого логина в базе(на занятость)
3) нормальные сервисы требуют емэйл для подтверждения регистрации.
4) как верно заметил BD_ l3ftoverZ!, правильнее создать вначале пустой массив ошибок, а затем его в конце проверить, если он пуст - все ок, если есть ошибки - передать в представление и вывести в форму регистрации.
Ответ написан
@user49981
login.html
<form action="login.php" method="post">
    <input type="text" name="login" id="login"/>
    <input type="password" name="password"/>
    <input type="text" name="form_login" hidden readonly/>
    <input type="submit">
</form>


login.php
<?php

include 'validation.php';
include 'database.php';
include 'functions.php';

if (formSubmit('form_login')) {
    if (formValid(['login', 'password'], [VALIDATE_LOGIN, VALIDATE_PASSWORD])) {
        if(isUserExist('login', 'password')) {
            echo "hi";
        }
    }
}


functions.php
<?php
function formSubmit(string $formName)
{
    if (array_key_exists($formName, $_POST)) {
        return true;
    }
    return false;
}

function formValid(array $fields, array $filters)
{
    for ($i = 0; $i < count($filters); $i++) {
        if(!preg_match($filters[$i], filter_input_array(INPUT_POST)[$fields[$i]])) {
            return false;
        };
    }
    return true;
}

function isUserExist($loginPostField, $passwordPostFiled, $allowDisabled = true) {
    $login = filter_input_array(INPUT_POST)[$loginPostField];
    $password = filter_input_array(INPUT_POST)[$passwordPostFiled];
    if(userExistInDatabase($login, $password)) {
        return true;
    }
    return false;
}

function userExistInDatabase($login, $password)
{
    $mysqli = new \mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    if ($mysqli->connect_errno) {
        echo 'error:' . __METHOD__ . " : " . __LINE__; die;
    }
    $sql = "SELECT id FROM users WHERE login = $login AND password = " . password_hash($password, PASSWORD_BCRYPT);
    if (!$result = $mysqli->query($sql)) {
        echo 'error:' . __METHOD__ . " : " . __LINE__; die;
    }
    if ($result->num_rows === 1) {
        return true;
    }
    return false;
}


database.php
<?php
define('DB_HOST', '...');
// ...


validation.php
<?php
define('VALIDATE_LOGIN', '/^(\w{3,12})$/');
// ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 55 000 до 80 000 руб.
WACDAQ Москва
от 120 000 руб.
Paxport Москва
от 140 000 до 190 000 руб.