Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php/mysql] Problem z walidacją w skrypcie rejestracji userów
free
post 5.09.2006, 10:33:22
Post #1





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Poprzez formularz przesylam dane do ponizszego skryptu :
  1. <?php
  2. case 'zarejestruj':
  3. $spr="SELECT ksywa, email FROM users88 WHERE ksywa='".$_POST['ksywa']."' OR email='".$_POST['email']."'";
  4.  $wynik=mysql_query($spr);
  5.  if (mysql_num_rows($wynik) > 0 ) echo "<br /> Podana nazwa lub email juz istnieje w bazie danych <br />";
  6. if (!$_POST['ksywa']) echo "<br /> Nie wypełniono pola "Imię"<br />";
  7. if (!$_POST['email']) echo "<br /> Nie wypełniono pola "Email"<br />";
  8. if (!$_POST['haslo']) echo "<br /> Nie wypełniono pola "Hasło"<br />";
  9. if (!$_POST['haslo2']) echo "<br /> Nie wypełniono pola "Hasło2"<br />";
  10. if ($_POST['haslo']!=$_POST['haslo2']) echo "<br /> Podane hasła nie sa identyczne. Podaj takie same hasła";
  11.  
  12.  else {
  13. $ip = $_SERVER['REMOTE_ADDR'];
  14. $data = date('Y-m-d G:i:s');
  15.  $dataip ="$data.$ip";
  16.  $md5=md5($dataip);
  17. $ksywa=htmlspecialchars($_POST['ksywa']);
  18. $email=htmlspecialchars($_POST['email']);
  19. $haslo=htmlspecialchars($_POST['haslo']);
  20. $haslo2=htmlspecialchars($_POST['haslo2']);
  21.  
  22. $sql = "INSERT INTO tempusers88 (tempuser_id, email, ksywa, haslo, ip, md5)
  23. VALUES ('', '$email', '$ksywa', '$haslo', '$ip', '$md5')";
  24.  
  25.  
  26. or die('Nie potrafię utworzyć konta: ' . mysql_error());
  27. ?>

Działa dobrze, tzn rejestruje uzytkownikow. Ale zastosowana przezemnie walidacja /LINIE 5-10/ błędów nie sprawdza się, tzn skrypt rejestruje nawet gdy sie nie poda nazwy usera lub hasla :-( Co tu poprawic ?

Ten post edytował free 5.09.2006, 10:44:26
Go to the top of the page
+Quote Post
nospor
post 5.09.2006, 10:41:33
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Podpowiedź:
zauwaz, ze twoj ELSE, ktory robi wpis do bazy odnosi sie tylko do ostatniego ifa. Pozostale ify wywalają tylko tekst na ekran i nie mają z ELSE nic wspolnego...

proszę poprawić tytuł o znacznik zgodnie z zasadami forum Przedszkole:
Temat: Tematyka i zasady panujace na forum Przedszkole


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
My4tic
post 5.09.2006, 10:44:08
Post #3





Grupa: Zarejestrowani
Postów: 260
Pomógł: 0
Dołączył: 4.08.2005

Ostrzeżenie: (0%)
-----


Zamiast

  1. <?php
  2. if (!$_POST['haslo'])
  3. ?>


używaj

  1. <?php
  2. if (empty($_POST['haslo'])) {...}
  3. ?>


http://pl2.php.net/manual/pl/function.empty.php" title="Zobacz w manualu php" target="_manual


--------------------
Załóż konto na dropbox.
Go to the top of the page
+Quote Post
free
post 5.09.2006, 10:48:41
Post #4





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Nospor. Działało mi do tej pory jak nie dodałem opcji sprawdzajacej w linii 3,4,5 . Do tej pory warunki były sprawdzane i w razie nie spełnienia obojetnie jakiego warunku nie dochodzilo do dodania do bazy tylko komunikat lub komunikaty. a teraz wywala komunikaty o braku jakiegod parametru z $_POST ale dodaje do bazy niepelne dane.
My4tic słuszna uwaga.
Go to the top of the page
+Quote Post
nospor
post 5.09.2006, 10:51:41
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@free to ze ci dzialala do tej pory, przed zmianami, to ma malo do znaczenia. Jak juz ci pisalem, wczesniejsze ify tylko wyswietlają napis na ekran, w zaden sposob nie warunkuja wlozenia do bazy. Wlozenie do bazy warunkuje tylko ostatni if.
Mozesz dorobic, ze kazdy if ustawia zmienna $blad na true. A do bazy beddziesz wkladaj tylko wtedy gdy zmienna $blad jest false.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
free
post 5.09.2006, 11:00:12
Post #6





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Więc jak to zrobić ?
Poprawiłem na
  1. <?php
  2. if (empty($_POST['haslo'])) {...}
  3. ?>
ale nic nie zmienia, poza kosmetyką.
Testuje i widze ze problem lezy w dodanych liniach 3,4,5 bez nich skrypt bez jakiejs zmiennej zatrzymywał sie i bylo OK. A teraz tylko wyswietla komunikaty ale dodaje dane do bazy. Głupieje juz.
Go to the top of the page
+Quote Post
nospor
post 5.09.2006, 11:04:21
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To ja ci mowie, ze jesli masz blad danych to masz ustawiac jakac zmienna, a ty mi dopisujesz {...} i sie dziwisz ze nic sie nie zmienia.... czy ja nie szprecham po polsku? tongue.gif

  1. <?php
  2. $blad = false;
  3. if (jakiswaruneknazledane1) {echo 'zledane1';$blad=true;}
  4. if (jakiswaruneknazledane2) {echo 'zledane2';$blad=true;}
  5. //.....
  6. if (!$blad) {
  7. //tu se wstaw do bazy
  8. }
  9. ?>

I przestan powtarzac uparcie gdzie jest blad, ze wlini 3,4,5 bo ja to doskonale wiem.

edit (po poscie ponizej):
wszystkie odpowiedzi byly logiczne... ostatnia to gotowiec....


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
free
post 5.09.2006, 11:23:47
Post #8





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Nospor ostatnia odpowiedz brzmi logicznie :-)
Sprawdziłem i śmiga jak KUBICA :-) O to mi chodziło.
Ostatecznie kod wygląda tak :
  1. <?php
  2. case 'zarejestruj':
  3. $blad = false;
  4. $spr="SELECT ksywa, email FROM users88 WHERE ksywa='".$_POST['ksywa']."' OR email='".$_POST['email']."'";
  5.  $wynik=mysql_query($spr);
  6. if (mysql_num_rows($wynik) > 0 ) {echo "<br />Podana nazwa lub email juz istnieje w bazie danych "; $blad=true; }
  7. if (empty($_POST['ksywa'])) { echo "<br /> Nie wypełniono pola "Ksywa"<br />"; $blad=true; }
  8. if (empty($_POST['email'])) { echo "<br /> Nie wypełniono pola "Email"<br />";  $blad=true; }
  9. if (empty($_POST['haslo'])) { echo "<br /> Nie wypełniono pola "Hasło"<br />";  $blad=true; }
  10. if (empty($_POST['haslo2'])) { echo "<br /> Nie wypełniono pola "Hasło2"<br />"; $blad=true; }
  11. if ($_POST['haslo']!=$_POST['haslo2']) { echo "<br /> Podane hasła nie sa identyczne. Podaj takie same hasła"; $blad=true; }
  12.  if (!$blad) {
  13. ?>

Mała nie ścisłość powstaje jedynie gdy uzytkownik nie poda nic w polu ksywa i email. wowczas skrypt oprocz tekstu ze nie wypelniono tych pol podaje rowniez ze taki user lub email juz istnieje. Co zmeinic by to dopracować ?

Ten post edytował free 5.09.2006, 11:30:59
Go to the top of the page
+Quote Post
nospor
post 5.09.2006, 11:36:38
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tak na chlopski rozum to najpierw powinienes sprawdzac, czy sa dane prawidlowe, a dopiero potem selecta walic smile.gif Ale to juz teraz pokombinuj sam. KOlejnego "logicznego" gotowca ci nie dam


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
free
post 5.09.2006, 12:05:05
Post #10





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Tak se teraz pomyslalem, ze pytajac o dane z bazy poprzez SELECT gdzy nie ma spełnionych warunkow to dostajemy wszystko, wiec chyba lepiej bedzie jak zamiast
  1. <?php
  2. if (mysql_num_rows($wynik) > 0 )
  3. ?>

uzyje
  1. <?php
  2. if (mysql_num_rows($wynik) ==1 )
  3. ?>

bo jak od poczatku tak bede rejestrowal userow to w przypadku duplikacji nazw bedzie tylko 1 user o danym niku lub mailu. I jezeli bedzie ten warunek spełniony to warunek if bedzi działał optymalniej.

Ten post edytował free 5.09.2006, 12:05:25
Go to the top of the page
+Quote Post
My4tic
post 5.09.2006, 12:13:02
Post #11





Grupa: Zarejestrowani
Postów: 260
Pomógł: 0
Dołączył: 4.08.2005

Ostrzeżenie: (0%)
-----


Dziwnie troche do tego podchodzisz....

Nadaj atrybut UNIQUE w SQL do nick i mail, później...

1. Sprawdź czy wypełniono wymagane pola,
2. Sprawdź poprawnośc danych/usuń niebezpieczny kod,
3. Dodaj dane do SQL,
4. Jeśli zapytanie zwróci błąd to znaczy, że taki nick/mail istnieje (nie pamiętam teraz numeru błedu, poszukaj sobie),
4a. Jeśli bład - Wyświetl ponownie formularz.
4b. Jeśli brak błedu - Komunikat, że wszystko ok.


--------------------
Załóż konto na dropbox.
Go to the top of the page
+Quote Post
free
post 5.09.2006, 12:41:29
Post #12





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Wystarczy dodac :
  1. `ksywa` varchar(100) UNIQUE NOT NULL DEFAULT '',
  2. `email` varchar(255) UNIQUE NOT NULL DEFAULT '',
?

Dostrzegłem jeszcze jeden problem.
Tak jak napisalem wyzej
  1. <?php
  2. if (mysql_num_rows($wynik) ==1 )
  3. ?>
rozwiązuje problem.
Gdy użytkownik logujac sie wciska spacje przechodzi walidacje błędów :-(

Zastosowalem funkcje TRIM() ktora usuwa dodatkowe spacje z konca i poczatku tekstu, ale nie pomaga:
  1. <?php
  2. $ksywa=trim(htmlspecialchars($_POST['ksywa']));
  3. $email=htmlspecialchars(trim($_POST['email']));
  4. $haslo=htmlspecialchars(trim($_POST['haslo']));
  5. $haslo2=htmlspecialchars(trim($_POST['haslo2']));
  6. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 18:33