Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Walidacja formularza
Forum PHP.pl > Forum > Przedszkole
rossco
Hejka,

jak zrobić walidacje formularza tak żeby po za komunikatem typu 'nie wypełniony np nick' zaznaczał pola nie wypełnione zmieniając czcionkę danego pola na czerwono.
Wtedy wystarczył by jeden komunikat 'proszę uzupełnić pola zaznaczone na czerwono'

W tej chwili mój formularz wygląda następująco:

  1. <HTML>
  2. <HEAD>
  3. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
  4. <TITLE>System Ogłoszeń</TITLE>
  5. </HEAD>
  6. <BODY>
  7. <H2>Ogłoszenia</H2>
  8. <?php
  9. mysql_connect ("*****", "osobliwi5", "*****") or //staramy połączyć się z bazą danych
  10. die ("Nie można połączyć się z bazą MySQL"); //jeżeli to się nie uda wyświetlamy
  11. mysql_select_db ("*****") or //wybieramy bazę
  12. die ("Nie można połączyć się z bazą ogloszenia");
  13. mysql_query("SET NAMES utf-8");
  14. mysql_query("SET NAMES utf8");
  15. mysql_query("SET CHARACTER SET utf8");
  16. mysql_query("SET collation_connection = utf8_polish_ci");
  17. $id=$_GET["id"];
  18. $tresc = $_POST["tresc"];
  19. $stanowisko = $_POST["stanowisko"];
  20. $nazwa_firmy = $_POST["nazwa_firmy"];
  21. $miejscowosc_zatrudnienia = $_POST["miejscowosc_zatrudnienia"];
  22.  
  23. if(!isset($_GET["id"])) { //odbieramy wartość zmiennej id
  24. print"<A HREF=\"index.php?id=nowy\">Dodaj nowe Ogłoszenie</A><HR>"; //jeżeli zmienna id nie ma przypisanej wartości
  25. $wynik = mysql_query ("SELECT * FROM ogloszenia WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone ogłoszenia i segregujemy według pola nr od wartości największej do najmniejszej
  26. print"<UL>";
  27. while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
  28. print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3].", ".$rekord[5] = stripslashes($rekord[5]).", ".$rekord[6] = stripslashes($rekord[6])."</LI>"; //w pętli while wyświetlamy po kolei wszytskie ogłoszenia w kolejności treść, stanowisko (stanowisko), data
  29. }
  30. print"</UL>";
  31. }elseif ($_GET["id"]=='nowy') { //jeżeli zmienna id zawiera wyraz nowy
  32. print "<HR>"; //wyświetlamy formularz do wpisania ogłoszenia
  33. print "<H3>Nowe ogłoszenie:</H3>";
  34. print "<FORM METHOD=POST action=\"index.php?id=dodaj\"><INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"dodaj\">";
  35. print "<B>Nazwa firmy:</B><BR><INPUT TYPE=\"text\" NAME=\"nazwa_firmy\" VALUE=\"$nazwa_firmy\" SIZE=60><BR>";
  36. print "<B>Miejscowość zatrudnienia:</B><BR><INPUT TYPE=\"text\" NAME=\"miejscowosc_zatrudnienia\" VALUE=\"$miejscowosc_zatrudnienia\" SIZE=60><BR>";
  37. print "<B>Stanowisko:</B><BR><INPUT TYPE=\"text\" NAME=\"stanowisko\" VALUE=\"$stanowisko\" SIZE=60><BR>";
  38. print "<B>Treść ogłoszenia:</B><BR><TEXTAREA NAME=\"tresc\" ";
  39. print "ROWS=10 COLS=60>$tresc</TEXTAREA><BR>";
  40. print "<INPUT TYPE=\"submit\" VALUE=\"Wyslij\">";
  41. print "</FORM>";
  42. print "<a href=\"index.php\">Powrót</a>";
  43. }elseif ($_GET["id"]=='dodaj') { // jeżeli zmienna id zawiera wartość dodaj
  44. //dodajemy ogłoszenie do bazy
  45. $tresc = addslashes(nl2br(htmlentities ($tresc))); //ponieważ nie można ufać danym wprowadzanym przez użytkowników funkcją addslashes dodajemy ukośniki () w miejscach gdzie napotkanym na apostrof (‘), usuwamy je potem funkcją stripslahes przy wypisywaniu komentarzy, dodatkowo funkcja nl2br zamienia znaki końca linii na tag br
  46. $stanowisko = addslashes(htmlentities ($stanowisko));
  47.  
  48. if ($tresc = $_POST["tresc"] && $stanowisko = $_POST["stanowisko"]) { //jeżeli pola treść i stanowisko są uzupełnione
  49. $zapytanie = "INSERT INTO ogloszenia (tresc, stanowisko, nazwa_firmy, miejscowosc_zatrudnienia, "." data) VALUES ('$tresc', '$stanowisko', '$nazwa_firmy', '$miejscowosc_zatrudnienia', "." now());";
  50. $wynik = mysql_query ($zapytanie); //dodajemy wtedy dane do bazy wraz z aktualną datą i godziną – funkcja now()
  51. print "<HR>";
  52. print"<H4>Twoje ogłoszenie zostało dodane do bazy. Ukaże się, gdy administrator je zatwierdzi</h4><br>"; //jeżeli wszystko przebiegnie bez problemów wyświetlamy komunikat
  53. print"<a href=\"index.php\">Powrót</a>";
  54. }else{ //jeżeli jednak nie wyświetlamy stosowną informację
  55. print "<HR>";
  56. print"<h4>Pola stanowisko i treść muszą być wypełnione ! Kliknij wstecz w swojej przeglądarce i popraw te dane !</h4>";
  57. }
  58. }else { //jeżeli zmienna id zawiera inną wartość niż dodaj lub nowy wyświetlamy wszystkie zatwierdzone ogłoszenia
  59. print"<A HREF=\"index.php?id=nowy\">Dodaj nowe ogłoszenia</A><HR>";
  60. $wynik = mysql_query ("SELECT * FROM ogloszenia WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone ogłoszenia i segregujemy według pola nr od wartości największej do najmniejszej
  61. print"<UL>";
  62. while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
  63. print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3].", ".$rekord[5] = stripslashes($rekord[5])."</LI>"; //za pomocą pętli while wyświetlamy wszystkie rekordy, które zostały zatwierdzone (wartość pola zatwierdz wynosi 1)
  64. }
  65. print"</UL>";
  66. }
  67. ?>
  68. </BODY>
  69. </HTML>
MateuszS
Odpowiedni warunek if z empty +

[JAVASCRIPT] pobierz, plaintext
  1. this.style.color = "red";
[JAVASCRIPT] pobierz, plaintext


Pawel_W
Cytat(MateuszScirka @ 21.03.2010, 16:09:32 ) *
Odpowiedni warunek if z empty +

[JAVASCRIPT] pobierz, plaintext
  1. this.style.color = "red";
[JAVASCRIPT] pobierz, plaintext

to jest javascript smile.gif a formularz waliduje się po stronie serwera

najprościej będzie nadać mu jakąś klasę np. zle i potem w css przypisać jej czerwony kolor
rossco
a możecie mi to wytłumaczyć na przykładzie jeśli będziecie na tylu uprzejmi smile.gif
MateuszS
Nom o to mi chodziło, można zrobić to na początku w JS lub potem w PHP, no jak kto woli, albo najlepiej tak i tak.

Rossco: choćby i tak:

  1. <?
  2. if(isset($_POST["nick"])) {
  3. if(empty($_POST["nick"]))
  4. {
  5. $border="border: 1px solid red";
  6. }
  7. }
  8. ?>
  9. <form action="" method="POST">
  10. <input type="text" id="nick" name="nick" style="<? echo $border; ?>" />
  11. <br /><input type="submit" value="wyslij" />
  12. </form>
  13.  
  14.  
  15.  
rossco
jak uważacie czy ja nie powinnam wywalić formularz z kodu php? jeśli tak to na co uważać żeby nie przestał działać?
MateuszS
Możesz zostawić, możesz wywalić, osobiście skłaniam się ku temu drugiemu wariantowi, tzn. ja bym wywalił, trochę to nieestetycznie wygląda, taka masa printów, nie widać kolorowania składni, można gdzieś się pomylić no i pewnie są jeszcze jakieś inne ważniejsze argumenty, uważaj przy tym żeby zamknąć tag php przed kodem HTML i otworzyć po tongue.gif.
rossco
jestem początkująca ale też mi się wydaje że powinnam wywalić formularz z php. Tylko on jest wrzucony w IF-a ($_GET["id"]=='nowy') i nie wiem za bardzo jak do tego się zabrać.
MateuszS
To nic że jest w ifie, będzie działało. Warunek zostanie zachowany
mortus
Niestety u Ciebie nie da się zrobić takiej walidacji, jaką chcesz, bo warunki w blokach if...elseif...else Cię nie puszczą. Dokładniej chodzi o to, że nie są w odpowiedniej kolejności. Myślę, że warto przemyśleć jeszcze raz kilka kwestii, np.:
1. kiedy wyświetlany jest formularz,
2. czy potrzebujemy tylu $_GET-ów,
3. co sprawdzamy najpierw (chodzi o to, czy formularz został wysłany, czy może pojawił się pierwszy raz),
4. itp...
Odnośnie wyświetlania formularza, to podpowiem, że powinien on być wyświetlany w którymś z końcowych warunków, albo nawet w zupełnie odrębnym bloku if.
Cytat
jak uważacie czy ja nie powinnam wywalić formularz z kodu php? jeśli tak to na co uważać żeby nie przestał działać?
Kod HTML można przeplatać z kodem php np.
  1. <?php
  2. if($_GET['id'] == 'nowy') {
  3. ?>
  4. <form action="..." method="post">
  5. ...
  6. </form>
  7. <?php
  8. }
  9. ?>
Możesz też formularz zapisać w osobnym pliku html i użyć funkcji include. Możesz napisać funkcję wstawiającą formularz. Każdy sposób jest dobry.
rossco
Zrobiłam tak:

formularz przeniosłam do pliku form.php
  1. //wyświetlamy formularz do wpisania ogłoszenia
  2. <H3>Nowe ogłoszenie:</H3>
  3. <FORM METHOD=POST action="index.php?id=dodaj"><INPUT TYPE="hidden" NAME="id" VALUE="dodaj">
  4. </B><BR><INPUT TYPE="text" NAME="nazwa_firmy" VALUE="<?$nazwa_firmy?>" SIZE=60><BR>
  5. <B>Miejscowość zatrudnienia:</B><BR><INPUT TYPE="text" NAME="miejscowosc_zatrudnienia" VALUE="<?$miejscowosc_zatrudnienia?>" SIZE=60><BR>
  6. <B>Stanowisko:</B><BR><INPUT TYPE="text" NAME="stanowisko" VALUE="<?$stanowisko?>" SIZE=60><BR>
  7. <B>Treść ogłoszenia:</B><BR><TEXTAREA NAME="tresc" "ROWS=10 COLS=60><?$tresc?></TEXTAREA><BR>
  8. <INPUT TYPE="submit" VALUE="Wyslij">
  9. </FORM>
  10. <a href="index.php">Powrót</a>


Dodałam include

  1. <HTML>
  2. <HEAD>
  3. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
  4. <TITLE>System Ogłoszeń</TITLE>
  5. </HEAD>
  6. <BODY>
  7. <H2>Ogłoszenia</H2>
  8. <?php
  9. mysql_connect ("*****", "osobliwi5", "*****") or //staramy połączyć się z bazą danych
  10. die ("Nie można połączyć się z bazą MySQL"); //jeżeli to się nie uda wyświetlamy
  11. mysql_select_db ("*****") or //wybieramy bazę
  12. die ("Nie można połączyć się z bazą ogloszenia");
  13. mysql_query("SET NAMES utf-8");
  14. mysql_query("SET NAMES utf8");
  15. mysql_query("SET CHARACTER SET utf8");
  16. mysql_query("SET collation_connection = utf8_polish_ci");
  17. $id=$_GET["id"];
  18. $tresc = $_POST["tresc"];
  19. $stanowisko = $_POST["stanowisko"];
  20. $nazwa_firmy = $_POST["nazwa_firmy"];
  21. $miejscowosc_zatrudnienia = $_POST["miejscowosc_zatrudnienia"];
  22.  
  23. if(!isset($_GET["id"])) { //odbieramy wartość zmiennej id
  24. print"<A HREF=\"index.php?id=nowy\">Dodaj nowe Ogłoszenie</A><HR>"; //jeżeli zmienna id nie ma przypisanej wartości
  25. $wynik = mysql_query ("SELECT * FROM ogloszenia WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone ogłoszenia i segregujemy według pola nr od wartości największej do najmniejszej
  26. print"<UL>";
  27. while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
  28. print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3].", ".$rekord[5] = stripslashes($rekord[5]).", ".$rekord[6] = stripslashes($rekord[6])."</LI>"; //w pętli while wyświetlamy po kolei wszytskie ogłoszenia w kolejności treść, stanowisko (stanowisko), data
  29. }
  30.  
  31. if(isset($_POST["stanowisko"])) {
  32.  
  33. if(empty($_POST["stanowisko"]))
  34.  
  35. {
  36.  
  37. $border="border: 1px solid red";
  38.  
  39. }
  40.  
  41. }
  42. if(isset($_POST["stanowisko"])) {
  43.  
  44. if(empty($_POST["stanowisko"]))
  45.  
  46. {
  47.  
  48. $border="border-top: 1px solid red";
  49.  
  50. }
  51.  
  52. }
  53.  
  54. print"</UL>";
  55. }elseif ($_GET["id"]=='nowy') { //jeżeli zmienna id zawiera wyraz nowy
  56.  
  57. include("form.php");
  58.  
  59. }elseif ($_GET["id"]=='dodaj') { // jeżeli zmienna id zawiera wartość dodaj
  60. //dodajemy ogłoszenie do bazy
  61. $tresc = addslashes(nl2br(htmlentities ($tresc))); //ponieważ nie można ufać danym wprowadzanym przez użytkowników funkcją addslashes dodajemy ukośniki () w miejscach gdzie napotkanym na apostrof (‘), usuwamy je potem funkcją stripslahes przy wypisywaniu komentarzy, dodatkowo funkcja nl2br zamienia znaki końca linii na tag br
  62. $stanowisko = addslashes(htmlentities ($stanowisko));
  63.  
  64. if ($tresc = $_POST["tresc"] && $stanowisko = $_POST["stanowisko"]) { //jeżeli pola treść i stanowisko są uzupełnione
  65. $zapytanie = "INSERT INTO ogloszenia (tresc, stanowisko, nazwa_firmy, miejscowosc_zatrudnienia, "." data) VALUES ('$tresc', '$stanowisko', '$nazwa_firmy', '$miejscowosc_zatrudnienia', "." now());";
  66. $wynik = mysql_query ($zapytanie); //dodajemy wtedy dane do bazy wraz z aktualną datą i godziną – funkcja now()
  67. print "<HR>";
  68. print"<H4>Twoje ogłoszenie zostało dodane do bazy. Ukaże się, gdy administrator je zatwierdzi</h4><br>"; //jeżeli wszystko przebiegnie bez problemów wyświetlamy komunikat
  69. print"<a href=\"index.php\">Powrót</a>";
  70. }else{ //jeżeli jednak nie wyświetlamy stosowną informację
  71. print "<HR>";
  72. print"<h4>Pola stanowisko i treść muszą być wypełnione ! Kliknij wstecz w swojej przeglądarce i popraw te dane !</h4>";
  73. }
  74. }else { //jeżeli zmienna id zawiera inną wartość niż dodaj lub nowy wyświetlamy wszystkie zatwierdzone ogłoszenia
  75. print"<A HREF=\"index.php?id=nowy\">Dodaj nowe ogłoszenia</A><HR>";
  76. $wynik = mysql_query ("SELECT * FROM ogloszenia WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone ogłoszenia i segregujemy według pola nr od wartości największej do najmniejszej
  77. print"<UL>";
  78. while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
  79. print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3].", ".$rekord[5] = stripslashes($rekord[5])."</LI>"; //za pomocą pętli while wyświetlamy wszystkie rekordy, które zostały zatwierdzone (wartość pola zatwierdz wynosi 1)
  80. }
  81. print"</UL>";
  82. }
  83. ?>
  84. </BODY>
  85. </HTML>


O dziwo działa smile.gif oceńcie i powiedzcie co powinnam jeszcze zmienić.

I najważniejsze - czy przybliżyłam się chociaż o krok od możliwości zrobienia walidacji jaką opisałam?
MateuszS
Nie trzeba wszedzie sprawdzac tym issetem ;] Chodzi o to, że sprawdzamy czy formularz został wysłany, żeby od razu nie wyświetlał się ten czerwony border ;] Wystarczy jeden if z issetem który obejmuje cały kod który ma się wykonać po naciśnięciu submita
rossco

if(isset($_POST["stanowisko"])) {

Tu coś wpisuję?

if(empty($_POST["stanowisko"]))

{

$border="border-top: 1px solid red";

}

}

i co muszę wywalić w obecnym kodzie żeby walidację sobie nie przeszkadzały?
mortus
Cytat(MateuszScirka @ 21.03.2010, 17:42:13 ) *
Nie trzeba wszedzie sprawdzac tym issetem ;] Chodzi o to, że sprawdzamy czy formularz został wysłany, żeby od razu nie wyświetlał się ten czerwony border ;] Wystarczy jeden if z issetem który obejmuje cały kod który ma się wykonać po naciśnięciu submita
Chyba się mylisz, bo skąd będziemy wiedzieć, które pola oznaczyć, jeżeli będzie tylko jeden isset? Przecież nie każde pole trzeba wypełnić i nie wszystkie pola, które musimy wypełnić, muszą być puste po naciśnięciu submita.
@rossco Po pierwsze zwróć uwagę na te $_GET-y. Zauważ, że jeśli wybierzesz opcję dodania nowego ogłoszenia, to w $_GET['id'] masz wartość 'nowy' i wtedy wyświetlasz formularz. Ale gdy przyciśniesz przycisk 'Wyślij', to w $_GET['id'] masz wartość 'dodaj', formularz przechodzi walidację i jeśli nie wszystkie wymagane pola zostały wypełnione to znowu wyświetlasz formularz. Chyba trochę bez sensu, ale przyjmijmy, że tak ma być. A jeśli tak, to skrypt mniej więcej powinien wyglądać tak
  1. // sprawdzamy, czy użytkownik wcisnął przycisk wyślij
  2. if(!empty($_GET['id']) && $_GET['id'] == 'dodaj' && !empty($_POST)) {
  3. // formularz został wysłany - walidacja (tutaj na przykładzie pól tresc i stanowisko)
  4. if(!isset($_POST['tresc']) || $_POST['tresc'] == '') {
  5. $validation_error = true;
  6. $pusta_tresc = true;
  7. }
  8. if(!isset($_POST['stanowisko']) || $_POST['stanowisko'] == '') {
  9. $validation_error = true;
  10. $puste_stanowisko = true;
  11. }
  12. // jeżeli zatem wszystkie pola zostały wypełnione to
  13. if(!validation_error) {
  14. // pobieramy wszystkie pola z tablicy $_POST i wrzucamy ogłoszenie do bazy danych
  15. } else {
  16. // wrzucamy formularz
  17. include 'form.php';
  18. }
  19. } elseif(!empty($_GET['id'] && $_GET['id'] == 'nowy')) {
  20. // wrzucamy formularz
  21. include 'form.php';
  22. } else {
  23. // wyświetlamy listę ogłoszeń i udostępniamy możliwość dodania nowego ogłoszenia
  24. }
No i pola tresc i stanowisko w pliku form.php
  1. <input type="text" name="tresc" value="<?php if(!$pusta_tresc) echo $_POST['tresc']; ?>" <?php if($pusta_tresc) echo 'style="border: 1px solid red;"'; ?> /><br />
  2. <input type="text" name="stanowisko" value="<?php if(!$puste_stanowisko) echo $_POST['tresc']; ?>" <?php if($puste_stanowisko) echo 'style="border: 1px solid red;"'; ?> />
MateuszS
Mortus, nie mylę się. Isset ma sprawdzać tylko czy formularz został przesłany, równie dobrze może być (powinien) jeden isset na cały kod, który ma się wyk. po przesłaniu formularza. A za to czy pole się zaczerwieni, odpowiada warunek z empty.
rossco
Mortus ja się dopiero uczę i pewnie dlatego ten kod jest "bez sensu". Skoro tak to nie chce nabrać złych nawyków. Mi się wydaje że ten kod nie wykonuję się w dobrej kolejności. Podpowiedz mi proszę jak najlepiej Ty byś go napisał.
mortus
Cytat(MateuszScirka @ 21.03.2010, 18:38:34 ) *
Mortus, nie mylę się. Isset ma sprawdzać tylko czy formularz został przesłany, równie dobrze może być (powinien) jeden isset na cały kod, który ma się wyk. po przesłaniu formularza. A za to czy pole się zaczerwieni, odpowiada warunek z empty.
Właściwie to nie ma większego znaczenia to w jaki sposób będziemy sprawdzać, czy formularz został wysłany. Zarówno isset, jak i empty doskonale się do tego nadają. Tylko podaj mi źródło, w którym przeczytałeś, że powinien być jeden isset na cały kod. A jak sprawdzisz czy pole, w którym możemy wpisać 0, i które w ostateczności nie może być puste, rzeczywiście nie jest puste? Gwarantuję, że empty nie zadziała tak, jakbyśmy chcieli i musimy użyć isset (nawet dwukrotnie w jednym warunku). Przykładowy kod:
  1. <?php
  2. // zakładamy, że pole zmienna w formularzu ma być wypełnione i może być wypełnione 0 (zerem)
  3. if(!empty($_POST['zmienna'])) {
  4. echo '$_POST[\'zmienna=\'] is not empty<br/>';
  5. echo '<pre>';
  6. print_r($_POST);
  7. echo '</pre>';
  8. }
  9. ?>
  10. <html>
  11. <head>
  12. <meta name="content-type" content="text/html; charset=UTF-8" />
  13. </head>
  14. <body>
  15. <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
  16. <input type="text" name="zmienna" value="Spróbuj wpisać 0" /><br />
  17. <input type="submit" value="Zatwierdź" /><br />
  18. </form>
  19. </body>
  20. </html>
W moim odczuciu empty lepiej się nadaje do sprawdzenia, czy formularz został przesłany. Dlaczego? Dlatego, że tablica $_POST istnieje zawsze i dopóki nie prześlemy czegoś za pomocą metody post, tablica $_POST będzie pusta. Jeżeli natomiast prześlemy puste pole z ustawionym atrybutem name, to tablica $_POST już nie jest pusta, ale $_POST['nazwa_pola'] nadal jest puste i możemy użyć empty, żeby to sprawdzić. Tyle, że w wyżej opisanym przypadku empty nas "oszuka".

@rossco Powyżej Ci podałem jak, to mniej więcej powinno wyglądać. Z tym, że do pierwszego warunku można mieć uwagi. Skoro w formularzu przesyłasz ukryte pole o nazwie id i wartości dodaj, to zamiast
  1. if(!empty($_GET['id']) && $_GET['id'] == 'dodaj' && !empty($_POST))
możemy użyć tylko
  1. if(!empty($_POST))
A w akcji formularza nie potrzebujemy index.php?id=dodaj.
Oczywiście to jest tylko jeden ze sposobów rozwiązania kwestii walidacji (takiej, o jaką Tobie chodzi).
thek
Mortus jak widzę czuwa. I ma rację. $_POST to tablica superglobalna i wisi, więc jej wypełnienie musi być sprawdzane występowaniem któregoś z elementów zawartego w niej. Większość osób robi to sprawdzając istnienie submita o określonym name w nim. Ale count jest podstawowym dla mnie gdy mam formularz z kilkoma submitami. Bo przecież nie będę zgadywał który submit wcisnął user lub sprawdzał istnienie wszystkich. Za to zliczę ile mam wpisów w niej winksmiley.jpg Potem switchem mogę modyfikować zachowanie zależnie od submit już, ale sprawdzenie czy właściwie $_POST ma choć jeden element w zupełności wystarczy. Sugestia o isset jest dobra, ale można także używać array_key_exists('name_pola', $_POST) i to rozwiązanie ja stosuję najczęściej, bo nie wywali nam się, podobnie jak isset, na wartości 0, co już mortus zasugerował. Swoja drogą wariacje na temat Dodaj/Edytuj to tylko pierdółka tak naprawdę. Dlaczego? Bo to się realizuje jednym polem hidden. Ustawienie tam 0 = nowy, jakakolwiek liczba = id do edycji. Oczywiście id sprawdzamy po stronie serwera. A musimy sprawdzić czy aby nie brak uprawnień do działań. Wystarczająco się naoglądałem skryptów, gdzie user ma prawo edycji tekstów kogoś innego, bo sobie można spreparować POST lub GET i system nie sprawdza uprawnień winksmiley.jpg Ja takie "akcje" loguję by wiedzieć, który user cwaniakuje.

I ma rację mortus... Sposobów rozwiązania problemu jest więcej niż jedna. Ja osobiście skłaniam się do takiej:
- tworzymy strukturę przechowującą domyślne wartości pól.
- jeśli przechwyciliśmy GET sprawdzamy uprawnienia i zamiast domyślnych wrzucamy pobrane.
- jeśli wyłapujemy POST to walidacja idzie, zapis itp
- dopiero teraz wyświetlamy formularz z polami uzupełnionymi wartościami ze struktury wartości pól.

Czemu tak? Bo to nam kapitalnie upraszcza wszystko, włącznie z komunikatami błędów o formie jaką chcesz zastosować. Wystarczy, że stworzymy drugą strukturę, która przechowuje błędy. Jeśli w czasie walidacji napotkamy błąd, to wrzucamy do niej ów błąd z nazwą pola jako kluczem. A teraz cudujemy... Jeśli owa struktura jest pusta to robi się insert lub update. Jeśli zawiera choć jeden wpis ( count ) to operacje na bazie nie następują, a pod danym polem następuje sprawdzenie czy tablica błędów zawiera wpis o nazwie pola. Tak? No to wyświetlamy ów komunikat smile.gif
mortus
Cytat(thek @ 22.03.2010, 12:47:08 ) *
Sugestia o isset jest dobra, ale można także używać array_key_exists('name_pola', $_POST) i to rozwiązanie ja stosuję najczęściej, bo nie wywali nam się, podobnie jak isset, na wartości 0, co już mortus zasugerował.
isset na wartości zero się nie wywali, wywali się natomiast, jeżeli nie wpiszemy niczego, dlatego samo sprawdzenie
  1. if(isset($_POST['jakas_zmienna']))
nie wystarcza i musimy sprawdzać, czy ta zmienna nie jest pustym łańcuchem znaków
  1. if(isset($_POST['jakas_zmienna']) && $_POST['jakas_zmienna'] != '')
Oczywiście mówimy cały czas o danych przesyłanych za pomocą formularza (choć w przypadku zmiennych inicjowanych w samym skrypcie sprawa wygląda podobnie). Na wartości 0 na pewno wywali się empty, bo $zmienna = '0'; to nadal pusta (empty) zmienna.
Ogólnie to w rzeczywistości mamy tyle rozwiązań ilu programistów (choć pewnie większość rozwiązań będzie podobna, albo identyczna), jedyną kwestią jaką trzeba rozważyć jest natomiast wydajność, która i tak w przypadku samej walidacji formularza może się tylko nieznacznie różnić w różnych rozwiązaniach, no chyba, że ktoś to strasznie zamota.
rossco
Chyba na początek nauki w php (podejście trzecie:)) wybrałam za trudne zadanie. Przerobiłam skrypt, ale pokazuję się błąd w linijce 56 "
Parse error: syntax error, unexpected T_BOOLEAN_AND, expecting ')' in /ogloszenia/index.php on line 56" i podejrzewam że źle zastosowałam się to twoich wskazówek Mortus

  1. <?
  2.  
  3. mysql_connect ("*****", "*****", "*****") or //staramy połączyć się z bazą danych
  4. die ("Nie można połączyć się z bazą MySQL"); //jeżeli to się nie uda wyświetlamy
  5. mysql_select_db ("*****") or //wybieramy bazę
  6. die ("Nie można połączyć się z bazą ogloszenia");
  7. mysql_query("SET NAMES utf-8");
  8. mysql_query("SET NAMES utf8");
  9. mysql_query("SET CHARACTER SET utf8");
  10. mysql_query("SET collation_connection = utf8_polish_ci");
  11. $id=$_GET["id"];
  12. $tresc = $_POST["tresc"];
  13. $stanowisko = $_POST["stanowisko"];
  14. $nazwa_firmy = $_POST["nazwa_firmy"];
  15. $miejscowosc_zatrudnienia = $_POST["miejscowosc_zatrudnienia"];
  16.  
  17. // sprawdzamy, czy użytkownik wcisnął przycisk wyślij
  18.  
  19. if(!empty($_GET['id']) && $_GET['id'] == 'dodaj' && !empty($_POST)) {
  20.  
  21. // formularz został wysłany - walidacja (tutaj na przykładzie pól tresc i stanowisko)
  22.  
  23. if(!isset($_POST['tresc']) || $_POST['tresc'] == '') {
  24.  
  25. $validation_error = true;
  26.  
  27. $pusta_tresc = true;
  28.  
  29. }
  30.  
  31. if(!isset($_POST['stanowisko']) || $_POST['stanowisko'] == '') {
  32.  
  33. $validation_error = true;
  34.  
  35. $puste_stanowisko = true;
  36.  
  37. }
  38.  
  39. // jeżeli zatem wszystkie pola zostały wypełnione to
  40.  
  41. if(!validation_error) {
  42.  
  43. // pobieramy wszystkie pola z tablicy $_POST i wrzucamy ogłoszenie do bazy danych
  44. $zapytanie = "INSERT INTO ogloszenia (tresc, stanowisko, nazwa_firmy, miejscowosc_zatrudnienia, "." data) VALUES ('$tresc', '$stanowisko', '$nazwa_firmy', '$miejscowosc_zatrudnienia', "." now());";
  45. $wynik = mysql_query ($zapytanie); //dodajemy wtedy dane do bazy wraz z aktualną datą i godziną – funkcja now()
  46. print "<HR>";
  47.  
  48. } else {
  49.  
  50. // wrzucamy formularz
  51.  
  52. include ('form.php');
  53.  
  54. }
  55.  
  56. } elseif(!empty($_GET['id'] && $_GET['id'] == 'nowy')) {
  57.  
  58. // wrzucamy formularz
  59. include ('form.php');
  60.  
  61. } else {
  62.  
  63. // wyświetlamy listę ogłoszeń i udostępniamy możliwość dodania nowego ogłoszenia
  64.  
  65. print"<A HREF=\"index.php?id=nowy\">Dodaj nowe ogłoszenia</A><HR>";
  66. $wynik = mysql_query ("SELECT * FROM ogloszenia WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone ogłoszenia i segregujemy według pola nr od wartości największej do najmniejszej
  67. print"<UL>";
  68. while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
  69. print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3].", ".$rekord[5] = stripslashes($rekord[5])."</LI>"; //za pomocą pętli while wyświetlamy wszystkie rekordy, które zostały zatwierdzone (wartość pola zatwierdz wynosi 1)
  70. }
  71. print"</UL>";
  72.  
  73.  
  74. }
  75. ?>



Jeśli można to proszę o podpowiedzi co źle zrobiłam
mortus
Po prostu jeden nawias w linii 56 zamyka nie to co powinien, bo zamyka if-a, a powinien zamknąć empty.
thek
Błąd masz prozaiczny:
  1. elseif(!empty($_GET['id'] && $_GET['id'] == 'nowy')) {

a powinno być:
  1. elseif(!empty($_GET['id']) && $_GET['id'] == 'nowy') {

Nie w tym miejscu nawias... Nie można wewnątrz empty pchać czego popadnie.

Mortus... My znamy różnice między empty, array_key_exists i isset, ale wielu się na tym wykłada niestety i mają problemy ze stosowaniem w praktyce. Nie wspomniałem oczywiście, że poprzestaję na samym isset czy samym empty, ale wszystko zależy od potrzeby.

mortus
Dokładnie! Wszystko zależy od potrzeby, założeń, czy specyfikacji projektu.
Cytat
Nie można wewnątrz empty pchać czego popadnie.
Myślę, że to raczej przez nieuwagę, aniżeli z premedytacją.

@rossco daj znać, czy działa?
rossco
SUPER smile.gif Walidacja działa, ale przestało dodawać do bazy:(
mortus
W linii 22 wpisz $validation_error = false; Poza tym kod z linii 12, 13, 14 i 15 powinien być w innym miejscu, a dokładniej w linii 42.
EDIT:
I ma śmigać smile.gif
rossco
Zastosowałam się do wskazówek ale nadal nie dodaję sad.gif

plik formularza:
  1. <HTML>
  2. <HEAD>
  3. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
  4. <TITLE>System Ogłoszeń</TITLE>
  5. </HEAD>
  6. <BODY>
  7. <H2>Ogłoszenia</H2>
  8. <?
  9.  
  10. mysql_connect ("*****", "*****", "*****") or //staramy połączyć się z bazą danych
  11. die ("Nie można połączyć się z bazą MySQL"); //jeżeli to się nie uda wyświetlamy
  12. mysql_select_db ("*****") or //wybieramy bazę
  13. die ("Nie można połączyć się z bazą ogloszenia");
  14. mysql_query("SET NAMES utf-8");
  15. mysql_query("SET NAMES utf8");
  16. mysql_query("SET CHARACTER SET utf8");
  17. mysql_query("SET collation_connection = utf8_polish_ci");
  18. $id=$_GET["id"];
  19.  
  20. // sprawdzamy, czy użytkownik wcisnął przycisk wyślij
  21.  
  22. if(!empty($_GET['id']) && $_GET['id'] == 'dodaj' && !empty($_POST)) {
  23.  
  24. // formularz został wysłany - walidacja (tutaj na przykładzie pól tresc i stanowisko)
  25.  
  26. $validation_error = false;
  27.  
  28. if(!isset($_POST['tresc']) || $_POST['tresc'] == '') {
  29.  
  30. $validation_error = true;
  31.  
  32. $pusta_tresc = true;
  33.  
  34. }
  35.  
  36. if(!isset($_POST['stanowisko']) || $_POST['stanowisko'] == '') {
  37.  
  38. $validation_error = true;
  39.  
  40. $puste_stanowisko = true;
  41.  
  42. }
  43.  
  44. // jeżeli zatem wszystkie pola zostały wypełnione to
  45.  
  46. if(!validation_error) {
  47. $tresc = $_POST["tresc"];
  48. $stanowisko = $_POST["stanowisko"];
  49. $nazwa_firmy = $_POST["nazwa_firmy"];
  50. $miejscowosc_zatrudnienia = $_POST["miejscowosc_zatrudnienia"];
  51. // pobieramy wszystkie pola z tablicy $_POST i wrzucamy ogłoszenie do bazy danych
  52. $zapytanie = "INSERT INTO ogloszenia (tresc, stanowisko, nazwa_firmy, miejscowosc_zatrudnienia, "." data) VALUES ('$tresc', '$stanowisko', '$nazwa_firmy', '$miejscowosc_zatrudnienia', "." now());";
  53. $wynik = mysql_query ($zapytanie); //dodajemy wtedy dane do bazy wraz z aktualną datą i godziną – funkcja now()
  54. print "<HR>";
  55.  
  56. } else {
  57.  
  58. // wrzucamy formularz
  59.  
  60. print "Uzupełniji pola zaznaczone na czerono";
  61. include ('form.php');
  62.  
  63. }
  64.  
  65. } elseif(!empty($_GET['id']) && $_GET['id'] == 'nowy') {
  66.  
  67. // wrzucamy formularz
  68. include ('form.php');
  69.  
  70. } else {
  71.  
  72. // wyświetlamy listę ogłoszeń i udostępniamy możliwość dodania nowego ogłoszenia
  73.  
  74. print"<A HREF=\"index.php?id=nowy\">Dodaj nowe ogłoszenia</A><HR>";
  75. $wynik = mysql_query ("SELECT * FROM ogloszenia WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone ogłoszenia i segregujemy według pola nr od wartości największej do najmniejszej
  76. print"<UL>";
  77. while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
  78. print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3].", ".$rekord[5] = stripslashes($rekord[5])."</LI>"; //za pomocą pętli while wyświetlamy wszystkie rekordy, które zostały zatwierdzone (wartość pola zatwierdz wynosi 1)
  79. }
  80. print"</UL>";
  81.  
  82.  
  83. }
  84. ?>
  85.  
  86.  
  87. </BODY>
  88. </HTML>



Plik form.php

  1. <HTML>
  2. <HEAD>
  3. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
  4. <TITLE>System Ogłoszeń</TITLE>
  5. </HEAD>
  6. <BODY>
  7. <H3>Nowe ogłoszenie:</H3>
  8. <FORM METHOD=POST action="index.php?id=dodaj"><INPUT TYPE="hidden" NAME="id" VALUE="dodaj">
  9. <BR>Nazwa firmy:</B><br /><BR><INPUT TYPE="text" NAME="nazwa_firmy" VALUE="<?$nazwa_firmy?>" SIZE=60><BR>
  10. <B>Miejscowość zatrudnienia:</B><BR><INPUT TYPE="text" NAME="miejscowosc_zatrudnienia" VALUE="<?$miejscowosc_zatrudnienia?>" SIZE=60><BR>
  11. <B>Stanowisko:</B><br /><BR><input type="text" name="tresc" value="<?php if(!$pusta_tresc) echo $_POST['tresc']; ?>" <?php if($pusta_tresc) echo 'style="border: 1px solid red;"'; ?> /><br />
  12. <B>Treść ogłoszenia:</B><br /><input type="text" name="stanowisko" value="<?php if(!$puste_stanowisko) echo $_POST['stanowisko']; ?>" <?php if($puste_stanowisko) echo 'style="border: 1px solid red;"'; ?> />
  13. <INPUT TYPE="submit" VALUE="Wyslij">
  14. </FORM>
  15. <a href="index.php">Powrót</a>
  16. </BODY>
  17. </HTML>


mortus
Dodaj na samym początku skryptu
  1. ini_set('display_errors', 1);
Powinno jakiś błąd lub ostrzeżenie pokazać. Jeżeli nie, to upewnijmy się, czy wchodzimy do naszego warunku if(!$validation_error) wyświetlając przed linią 53 nasze zapytanie
  1. echo $zapytanie;
W końcu sprawdźmy, czy nie jest to błąd podczas dodawania rekordu do bazy zastępując
  1. $wynik = mysql_query ($zapytanie);
tym
  1. $wynik = mysql_query ($zapytanie) or die(mysql_error());

rossco
Cytat(mortus @ 22.03.2010, 15:04:48 ) *
Dodaj na samym początku skryptu
  1. ini_set('display_errors', 1);

Powinno jakiś błąd lub ostrzeżenie pokazać. Jeżeli nie, to upewnijmy się, czy wchodzimy do naszego warunku if(!$validation_error) wyświetlając przed linią 53 nasze zapytanie
  1. echo $zapytanie;
W końcu sprawdźmy, czy nie jest to błąd podczas dodawania rekordu do bazy zastępując
  1. $wynik = mysql_query ($zapytanie);
tym
  1. $wynik = mysql_query ($zapytanie) or die(mysql_error());


1 wyświetliło: 'Notice: Undefined index: id in /ogloszenia/index.php on line 19'

2 nic nie wyświetliło


3 nic nie wyświetliło
mortus
Usuń tę linię 19, bo nie jest potrzebna (powinno w niej być $id = $_GET['id'] i można to usunąć). Poza tym zmień plik form.php na
  1. <FORM METHOD=POST action="index.php?id=dodaj">
  2. <INPUT TYPE="hidden" NAME="id" VALUE="dodaj">
  3. <BR>
  4. Nazwa firmy:</B>
  5. <br/>
  6. <BR>
  7. <INPUT TYPE="text" NAME="nazwa_firmy" VALUE="<?php if(isset($nazwa_firmy)) echo $nazwa_firmy; ?>" SIZE=60>
  8. <BR>
  9. <B>Miejscowość zatrudnienia:</B>
  10. <BR>
  11. <INPUT TYPE="text" NAME="miejscowosc_zatrudnienia" VALUE="<?php if(isset($miejscowosc_zatrudnienia)) echo $miejscowosc_zatrudnienia; ?>" SIZE=60>
  12. <BR>
  13. <B>Stanowisko:</B>
  14. <br/>
  15. <BR>
  16. <input type="text" name="tresc" value="<?php if(isset($pusta_tresc) && !$pusta_tresc) echo $_POST['tresc']; ?>"<?php if (isset($pusta_tresc) && $pusta_tresc) echo 'style="border: 1px solid red;"'; ?>/>
  17. <br/>
  18. <B>Treść ogłoszenia:</B>
  19. <br/>
  20. <input type="text" name="stanowisko" value="<?php if(isset($puste_stanowisko) && !$puste_stanowisko) echo $_POST['stanowisko']; ?>"<?php if (isset($puste_stanowisko) && $puste_stanowisko) echo 'style="border: 1px solid red;"'; ?>/>
  21. <br/>
  22. <INPUT TYPE="submit" VALUE="Wyslij">
  23. </FORM><a href="index.php">Powrót</a>
Prześledź różnice.
Mamy jeszcze warunek
  1. if(!validation_error)
a powinno być
  1. if(!$validation_error)
zgubiłem dolara.
Jeżeli pola nazwa_firmy i miejscowosc_zatrudnienia nie podlegają walidacji, to kod
  1. $nazwa_firmy = $_POST["nazwa_firmy"];
  2. $miejscowosc_zatrudnienia = $_POST["miejscowosc_zatrudnienia"];
powinien się znajdować przed warunkiem if(!$validation_error)
Sprawdź i daj znać, czy w końcu poszło smile.gif
rossco
Działa smile.gif) Mortus bardzo Ci dziękuję! Przeanalizuję to wszystko postaram się zrobić podobne formularze, ale już sama a potem biorę sie za robienie stron chronionych hasłem - chyba trzeba nauczyć się sesji

Dzięki:)
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.