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>";
		}
	}
	

}
  • Вопрос задан
  • 332 просмотра
Решения вопроса 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})$/');
// ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ЧИТАЙ-ГОРОД Москва
от 140 000 до 210 000 ₽
РосТендер Москва
от 130 000 до 150 000 ₽
Amigoweb Магнитогорск
от 40 000 до 70 000 ₽