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

Problem z walidacją danych

Hosting forpsi easy 1 pln
0 głosów
103 wizyt
pytanie zadane 8 lutego 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 przez Arkadiusz Waluk Ekspert (286,610 p.)
wybrane 8 lutego 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 przez zbiku25 Bywalec (2,940 p.)
Serdeczne dzięki - teraz rozumiem!
1
komentarz 8 lutego przez VBService Ekspert (246,070 p.)

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

komentarz 8 lutego przez zbiku25 Bywalec (2,940 p.)
Ok tak zrobię, dzięki :)
komentarz 8 lutego 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 przez Arkadiusz Waluk Ekspert (286,610 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 przez zbiku25 Bywalec (2,940 p.)
Potwierdzam, jeszcze raz wielkie dzięki !

Podobne pytania

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

92,130 zapytań

140,788 odpowiedzi

317,814 komentarzy

61,452 pasjonatów

Advent of Code 2023

Top 15 użytkowników

  1. 1886p. - Łukasz Eckert
  2. 1856p. - Dawid128
  3. 1844p. - Marcin Putra
  4. 1844p. - CC PL
  5. 1775p. - Mikbac
  6. 1644p. - jaroslawroszyk
  7. 1633p. - rafalszastok
  8. 1562p. - rucin93
  9. 1553p. - sefirek
  10. 1492p. - Adrian Wieprzkowicz
  11. 1456p. - Eryk Andrzejewski
  12. 1424p. - ssynowiec
  13. 1383p. - Rafał Trójniak
  14. 1325p. - Michal Drewniak
  15. 1275p. - dia-Chann
Szczegóły i pełne wyniki

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.

Uwaga - w dniach od 02.12 do 08.12 trwają Mikołajki (książki drukowane mają rabat -35%, ebooki do -45%). Zaś dodatkowy, specjalny kod zniżkowy: HELMIKOLAJ-10 dla naszych Widzów zapewni Wam oszczędność -10zł dla zamówień powyżej 70zł! Warto korzystać!

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...