Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql] Problem z walidacją w skrypcie rejestracji userów
Forum PHP.pl > Forum > Przedszkole
free
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 ?
nospor
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
My4tic
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
free
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.
nospor
@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.
free
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.
nospor
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....
free
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ć ?
nospor
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
free
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.
My4tic
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.
free
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. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.