Jak połączyć walidację za pomocą wyjątków z bazą danych ?

0

Cześć! Zrobiłem walidację formularza rejestracji za pomocą wyjątków i walidacja działa poprawnie. Tylko jest jeden problem. Nie wiem jak sprawić aby wstawić dane do bazy danych jeśli walidacje przejdzie poprawnie. Próbowałem już różnych pomysłów ale nieskutecznie.

class FormRegisterValidation
{


	public function __construct(
        private $data,
        private  $database,
    ){}

    public function LoginValidation():string
    {
        $val = $this->data['login'];
        if(empty($val))
        {
            throw new ValidationException("Podaj login");
        }
        elseif(!preg_match('/^[a-zA-Z-0-9]{4,12}$/', $val))
        {
            throw new ValidationException("Niepoprawny login");
        }else
        {
            $sql = $this->database->ConnectDatabase()->prepare("SELECT * FROM user where login = :login");
            $sql->bindParam(':login', $login, PDO::PARAM_STR);
            $sql->execute();

            if($sql->rowCount())
            {
                throw new ValidationException("Podany login już istnieje");
            }
        }
        return $val;

    }

    public function PasswordValidation():string
    {
        $val = $this->data['password'];

        if(empty($val))
        {
             throw new ValidationException("Podaj hasło");
        }
        elseif(!empty($val) && !preg_match('/^[A-Za-z][A-Za-z0-9]{5,31}$/', $val))
        {
             throw new ValidationException("PoHasło musi zawierać przynajmniej 6 znaków i zaczynać się od litery");
          
        }
        return $val;
    }

    public function PasswordRepeatValidation():string
    {
        $val = $this->data['password_repeat']);
        $vala = $this->data['password']);

        if(empty($val))
        {
             throw new ValidationException("Pole nie może być puste");
        }
        elseif($val!=$vala)
        {
             throw new ValidationException("Hasła nie są identyczne");
        }
		 return $val;
    }

class Insert
{

	public function __construct(
	    private $data,
        private $database,
    ){}

	public function hash_password(): string
	{

		$field = $this->data['password'];
		return $hash = password_hash($field, PASSWORD_DEFAULT);

	}

	public function InsertUser(): void
	{

		$login = $this->data['login'];
		$hash = $this->hash_password();

		if(empty($avatar))
        {
            $avatar = 'avatar.jpg';
        }
			$query = $this->database->ConnectDatabase()->prepare("INSERT INTO user(`login`, `password`) VALUES(:login, :password)");
			$query->bindParam(':login', $login, PDO::PARAM_STR);
			$query->bindParam(':password',$hash, PDO::PARAM_STR);	
			$query->execute();
			
	
	}
}
   <form action="registration.php" method="post" id="formularz">
        <div class="row d-flex">
            <div class="form-group col-xl-12 text-light" id="inputWithIcon inputIconBg">
                <input type="text" name="login"  class="form-control border border-dark" placeholder="Login...">
                <span class="error">
				<?php
				 if(isset($_POST['submit']))
				 {
					 try{
						 $FormRegisterValidation->LoginValidation();
						 
					 }catch(ValidationException $exception)
					 {
						 echo $errorMessage = $exception->getMessage();
					 }
				 }
				
				?>
			</span>
            </div>
        </div>
        <div class="row">
            <div class="form-group col-xl-12 text-light"  id="inputWithIcon inputIconBg">
                <input type="password" name="password"  class="form-control border border-dark" placeholder="Hasło...">
                <span class="error">
				<?php
				 if(isset($_POST['submit']))
				 {
					 try{
						 $FormRegisterValidation->PasswordValidation();
						 
					 }catch(ValidationException $exception)
					 {
						 echo $errorMessage = $exception->getMessage();
					 }
				 }
				
				?>
			</span>
            </div>
        </div>
        <div class="row">
            <div class="form-group col-xl-12 text-light"  id="inputWithIcon inputIconBg">
                <input type="password" name="password_repeat"  class="form-control border border-dark" placeholder="Powtórz hasło...">
                <span class="error">
				<?php
				 if(isset($_POST['submit']))
				 {
					 try{
						 $FormRegisterValidation->PasswordRepeatValidation();
						 
					 }catch(ValidationException $exception)
					 {
						 echo $errorMessage = $exception->getMessage();
					 }
				 }
				
				?>
			</span>
            </div>
        </div>
3

Dawaj PHP do tagów kodu to na forum będzie kolorowanie skladni.

Z tego kodu wychodzi, że najprościej dać wywołanie funkcji zapisującej za catch


				 {
					 try{
						 $FormRegisterValidation->LoginValidation();
						 
					 }catch(ValidationException $exception)
					 {
						 echo $errorMessage = $exception->getMessage();
					 }
      // Tu wywolujesz swoją funkcję 

Ale to moim zdaniem nie będzie fajnie. Trzeba by się zastanowić nad tym przebiegiem. Może jednak powinieneś wołać zapis a w środku walidację?
No i nie wiem czy podejście drukowania wyjątków z aplikacji bezpośrednio to w ogóle dobra sprawa?
Jak ogarniesz np. taranslacje błędów na inne języki?

0

@jurek1980: A twoim zdaniem jak najlepiej zrobić walidację za pomocą wyjątków zeby kod był czytelny i ładnie napsiany ? Moim zdaniem też ten kod jest mało czytelny ale nie przychodzi mi jakiś inny sposób jak to mogę zrobić bardziej czytelnie i przed wszystkim prościej.

0

Robisz jedną metodę która obsługuje POST'a z formularza. W niej możesz użyć swojego walidatora. W obecnym kształcie nie ma to sensu.

Jeżeli chcesz walidować wpisany login i hasło na poziomie frontu bez przesyłania całego formularza, to musisz się posłużyć zapytaniami asynchronicznymi które będą walidować każde z pól osobno. Natomiast przy wysyłce całego formularza musisz owe dane jeszcze raz zwalidować i jeśli to się uda, zarejestrować konto.

W skrócie, schemat jest prosty:
Użytkownik wpisuje login -> za pomocą JS'a wysyłasz zapytanie z prośbą o walidację tego pola (LoginValidation)
Użytkownik wpisuje hasło -> za pomocą JS'a wysyłasz zapytanie z prośbą o walidację tego pola (PasswordValidation)
Użytkownik klika "Wyślij formularz" -> za pomocą PHP'a wywołujesz nową metodę np. RegisterUser która zawiera w sobie wywołanie LoginValidation jak i PasswordValidation. Jeśli obie metody zwrócą TRUE wówczas dokonujesz INSERT'a do bazy.

2

Głupio że masz pomieszaną logikę z widokiem w tym drugim kawałki kodu, oraz głupio że Twoja klasa która niby jest odpowiedzialna za walidację umie też SQL'a i wrzucać dane do bazy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1