• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z walidacją danych

Object Storage Arubacloud
0 głosów
120 wizyt
pytanie zadane 8 lutego 2023 w PHP przez zbiku25 Bywalec (2,940 p.)

Robię formularz rejestracji. Napisałem klasę, która będzie walidować dane. W każdym przypadku, gdy walidacja nie przebiega poprawnie dodaję zmienną (nie sesyjną tylko zwykłą) zawierającą informację o błędzie. Tą zmienną chcę później wyświetlić w formularzu, jeżeli walidacja nie przebiegnie poprawnie.

Plik z klasą będzie 'includowany' do pliku php zaweirającego formularz rejestracji - dlatego używam zwykłych zmiennych a nie sesyjnych. Wydawało mi się, że "include("plik.php") oznacza, że treść pliku, który includuję będzie tak jakby znajdować się w treści pliku, do którego wstawiam includowany plik - stąd nie ma potrzeby używania zmiennych sesyjnych. 

Czy moje zrozumienie funkcji "include" jest prawidłowe? Jeżeli tak, to dlaczego treść zmiennych mi się nie wyświetla (w przypadku zdefiniowania zmiennych sesyjnych treść się wyświetla poprawnie).

PLIK z klasą (class_signup.php)

class Signup
{
	public function validation($data)
	{
		$ok = true;
		
		$email = $data['email'];
		$pass = $data['password'];
		
		//email validation
		
		if( empty($email))
			{
				$ok = false;
				$email_err = "Pole e-mail nie może być puste";
			}
		elseif ((filter_var($email, FILTER_VALIDATE_EMAIL)) ==false)
			{
				$ok = false;
				$email_err = "Wprowadzono niepoprawny adres email";
			}
		
		//password validation
		
		if( (strlen($pass)<5) || (strlen($pass)>20))
			{
				$ok = false;
				$pass_err = "Hasło musić posiadać nie mniej niż 5 i nie więcej niż 20 znaków";
			}
		
		//t&C validation
		
		if ((!isset($data['rules'])) || ($data['rules'] != "on"))
		{
			$ok = false;
			$rules_err = "Potwierdź akceptację regulaminu";
		}
	}	
}

PLIK z formularzem rejestracji

<?php


include ("classes/class_signup.php");

if( $_SERVER['REQUEST_METHOD']=="POST")
	{
		$sign = new Signup();
		$sign->validation($_POST);
	}
?>

...... i dalej

					<form method="POST" action="">
							<span class="big">Zarejestruj się</span><br>	
							Posiadanie konta jest w pełni darmowe.<br><br>
							<input type="email" name="email" placeholder="Adres email" class="text"><br>
							
							<?php
							
							if( isset($email_err))
							{
								echo $email_err;
								unset ($email_err);
							}
							
							?>
							
							<br>
							<input type="password" name="password" placeholder="Hasło" class="text"><br>
							
							<?php
							
							if( isset($pass_err))
							{
								echo $pass_err;
								unset ($pass_err);
							}
							
							?>
							<br>
							<label><input type="checkbox" name="rules">Potwierdzam akceptację <a href="#">regulaminu</a></label><br>
							
							<?php
							
							if( isset($rules))
							{
								echo $rules;
								unset ($rules);
							}
							
							?>
							
							
							<br>
							<input type="submit" value="Zarejestruj się" class="button1"><br><br>
						
						</form>

 

 

1 odpowiedź

+1 głos
odpowiedź 8 lutego 2023 przez Arkadiusz Waluk Ekspert (287,950 p.)
wybrane 8 lutego 2023 przez zbiku25
 
Najlepsza
Twoje rozumienie działania include wydaje się być prawidłowe. Zapomniałeś jednak o innej ważnej rzeczy - zasięgu zmiennych. Każda zmienna zadeklarowana w funkcji (czy metodzie klasy) nie będzie widoczna poza nią i w drugą stronę tak samo, każda zmienna zadeklarowana poza funkcją nie będzie widoczna wewnątrz niej. W związku z tym nawet jeśli walidacja się wykonuje i ustawia zmienne z błędami w funkcji, to w miejscu gdzie wyświetlasz formularz takie zmienne nie istnieją.

Można sobie z tym poradzić na różne sposoby, w różny sposób przebudować Twój kod. Najbliżej tego co masz obecnie byłoby w metodzie validate() nie ustawiać zmiennych, a dodawać sobie błędy do jakiejś tablicy, którą następnie zwróciłbyś z metody. Wtedy później mógłbyś sprawdzić na tej zwróconej tablicy czy dane klucze istnieją i jeśli tak to wyświetlić błąd.
komentarz 8 lutego 2023 przez zbiku25 Bywalec (2,940 p.)
Serdeczne dzięki - teraz rozumiem!
1
komentarz 8 lutego 2023 przez VBService Ekspert (253,400 p.)

Poczytaj też np. Metody i właściwości klasy

komentarz 8 lutego 2023 przez zbiku25 Bywalec (2,940 p.)
Ok tak zrobię, dzięki :)
komentarz 8 lutego 2023 przez zbiku25 Bywalec (2,940 p.)

@Arkadiusz Waluk, jednak nadal mam mały problem z tym rozwiązaniem. Zastosowałem tablicę zbierającą błędy i zwracam ją jako wynik funkcji. Niestety w pliku z formularzem dalej nie wykrywa tej zmiennej - nie wiem dlaczego :(

klasa:

class Signup
{
	
	public function validation($data)
	{
		$ok = true;
		
		$email = $data['email'];
		$pass = $data['password'];
		
		$errors=[];
		
		//email validation
		
		if( empty($email))
			{
				$ok = false;
				$email_err = "Pole e-mail nie może być puste";
				$this->errors['email_err']=$email_err;
			}
		elseif ((filter_var($email, FILTER_VALIDATE_EMAIL)) == false)
			{
				$ok = false;
				$email_err = "Wprowadzono niepoprawny adres email";
				$this->errors['email_err']=$email_err;
			}
		
		//password validation
		
		if( (strlen($pass)<5) || (strlen($pass)>20))
			{
				$ok = false;
				$pass_err = "Hasło musić posiadać nie mniej niż 5 i nie więcej niż 20 znaków";
				$this->errors['pass_err']=$pass_err;
			}
		
		//t&C validation
		
		if ((!isset($data['rules'])) || ($data['rules'] != "on"))
		{
			$ok = false;
			$rules_err = "Potwierdź akceptację regulaminu";
			$this->errors['rules_err']=$rules_err;
		}
		
		return $this->errors;
		
	
	
	}
	
	
	
	
}

początek pliku z formularzem gdzie chcę wyświelić tablicę $error

include ("classes/class_signup.php");

if( $_SERVER['REQUEST_METHOD']=="POST")
	{
		$sign = new Signup();
		$sign->validation($_POST);
		print_r ($errors);
	}

 

1
komentarz 8 lutego 2023 przez Arkadiusz Waluk Ekspert (287,950 p.)

W klasie Signup w linii 11 zadeklarowałeś tablicę jako zwykłą zmienną i to jest ok. Natomiast w każdej kolejnej próbie odwołania poprzez $this->errors próbujesz użyć właściwości errors tego obiektu. To spora różnica. Zmienna ma zasięg tylko do tej funkcji, właściwość dotyczyłaby całego obiektu. Gdybyś chciał zadeklarować właściwość to byłoby przykładowo tak:

class Signup
{
    private array $errors = [];
    // ...

Choć prawdopodobnie ten fragment kodu i tak obecnie zadziała, bo jeśli odwołujesz się do właściwości, która nie istnieje to zostanie ona dynamicznie utworzona. Jednak poprawnie powinna być wcześniej zadeklarowana, w najnowszej wersji PHP to już jest deprecated. Tak naprawdę jednak w tym przypadku zupełnie wystarczy Ci zwykła zmienna, bo wszystko dzieje się w obrębie tej jednej metody, czyli wszędzie powinieneś odwoływać się do $errors, nie $this->errors. Ponadto, w pliku z formularzem skąd miałoby się wziąć nagle $errors? Zwracasz przez return z metody validate() tablice i to jest dobrze, ale po wywołaniu metody tę wartość trzeba "odebrać" i przypisać np. do jakiejś zmiennej, abyś mógł później tego użyć, czyli byłoby:

$errors = $sign->validation($_POST);
1
komentarz 8 lutego 2023 przez zbiku25 Bywalec (2,940 p.)
Potwierdzam, jeszcze raz wielkie dzięki !

Podobne pytania

0 głosów
1 odpowiedź 109 wizyt
0 głosów
1 odpowiedź 469 wizyt
0 głosów
3 odpowiedzi 558 wizyt
pytanie zadane 10 kwietnia 2016 w HTML i CSS przez pitruk Nowicjusz (140 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...