Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlanie komunikatu [php]
Forum PHP.pl > Forum > PHP
corey1991
Hej, jestem początkujący w dziedzinie programowania w PHP ale mimo wszystko trochę już napisałem sam. Jednak mam problem z wyświetlaniem komunikatu odnośnie danych w formularzu. Zrobiłem stronkę do dodawania artykułów, są tam 3 pola i każde musi być wypełnione aby można było wyświetlić wpisane dane. Wywołuje stronkę linkiem 'index.php?sprawdz=0' wyświetla mi formularz. Uzupełniam np dwa pola i zatwierdzam, echo drukuje napis że trzeba uzupełnić puste pole i wywołuje się funkcja 'źle', która generuje stronę z nowym formularzem, lecz znajduje się on pod moim starym, także go nie widać. Jak zrobić to żeby wszystko odbywało się w tym jednym formularzu który jest widoczny?
  1. <?php
  2.  
  3. function dobrze($tytul,$link,$art){
  4. /*
  5. echo "wywolalem fynkcje dobrze";
  6. echo ('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">');
  7. echo ('<html><head><meta http-equiv="content-type" content="text/html; charset=ISO8859-2">');
  8. echo ('<title>Dodawanie artykułu</title></head><body bgcolor="#AEB1AE">');
  9. echo ('<div style="margin-top: 170px;" align="center">');
  10. echo (' <table border="3" width="400" height="400" bgcolor="#BDC5C2">');
  11. echo (' <td bgcolor="" style="color: green;">');
  12. echo (' <p align="center" style="color: #0F5820; font-family: Tahoma; text-align: center; text-shadow: 3px 3px 5px white">');
  13. echo (' <b>'.$tytul.' '.$link.' '.$art.'</b>');
  14. echo (' </p>');
  15. echo (' <div style="text-align: center; margin-top:100px">');
  16. echo (' <form action="index.html" method="POST"><input type="submit" value=" Wróć " ></form>');
  17. echo (' </div>');
  18. echo (' </td>');
  19. echo (' </table>');
  20. echo ('</div>');
  21. echo ('</body></html>');
  22. */
  23. echo ('Wszytko w porządku, możesz przejść dalej...');
  24. echo ('<form action="dodaj.php" method="GET"><input type="submit" value="Dalej"></form>');
  25. }
  26.  
  27. function zle($tytul,$link,$art){
  28. echo ('<!DOCTYPE HTML PUBLIC "-//W3C3//DTD HTML 4.01 Transitional//EN">
  29. <html><head><meta http-equiv="content-type" content="text/html; charset=Windows-1250">
  30. <title>Dodawanie artykułów</title></head><body bgcolor="#AEB1AE">
  31. <table style="margin-top: 100px; margin-left: 300px; color: #0F5820; font-family: Tahoma; text-align: center; text-shadow: 3px 3px 5px white" border="3" width="600" height="500" bgcolor="#BDC5C2">
  32. <td valign="top" align="left">
  33. <form action="index.php?sprawdz=1" method="GET">
  34. <br />
  35. <b> Tytuł:</b><br />
  36. <input type=text size="93" value="'.$tytul.'" name="tytul"/><br/>
  37. <br />
  38. <b>Link do miniaturki:</b><br />
  39. <input type="text" size="93" value="'.$link.'" name="link">
  40. <br />
  41. <br />
  42. <b>Treść:</b>'.'
  43. <textarea style="background-color: #BDC5C2;" rows="25" cols="70" name="art">'.$art.'</textarea>
  44. <input type=submit value="Wyślij"/>
  45. </form>
  46. </td>
  47. </table>
  48. <?php echo $art; ?>
  49. </body>
  50. </html>');
  51. }
  52.  
  53.  
  54.  
  55.  
  56.  
  57. $sprawdz=$_GET['sprawdz'];
  58.  
  59. if ($sprawdz != '0')
  60. {
  61. $tytul=$_GET['tytul'];
  62. $link=$_GET['link'];
  63. $art=$_GET['art'];
  64. if ($tytul == "")
  65. echo "Podaj tytuł artykułu!";
  66. if ($link == "")
  67. echo "Podaj link do miniaturki!";
  68. if ($art == "")
  69. echo "Podaj treśc artykułu!";
  70. zle($tytul,$link,$tresc);
  71.  
  72. if (($tytul != "") and ($link != "") and ($art != "")){
  73. dobrze($tytul,$link,$art); }
  74. else {
  75. zle($tytul,$link,$art); }
  76. }
  77. else
  78. {
  79. zle('','','');
  80. }
  81. ?>
  82.  
Brick
Bardzo to skomplikowane, a można zrobić prosto w jednym pliku.
Zasada jest taka:
1. Jeżeli wysłano formularz - sprawdzamy pola
2. Jeżeli nie wysłano formularza - pokaż formularz
3. Jeżeli wysłano formularz i są błędy - pokaż błędy i poniżej formularz
4. Jeżeli wysłano formularz i NIE ma błędów - zapisz dane i pokaż podziękowanie

Tutaj przykładowy kod:
  1. if($send==1)
  2. {
  3. //sprawdzamy poprawność wypełnienia pól
  4. if (empty($pole))
  5. {
  6. $error = "Wypełnij pole X!"; //komunikaty o błędach zapisujemy do zmiennej $error
  7. }
  8. }
  9.  
  10. if ($send==0 or $error) //formularz nie był wysłany lub są błędy
  11. {
  12. if ($error) print "<h3>$error</h3>"; //jeżeli są błędy to pokaż je
  13.  
  14. print "Tutaj formularz<br />
  15. <form method=get>
  16. <input type=text name='pole' value='$pole'>
  17. <input type=submit value='Zapisz'>
  18. <input type=hidden name=send value=1>
  19. </form>";
  20. }
  21.  
  22. if ($send==1 and !$error) //nie ma błędów - zapisz dane z formularza
  23. {
  24. //zapisujemy formularz
  25. print "<h3>Dziękujemy za wysłanie formularza</h3><a href='formularz.php'>Wróć do formularza</a>";
  26. }

Oczywiście to tylko przykład, musisz dostosować swój kod do tego schematu.
Do zmiennej $error można zapisywać wiele komunikatów o błędach, np gdy trzeba sprawdzić wiele pól lub różne warianty poprawności.
Nie wiem gdzie dane mają trafić ale nie zapomnij o bezpieczeństwie - użytkownik może wysyłać z formularza różne śmieci, kod html, lub jakieś inne sztuczki "hackerskie".

Tutaj jest przykład działający
corey1991
Dokładnie o takie coś mi chodziło winksmiley.jpg Wielkie dzięki smile.gif Tylko nurtuje mnie jeszcze to, dlaczego ten skrypt nie działa na adresie lokalnym/pętli zwrotnej, a jak wrzucę na hosting to wszystko ładnie działa. Byłbym wdzięczny za odpowiedź ;-)
A tu kod który przerobiłem na własne potrzeby ( może się komuś przyda ):
  1. <?php
  2. if($send==1)
  3. {
  4. //sprawdzamy poprawność wypełnienia pól
  5. $tytul=$_GET['tytul'];
  6. $link=$_GET['link'];
  7. $art=$_GET['art'];
  8. if (empty($tytul))
  9. {
  10. $error= "Wpisz tytuł artykułu!"; //komunikaty o błędach zapisujemy do zmiennej $error
  11. }
  12. if (empty($link))
  13. {
  14. $error1= "Wpisz link do miniaturki!"; // analogicznie $error1
  15. }
  16. if (empty($art))
  17. {
  18. $error2= "Wpisz treść artykułu!"; // i $error2
  19. }
  20. }
  21.  
  22. if ($send==0 or $error or $error1 or $error2) //formularz nie był wysłany lub są błędy
  23. {
  24. if ($error)
  25. print "<h3>$error</h3>"; //jeżeli jest błąd 1szy, pokaż go
  26. if ($error1)
  27. print "<h3>$error1</h3>"; //jeżeli jest błąd 2gi, pokaż go
  28. if ($error2)
  29. print "<h3>$error2</h3>"; //jeżeli są błąd 3ci, pokaż go
  30.  
  31. print ('Tutaj formularz<br />
  32. <form method="GET" >
  33. <input type=text name="tytul" value="'.$tytul.'">
  34. <input type="text" name="link" value="'.$link.'">
  35. <textarea name="art"">'.$art.'</textarea>
  36. <input type=submit value="Zapisz">
  37. <input type=hidden name=send value=1>
  38. </form>');
  39. }
  40. if ($send==1 and !$error and !$error1 and !$error2) //nie ma błędów - zapisz dane z formularza
  41. {
  42. //zapisujemy formularz
  43. print "<h3>Dziękujemy za wysłanie formularza</h3><a href='index.php'>Wróć do formularza</a>";
  44. }
  45. ?>
Brick
Zamiast $error1, $error2, $error3 itd zrób
  1. if (empty($pole1)) $error = "Wypełnij pole 1!<br />";
  2. if (empty($pole2)) $error .= "Wypełnij pole 2!<br />";
  3. if (empty($pole3)) $error .= "Wypełnij pole 3!<br />";
  4.  
  5. if ($error) print "<b>$error</b>";

Dodanie kropki przed znakiem "=" dopisuje do zmiennej nowe wartości nie kasując wcześniej zapisanych. W ten sposób wszystkie komunikaty o błędach masz w jednej zmiennej. Przy większych formularzach nieraz takich komunikatów jest bardzo dużo, np sprawdzanie poprawności wpisanej daty urodzenia, jakiejś liczby, kodu pocztowego itd. Tworzenie oddzielnych zmiennych dla każdego komunikatu było by bardzo uciążliwe - trzeba by je wszystkie dopisywać do warunków IF, printować w jakiejś pętli itd.

BTW - nie musisz robić tak: <input type="text" name="link" value="'.$link.'">
można tak: <input type="text" name="link" value="$link">

Zapisujesz potem te dane do bazy danych czy do pliku? A sprawdź co będzie gdy do treści artykułu ktoś wpisze tekst w którym będzie wiele znaków " (cudzysłów) oraz ' (apostrof)

corey1991
Z tymi $errorami zrobiłem tak jak powiedziałeś, faktycznie lepsze rozwiązanie smile.gif jak wpisze tekst np taki: costam "cos" to wyświetla go potem tak: costam \"cos\" a tak też nie może być i nie wiem jak to rozwiązać. Dane później zapisuje to pliku także można by zrobić pętle kasującą te znaki ale jeśli w tekście np. \" taka kombinacja konieczna to też ją wyrzuci. Chyba że jest na to jakieś szybszy i prostszy sposób?

No i sprawdzałem skrypt na wielu hostingach, darmowych i płatnych i działa mi tylko na jednym. Nawet na 127.0.0.1 nie działa i nie wiem czym to jest spowodowane.
Brick
Na usunięcie ukośników jest funkcja stripslashes().
Przykład: $tekst_bez_slashow = stripslashes($tekst_ze_slashami)

Czym objawia się "nie działanie" skrypt? Klikasz przycisk "zapisz" i nic się nie dzieje?
Temat register_globals jest Ci znany?
corey1991
"Nie działanie" objawia się tym że nie wyświetla komunikatu a tym które pola są puste, a po kliknięciu przycisku czyści formularz, bez względu na to czy w którymś polu coś jest czy nie.

Nie wiem co to jest to register_globals ale domyślam się że to jakaś rejstracja zmiennych globalnych. Sprawdzałem przez funkcję phpinfo() i te serwery na których nie działa skrypt mają to wyłączone. Jednak strona będzie stała na serwerze który ma to wyłączone i jak to obejść? Korzystając jednocześnie z php i wyrzucając komunikaty o pustych polach.

EDIT:// Trochę poczytałem o tym register_globals i znalazłem taki kod który to obchodzi, dodaje się go na początku każdego pliku.
  1. if (!ini_get('register_globals')) {
  2. while (list($key, $val) = @each($_GET)) $GLOBALS[$key] = $val;
  3. while (list($key, $val) = @each($_POST)) $GLOBALS[$key] = $val;
  4. while (list($key, $val) = @each($_COOKIE)) $GLOBALS[$key] = $val;
  5. while (list($key, $val) = @each($_FILES)) $GLOBALS[$key] = $val;
  6. while (list($key, $val) = @each($_SESSION)) $GLOBALS[$key] = $val; }

Tym sposobem skrypt działa na każdym serwerze ale czy jest to rozwiązanie bezpieczne?
Brick
O bezpieczeństwie skryptów PHP to napisano już mnóstwo artykułów i jest nawet temat oddzielny na tym forum. Musisz poczytać więcej żeby nie spotkała cię jakaś niespodzianka, jak ci ktoś zhackuje stronę.

Register_globals jest wyłączone nie bez powodu. Właśnie chodzi o bezpieczeństwo, czyli żeby nikt nie mógł wysłać dowolnych zmiennych.
Jeżeli register_globals jest wyłączone, należy korzystać z tablic globalnych $_POST, $_GET, $_COOKIE itd

Czyli dane z formularza z pola o nazwie "imię" nie będą widoczna w $imie tylko w $_GET['imie']

Zastosowany kod, który obchodzi taką sytuację, sprawia że sytuacja wygląda jak przy włączonych globals. Czyli każdy może wysłać to co chce, dopisując najzwyczajniej do linka &mojazmienna=1

Moim zdaniem rozwiązanie kwestii bezpieczeństwa za pomocą wyłączenia register_globals to dobra idea ale dopóki można je włączyć to właściwie nic to nie daje koderom. To miał być sposób na różnego rodzaju niedopracowane, amatorskie kody, które miały pełno dziur. Ale sytuacja jest taka, że na jednych hostingach jest OFF a na innych jest ON. Jeżeli pisałbym wszystkie skrypty z założeniem że wszędzie jest OFF, no to może mnie spotkać przykra niespodzianka, gdy mój skrypt trafi na serwer gdzie jest ON.

Przykład:
  1. $imie = $_GET['imie'];
  2. if ($imie=="Adam") $wiek = 20;
  3. if ($imie=="Mariola") $wiek = 25;
  4.  
  5. if ($wiek)
  6. mysql_query("update users set wiek='$wiek' where imie='$imie'");

Przy register_globals na OFF wszystko jest ok.
Ale gdy skrypt trafi na serwer gdzie globals jest na ON to ktoś złośliwy może napisać w url'u coś takiego:
index.php?imie=stefan&wiek=tutaj_jakiś_sql_injection

Autor skryptu zakłada że zmienna $wiek może przyjąć wartość 20 lub 25. Gdy globals jest OFF a imię=Stefan to nic się nie wykona. Ale gdy jest ON no to mamy problem.

Wniosek z tego jest taki:
Zawsze trzeba pisać skrypty zakładając gorszy wariant tj register_globals=On. A skoro tak to cała idea z globals=Off nie ma sensu.
corey1991
Ok, poczytałem trochę nt bezpieczeństwa skryptów i wstawiłem do skryptów funkcje takie jak htmlspecialchars i strip_tags. Bezpieczeństwo na pewno jest większe ale czy do końca włamanie się jest niemożliwe?

Czyli danych z formularza nie powinnismy przechowywac z zmiennych, tylko na bieżąco poddawać obróbce?
Np.
  1. if ($_GET['imie']=="Adam") $wiek = 20;
  2. if ($_GET['imie']=="Mariola") $wiek = 25;
  3.  
  4. if ($wiek)
  5. mysql_query("update users set wiek='$wiek' where imie='$_GET['imie']'");

Tak to powinno wyglądać?

Brick
Nie, wstawienie $_GET['imie'] nic nie da. Zrób sobie testowy skrypt i sprawdź co się dzieje. Niekoniecznie musisz wykonywać zapytanie do bazy, możesz je po prostu printować.

Sprawdź jakie wykona się zapytanie do bazy gdy ktoś da taki url:
index.php?imie=Stefan'%20or%20imie!='&wiek=1000

Zrób stripslashes dla obydwu zmiennych.
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.