Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Skrypt rejestracji problem
porywacz
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


Witam, napisałem tak na szybko skrypt rejestracji na stronę. Jednak nie wiem czemu instrukcja wykonuje się nie tak jak chcę ;/
Wszystkie pola wypełniam zgodnie z kryteriami z preg_match a i tak wyskakuje mi komunikat z else'a ;///
Tutaj formularz w html:
  1. Wypełnij poniższy formularz, aby się zarejestrować.<br/>
  2. Pamiętaj, wypełniając formularz rejestracyjny wyrażasz zgodę na przetwarzanie twoich danych osobistych.
  3. <table style="text-align: right; margin-left: 20px;">
  4. <form method="post" action="zarejestruj.php">
  5. <tr><td></td><td>* Pola obowiązkowe</td></tr>
  6. <tr>
  7. <td>Nazwa użytkownika*:</td> <td><input type="text" name="login"/></td>
  8. </tr>
  9. <tr>
  10. <td>Hasło*: </td> <td><input type="password" name="password"/></td>
  11. </tr>
  12. <tr>
  13. <td>Powtórz hasło*: </td> <td><input type="password" name="password_rep"></td>
  14. </tr>
  15. <tr>
  16. <td>E-mail*: </td> <td><input type="text" name="email"></td>
  17. </tr>
  18. <tr>
  19. <td>Powtórz e-mail*: </td> <td><input type="text" name="email_rep"></td>
  20. </tr>
  21. <tr>
  22. <td></td> <td><input type="submit" value="Zarejestruj się"></td>
  23. </tr>
  24. </form>


A tutaj skrypt rejestracji:
  1. <?php
  2. $login = $_POST['login'];
  3. $password = $_POST['password'];
  4. $password = md5($password);
  5. $password_rep = $_POST['password_rep'];
  6. $password_rep = md5($password_rep);
  7. $email = $_POST['email'];
  8. $email_rep = $_POST['email_rep'];
  9.  
  10. if( !empty($login)
  11. &&
  12. !empty($password)
  13. &&
  14. !empty($password_rep)
  15. &&
  16. !empty($email)
  17. &&
  18. !empty($email_rep)
  19. ) {
  20. if(
  21. preg_match('@^[a-z0-9]{6,12}$@',$login)
  22. &&
  23. preg_match('!^[a-z0-9]{6,14}$!',$password)
  24. &&
  25. preg_match('!^[a-z0-9]{3,20}@[a-z0-9]{2,8}.[a-z]{2,5}$!',$email)) {
  26.  
  27. $db = mysql_connect('localhost','root','') or die('Nie udało się połączyć z serwerem :(');
  28. $db = mysql_select_db('uzytkownicy');
  29.  
  30. $query = mysql_query("INSERT INTO uzytkownicy (login, password, email) VALUES('$login','$password','$email')") or die('Nie udało się umieścić values w tabeli');
  31.  
  32. } else {
  33. echo('Nie udało mi się Ciebie zarejestrować. <br/> Sprawdź czy poprawnie wypełniłeś wszystkie pola.');
  34. }
  35. } else {
  36. echo('Wypełnij wszystkie pola !');
  37. }
  38. ?>

Z góry dziękuję za pomoc (IMG:style_emoticons/default/smile.gif)

Ten post edytował porywacz 9.04.2012, 16:57:25
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
markonix
post
Post #2





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


No a przetestowałeś po kolei każdy z "preg"?
Przez który nie przechodzi?
Go to the top of the page
+Quote Post
porywacz
post
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


Przetestowałem usuwając po jednym aż nie zostało nic z tych preg i działało (IMG:style_emoticons/default/sad.gif) Więc to na pewno przez preg ale nie wiem dokładnie co zrobiłem źle ;/
Go to the top of the page
+Quote Post
markonix
post
Post #4





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


To nie usuwaj wszystkie tylko po jednym...
No chyba, że wszystkie są złe...
Go to the top of the page
+Quote Post
porywacz
post
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


Ok, sprawdziłem i wyszło na to, że nie przechodzi przez preg_match, który sprawdza hasło ;d A wpisuję na przykład maslomaslo1 ; d
Go to the top of the page
+Quote Post
markonix
post
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Chociaż nie pamiętam akurat co robią te wykrzykniki (myślałem, że to przez to) to i tak działa.
http://www.functions-online.com/preg_match.html

Druga sprawa to czemu ograniczasz znaki, które można użyć w haśle?
Jedyne co jest słuszne to sprawdzenie długości hasła (żeby nie było zbyt krótkie).
Druga sprawa hasła się nie zapisuje w jawnej postaci (to nie Allegro) tylko się tworzy hash (md5 i sha1 z tych takich podstawowych).
Go to the top of the page
+Quote Post
porywacz
post
Post #7





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


markonix, to czemu u mnie nie działa ? (IMG:style_emoticons/default/ohmy.gif) Dziwne ;((

  1. $password = $_POST['password'];
  2. $password = md5($password);


Przecież jest md5...
Go to the top of the page
+Quote Post
!*!
post
Post #8





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Trudno żeby działało, skoro generujesz md5 a sprawdzasz czy ma 14 znaków. Poza tym źle się do tego zabrałeś. Nie sprawdzasz czy formularz został wysłany, skoro używasz md5 to sprawdzanie hasła jest zbędne, no i nie sądzę że używanie pregów do sprawdzania długości ciągu jest dobre. Nie sprawdzasz też czy pola istnieją oraz jakiego są typu. I nie przepuści Ci wszytkich adresów email, chociaż są poprawne.

Ten post edytował !*! 9.04.2012, 17:26:21
Go to the top of the page
+Quote Post
porywacz
post
Post #9





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


  1. if( isset($login)
  2. &&
  3. isset($password)
  4. &&
  5. isset($password_rep)
  6. &&
  7. isset($email)
  8. &&
  9. isset($email_rep)
  10. )

Tak lepiej? (IMG:style_emoticons/default/biggrin.gif) Skoro nie bardzo da się to zrobić pregami to może coś zasugerujecie? (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
!*!
post
Post #10





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Nie, bo nie sprawdziłeś czy formularz został wysłany. Zlicz znaki np strlen, haszuj hasło md5/sha1 ale nie sprawdzaj ile ma znaków bo zawsze będzie mieć tyle samo 32(md5) lub 40(sha1). Popraw walidację adresu email, bo co z tymi które pochodzą z subdomen? cokolwiek.cos@cos.zxc.pl
Go to the top of the page
+Quote Post
porywacz
post
Post #11





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


A jak sprawdzić czy formularz został wysłany? Myślałem, że sprawdzenie, czy istnieją dane pola w tablicy post jest jednoznaczne ze sprawdzeniem istnienia wysłanego formularza : O

O już działa wszystko. !*!, dziękuję, że mi to wyjaśniłeś (IMG:style_emoticons/default/biggrin.gif) Zapomniałem, że shashowałem hasło przed sprawdzeniem preg_match (IMG:style_emoticons/default/haha.gif) Wystarczyło przesunąć $password = md5($password) na koniec skryptu przed wprowadzeniem danych do bazy (IMG:style_emoticons/default/biggrin.gif)


Ten post edytował porywacz 9.04.2012, 17:37:56
Go to the top of the page
+Quote Post
!*!
post
Post #12





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Po co Ty sprawdzasz te hasło przez pregi? Wywal to,bo skoro je haszujesz, to i tak ma tylko [a-z0-9] pregi nie są od liczenia ilości znaków, a !@#$%^&*( są wręcz wskazane w haśle. Formularz sprawdzasz przez $_POST['tu_nazwa_inputa_zformularza_ktory_wysyla'];
Go to the top of the page
+Quote Post
porywacz
post
Post #13





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


Ehh nie zrozumiałeś ostatniego posta ;D Teraz te pregi nie sprawdzają zhashowanego hasła tylko te hasło, które zostało oryginalnie wprowadzone do inputa. Ale skoro to nie jest dobre rozwiązanie to jak sprawdzić ilość znaków w prawdziwym haśle (jeszcze nie zhashowanym) ?
Go to the top of the page
+Quote Post
!*!
post
Post #14





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Już Ci odpowiedziałem na to pytanie wyżej.
Go to the top of the page
+Quote Post
porywacz
post
Post #15





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


W takim razie coś takiego "ujdzie" ?

  1. $strlen_haslo = strlen($password);
  2.  
  3. if(
  4. preg_match('@^[a-z0-9]{6,12}$@',$login)
  5. &&
  6. $strlen_haslo > 6
  7. &&
  8. $password == $password_rep
  9. &&
  10. preg_match('/^[a-z0-9]{3,20}@[a-z0-9]{2,8}.[a-z]{2,5}$/',$email)
  11. &&
  12. $email == $email_rep) {


Ten post edytował porywacz 9.04.2012, 17:59:06
Go to the top of the page
+Quote Post
markonix
post
Post #16





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Napisz to od nowa bo jeżeli to nie robisz tylko dla treningu to userbility tego kuleje.
Czemu?
Walisz całą weryfikacje do jednego warunku - czy ktoś wpiszę zły e-mail albo za krótkie hasło to będzie mu się wyświetlał ten sam błąd.
Jak lepiej?
Pomijając rzucanie wyjątków itp. najprostszy sposób to tablica $errors i taki system:
  1. if ($strlen_haslo < 6)
  2. $errors[] = 'Zbyt krótkie hasło';
  3. if (KOLEJNY WARUNEK)
  4. $errors[] = 'KOLEJNY BŁĄD';
  5.  
  6. if (count($errors))
  7. // wyświetl błędy
  8. else
  9. // dokonaj rejestracji


Potem count i foreach, którym wyświetlisz wszystkie błędy (np. w akapitach z klasą error).

Do walidacji e-mail stosuj filter_var, a nie wyrażeń regularnych.

Ten post edytował markonix 9.04.2012, 18:09:18
Go to the top of the page
+Quote Post
porywacz
post
Post #17





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


Markonix, dzięki za pomoc. Tobie także, !*! (IMG:style_emoticons/default/smile.gif)
Już wszystko działa jak należy. YEAH (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
!*!
post
Post #18





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat(porywacz @ 9.04.2012, 18:58:37 ) *
W takim razie coś takiego "ujdzie" ?

  1. $strlen_haslo = strlen($password);
  2.  
  3. if(
  4. preg_match('@^[a-z0-9]{6,12}$@',$login)
  5. &&
  6. $strlen_haslo > 6
  7. &&
  8. $password == $password_rep
  9. &&
  10. preg_match('/^[a-z0-9]{3,20}@[a-z0-9]{2,8}.[a-z]{2,5}$/',$email)
  11. &&
  12. $email == $email_rep) {


Niczego nie zrozumiałeś. Ujdzie, ale to nie znaczy że jest dobrze, przeciwnie.
Go to the top of the page
+Quote Post
porywacz
post
Post #19





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 16.03.2012
Skąd: Austria

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


Wiem, że nie jest tak dobrze, dlatego napisałem wszystko od nowa tak jak napisał markonix ^^
Tutaj skrypt:

  1. <?php
  2. $login = $_POST['login'];
  3. $password = $_POST['password'];
  4. $password_rep = $_POST['password_rep'];
  5. $email = $_POST['email'];
  6. $email_rep = $_POST['email_rep'];
  7.  
  8. $db = mysql_connect('localhost','root','') or die('Nie udało się połączyć z serwerem :(');
  9. $db = mysql_select_db('uzytkownicy');
  10.  
  11. $sprawdz_login = mysql_fetch_array(mysql_query("select count(*) from uzytkownicy where login = '$login' limit 1"));
  12. $sprawdz_email = mysql_fetch_array(mysql_query("select count(*) from uzytkownicy where email = '$email' limit 1"));
  13.  
  14. if( !empty($login)
  15. &&
  16. !empty($password)
  17. &&
  18. !empty($password_rep)
  19. &&
  20. !empty($email)
  21. &&
  22. !empty($email_rep)
  23. ) {
  24. if($sprawdz_login[0] >= 1) {
  25. $errors .= 'Ta nazwa użytkownika jest już zajęta<br/>';}
  26. if($sprawdz_email[0] >= 1) {
  27. $errors .= 'Taki email jest już zajęty<br/>';}
  28. if(strlen($password) < 6) {
  29. $errors .= 'Twoje hasło jest za krótkie<br/>';}
  30. if(strlen($login) < 6){
  31. $errors .= 'Twój login jest za krótki<br/>';}
  32. if(strlen($login) > 14) {
  33. $errors .= 'Twój login jest za długi<br/>';}
  34. if(!preg_match('/[a-z]/',$login)){
  35. $errors .= 'Twój login musi zawierać litery<br/>';}
  36. if($password !== $password_rep) {
  37. $errors .= 'Hasła się nie zgadzają<br/>';}
  38. if($email !== $email_rep) {
  39. $errors .= 'E-maile się nie zgadzają<br/>';}
  40.  
  41. if (count($errors)) {
  42. echo('Rejestracja nie powiodła się. Wystąpiły następujące błędy: <br/>'.$errors);
  43. } else {
  44. $password = md5($password);
  45. $password_rep = md5($password_rep);
  46. $query = mysql_query("INSERT INTO uzytkownicy (login, haslo, email) VALUES('$login','$password','$email')") or die('Nie udało się umieścić values w tabeli');
  47. }
  48. } else {
  49. echo('Rejestracja nie powiodła się. Wystąpiły następujące błędy: <br/>Wypełnij wszystkie pola !');
  50. } ?>


Może nie jest idealnie ale ważne, że działa. Akurat na tym chciałem się skupić, ponieważ jest to mój pierwszy skrypt rejestracji (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
!*!
post
Post #20





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Prawie, sprawdź czy formularz został wysłany i zobacz jakie są różnice między empty() a isset(), sprawdzaj też czy zmienne to stringi, a i nie musisz robić połączenia na początku z bazą, rób je np. gdy login zostaje przesłany. Sprawdzaj to co jest potrzebne w danym momencie. No i teraz nie sprawdzasz czy email jest poprawny?(IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 14:31