Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Formularz - wykrywanie pustych inputów, określenie znaków
Forum PHP.pl > Forum > Przedszkole
StadiPL
Witam
Mam pewien problem i nie potrafię znaleźć rozwiązania na internecie. Chciałem zacząć powoli i małymi kroczkami robić sobie system kont i logowania. Zrobiłem sobie prosty formularz w HTLM i zacząłem pisać do niego odpowiedni kod PHP. Mój kod potrafi już sprawdzić czy hasło oraz jego powtórzenie się zgadza (to samo z e-mailem), jednak zauważyłem przy testach że mogę równie dobrze zostawić pola puste i też będzie się to zgadzać (logiczne). Moje pytania są następujące:
Jak sprawdzać czy pole nie jest puste?
Jak ograniczyć użytkownika aby mógł wpisać tylko wybrane przezemnie znaki?
Jak sprawdzić czy email jest poprawny? tzn czy posiada @ i domene
Dołączam kody:
  1. Rejestruj się:
  2. <form action="register_function.php" method="post">
  3. nick: <input type="text" name="nickname" /><br />
  4. haslo: <input type="password" name="password" /><br />
  5. powtorz haslo: <input type="password" name="password_r" /><br />
  6. email: <input type="text" name="email" /><br />
  7. powtorz email: <input type="text" name="email_r" /><br />
  8. <input type="submit" value="Rejestruj" />
  9. </form>

  1. <?php
  2. if ($_POST['password'] === $_POST['password_r']) {
  3. if ($_POST['email'] === $_POST['email_r']) {
  4. echo "GIT";
  5. } else {echo "Podane adresy email nie sa identyczne"; }
  6. } else {echo "Podane hasla nie sa identyczne"; }
  7. ?><br />
Szymciosek
1) W html5 (może i wcześniej) wprowadzono required
<input type="text" name="username" required />

2) Regexp
3) Regexp (email)
session
Cytat
Jak sprawdzać czy pole nie jest puste?

required to bajer najlepiej jeszcze:
  1. if(empty($_POST['nickname'])){echo'Wypełnij wszystkie wymagane pola';} // I tak dla wszystkich wymaganych

Cytat
Jak ograniczyć użytkownika aby mógł wpisać tylko wybrane przezemnie znaki?

Jak kolega wyżej napisał: wyrażenia regularne i funkcja preg_match
Cytat
Jak sprawdzić czy email jest poprawny?

Najlepiej mało znanym:
  1. if(!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)){echo'Nieprawidłowy adres email';}


PS. Nie używaj operatora === (zarezerwowoanego dla typów bool) do porównań tylko: == wink.gif
StadiPL
Spoko, tylko jak dokładnie to wstawić, bo jak dam tak to wyświetli że mam uzupełnić, ale mimo to wykona dalej :/
  1. <?php
  2. if(empty($_POST['nickname'])){echo'Wypełnij wszystkie wymagane pola';}
  3. if ($_POST['password'] === $_POST['password_r']) {
  4. if ($_POST['email'] === $_POST['email_r']) {
  5. echo "GIT";
  6. } else {echo "Podane adresy email nie sa identyczne"; }
  7. } else {echo "Podane hasla nie sa identyczne"; }
  8. ?>

reszte waszych odpowiedzi sprawdze zaraz/jak uporam sie z tym ;d
nikestylex7
  1. <?php
  2. if(empty($_POST['nickname'])){
  3. echo'Wypełnij wszystkie wymagane pola';
  4. }else if(empty($_POST['password']) || empty($_POST['password_r'])){
  5. echo'Wypełnij wszystkie wymagane pola';
  6. }else if($_POST['password'] != $_POST['password_r']){
  7. echo'Hasła różnią się!';
  8. }
  9. // i tak dalej to tylko przykład żeby Cię nakierować :)
  10. ?>
StadiPL
Ok, to zorumiem. jezeli nick jest pusty wyswietla echo, jak nie to jedzie dalej itd... tylko gdzie jak sprawdzi calosc i okaze sie ze wszystko jest ok to ma wykonac reszte kodu (w moim przypadku jak na razie to echo "git";). Gdzie to wstawić? ;] robie tak:
  1. <?php
  2. if(empty($_POST['nickname'])){echo'Podanie nazwy uzytkownika jest wymagane';}
  3. else if(empty($_POST['password']) || empty($_POST['password_r'])){echo'Podanie hasla i jego powtorzenie jest wymagane';}
  4. else if($_POST['password'] != $_POST['password_r']){echo'Podane hasla roznia sie';}
  5. else if(empty($_POST['email']) || empty($_POST['email_r'])){echo'Podanie e-maila i jego powtorzenie jest wymagane';}
  6. else if($_POST['email'] != $_POST['email_r']){echo'Podane e-maile roznia sie';}
  7. echo "GIT";
  8. ?>
nikestylex7
  1. <?php
  2. if(empty($_POST['nickname'])){
  3. echo'Podanie nazwy uzytkownika jest wymagane';
  4. }
  5. else if(empty($_POST['password']) || empty($_POST['password_r'])){
  6. echo'Podanie hasla i jego powtorzenie jest wymagane';
  7. }
  8. else if($_POST['password'] != $_POST['password_r']){
  9. echo'Podane hasla roznia sie';
  10. }
  11. else if(empty($_POST['email']) || empty($_POST['email_r'])){
  12. echo'Podanie e-maila i jego powtorzenie jest wymagane';
  13. }
  14. else if($_POST['email'] != $_POST['email_r']){
  15. echo'Podane e-maile roznia sie';
  16. }else{
  17. echo "GIT";
  18. }
  19. ?>
StadiPL
Gdzieś wyczytałem że ! ma zrobić "zaprzeczenie". Czyli empty normalnie zwraca gdy pusty, a !empty wyswietla gdy jest rozny od pustego. Zgodnie z tą myślą zrobiłem coś takiego:
  1. <?php
  2. if(empty($_POST['nickname'])){echo'Podanie nazwy uzytkownika jest wymagane';}
  3. else if(empty($_POST['password']) || empty($_POST['password_r'])){echo'Podanie hasla i jego powtorzenie jest wymagane';}
  4. else if($_POST['password'] != $_POST['password_r']){echo'Podane hasla roznia sie';}
  5. else if(empty($_POST['email']) || empty($_POST['email_r'])){echo'Podanie e-maila i jego powtorzenie jest wymagane';}
  6. else if($_POST['email'] != $_POST['email_r']){echo'Podane e-maile roznia sie';}
  7. else if(!preg_match('/^[a-zA-Z0-9]$/D', $_POST['nickname'])) {echo "nie ok";}
  8. else { echo "GIT"; }

Oczywiście niestety nie działa. Czegos nie rozumiem, czy to z wykrzyknikiem to nieprawda?
nikestylex7
wykrzyknik z if empty czyli jeśli jest puste zrobi jeśli nie jest puste (if !empty) czyli jak chcesz to zastosować to tylko do czegoś co nie ma być puste czyli możesz użyć to do naszego przykładu np:

  1. if(!empty($_POST['nickname']){
  2. echo"Jest Nick";
  3. }
StadiPL
Zauważyłem że to jednak nie ja mam złe myślenie tylko coś jest nie tak z moją funkcją preg_match. Wygląda ona następująco:
  1. <?php
  2. if(!preg_match('/^[a-zA-Z0-9]$/D', $_POST['nickname'])) {echo "nie ok";}
  3. else { echo "GIT"; }
  4. ?>

Gdy nickname to "a" wyświetla "GIT", gdy nickname to np. "stadi" wyświetla "nie ok". Nie rozumiem dlaczego.. część /^[a-zA-Z0-9]$/D wykonałem dokładnie tak jak na internecie. Powinna ona sprawić że znaki użyte w nickname muszą być z przedziału od a do z (duże lub małe) lub/oraz od 0 do 9. Dlaczego zatem coś się psuje i działa dobrze gdy nickname jest jednoznakowy (pasujący do klucza), a nie działa gdy nickname składa się z wielu znaków (także pasujących do podanego klucza)?
EDIT: to samo tyczy sie polskich znakow
nikestylex7
  1. if(strlen($_POST['nickname']) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $_POST['nickname'])) {
  2. echp"klapa";
  3. }else{
  4. echo"git";
  5. }


sprawdz to od razu sprawdza czy nick ma wiecej niż 3 znaki smile.gif
StadiPL
Jako że w tym temacie wszystko już jest ogarnięte, to wrzucam efekt końcowy ;] Może komuś się przyda do przeanalizowania
register.php
  1. Rejestruj się:
  2. <form action="register_function.php" method="post">
  3. nick: <input type="text" name="nickname" />(Powyżej 3 zaków. Dozwolone: a-z A-Z 0-9. Bez polskich liter)<br />
  4. haslo: <input type="password" name="password" />(Powyżej 3 zaków. Dozwolone: a-z A-Z 0-9. Bez polskich liter)<br />
  5. powtorz haslo: <input type="password" name="password_r" /><br />
  6. email: <input type="text" name="email" /><br />
  7. powtorz email: <input type="text" name="email_r" /><br />
  8. <input type="submit" value="Rejestruj" />
  9. </form>

register_function.php
  1. <?php
  2. $no_nickname="Podanie nazwy uzytkownika jest wymagane";
  3. $no_password="Podanie hasla i jego powtorzenie jest wymagane";
  4. $different_password="Podane hasla roznia sie'";
  5. $no_email="Podanie e-maila i jego powtorzenie jest wymagane";
  6. $different_email="Podane e-maile roznia sie";
  7. $bad_nickname="Niedozwolona nazwa uzytkownika";
  8. $bad_password="Niedozwolone haslo";
  9. $bad_email="Nieprawidłowy adres email";
  10.  
  11. if(empty($_POST['nickname'])){$no_nickname;}
  12. else if(empty($_POST['password']) || empty($_POST['password_r'])){echo $no_password;}
  13. else if($_POST['password'] != $_POST['password_r']){echo $different_password;}
  14. else if(empty($_POST['email']) || empty($_POST['email_r'])){echo $no_email;}
  15. else if($_POST['email'] != $_POST['email_r']){echo $different_email;}
  16. else if(strlen($_POST['nickname']) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $_POST['nickname'])) {echo $bad_nickname;}
  17. else if(strlen($_POST['password']) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $_POST['password'])) {echo $bad_password;}
  18. else if(!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)){echo $bad_email;}
  19. else{echo"git";}
  20. ?>
Szymciosek
Nie robisz żadnych wcięć tylko tak wszystko w jednej linii zawsze?

  1. <?php
  2. $no_nickname="Podanie nazwy uzytkownika jest wymagane";
  3. $no_password="Podanie hasla i jego powtorzenie jest wymagane";
  4. $different_password="Podane hasla roznia sie'";
  5. $no_email="Podanie e-maila i jego powtorzenie jest wymagane";
  6. $different_email="Podane e-maile roznia sie";
  7. $bad_nickname="Niedozwolona nazwa uzytkownika";
  8. $bad_password="Niedozwolone haslo";
  9. $bad_email="Nieprawidłowy adres email";
  10.  
  11. if(empty($_POST['nickname']))
  12. {
  13. $no_nickname;
  14. }
  15. else if(empty($_POST['password']) || empty($_POST['password_r']))
  16. {
  17. echo $no_password;
  18. }
  19. else if($_POST['password'] != $_POST['password_r'])
  20. {
  21. echo $different_password;
  22. }
  23. else if(empty($_POST['email']) || empty($_POST['email_r']))
  24. {
  25. echo $no_email;
  26. }
  27. else if($_POST['email'] != $_POST['email_r'])
  28. {
  29. echo $different_email;
  30. }
  31. else if(strlen($_POST['nickname']) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $_POST['nickname']))
  32. {
  33. echo $bad_nickname;
  34. }
  35. else if(strlen($_POST['password']) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $_POST['password']))
  36. {
  37. echo $bad_password;
  38. }
  39. else if(!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
  40. {
  41. echo $bad_email;
  42. }
  43. else
  44. {
  45. echo"git";
  46. }
  47. ?>


Co do zmiennych zawierających tekst błędu, to trzymałbym to osobiście w jakiejś osobnej klasie i umieściłbym je tam jako stałe.

Dodatkowo z tego co mi wiadomo nie używa się już <br /> na rzecz css.

Teraz powyższy kod może Ci się wydawać trochę chaotyczny, ale w przyszłości na pewno nie poprzestaniesz tylko na echo.
session
Widze, że wszystko już zostało wyjaśnione, ale odnosząc się jeszcze do pierwszego postu:
  1. if ($_POST['password'] == $_POST['password_r']) {
  2. if ($_POST['email'] == $_POST['email_r']) {
  3. if(!empty($_POST['nickname'])){
  4. echo "GIT";
  5. } else {echo "Wypełnij wszystkie wymagane pola"; }
  6. } else {echo "Podane adresy email nie sa identyczne"; }
  7. } else {echo "Podane hasla nie sa identyczne"; }
  8. ?>

W celu zachowania spójności można by to też w taki sposób zapisać, chociaż poprawność tego kodu jest dyskusyjna (to tylko dla ścisłości). Stosowanie jak w powyższym przykładzie elseif nie jest też do końca dobre dla użytkownika, ponieważ jeśli nie wypełni pierwszego pola, źle przepisze hasła, użyje niedozwolonych znaków w haśle i w nicku, zapomni o domenie w adresie email, będzie musiał wypełniać formularz 6 razy za każdym razem przepisując dwa razy hasła, jak nie cały formularz to krew go zaleje i to przy założeniu, że nie pomyli się gdzieś w trakcie, więc prędzej się nie zarejestruje. Błędy należy wyświetlać wszystkie jednocześnie, więc konstrukcja: if {} if{} do tego należy dodać $error=false; i zmieniać jej wartość na true jeśli wystąpi bład, a na końcu:
  1. if(!$error){echo 'Jest git';}
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.