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

Problem z walidacją danych

VPS Starter Arubacloud
0 głosów
152 wizyt
pytanie zadane 8 lutego 2023 w PHP przez zbiku25 Gaduła (3,000 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 (289,150 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 Gaduła (3,000 p.)
Serdeczne dzięki - teraz rozumiem!
1
komentarz 8 lutego 2023 przez VBService Ekspert (255,840 p.)

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

komentarz 8 lutego 2023 przez zbiku25 Gaduła (3,000 p.)
Ok tak zrobię, dzięki :)
komentarz 8 lutego 2023 przez zbiku25 Gaduła (3,000 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 (289,150 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 Gaduła (3,000 p.)
Potwierdzam, jeszcze raz wielkie dzięki !

Podobne pytania

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

93,020 zapytań

141,985 odpowiedzi

321,284 komentarzy

62,366 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...