Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]E-mail Formularz (Prosze o pomoc)
Forum PHP.pl > Forum > Przedszkole
^(-.-)^
Witajcie moi drodzy,

A wiec jestem poczatkujacym koderem jezeli chodzi o PHP i teraz mam male zamieszanie. A mianowicie chce zrobic formularz email do mojej strony pod nazwa contact.php. Napisalem 1/5 kodu php ale pozniej nie za bardzo wiem za co sie wziac pierwszy. Moze ktos mi pomoze. To jest moj kod:

  1. <?php
  2. include('include/header.php');
  3. ?>
  4.  
  5. <span class="content_bg"></span>
  6. <span class="content_bg2"></span>
  7. <span class="content_bg3"></span>
  8.  
  9. <div id="content2">
  10. <form id="sendmail" action="contact.php" method="POST" >
  11.  
  12.  
  13. <input type="hidden" name="ip" value="<?php echo $ipi ?>" />
  14. <input type="hidden" name="httpref" value="<?php echo $httprefi ?>" />
  15. <input type="hidden" name="httpagent" value="<?php echo $httpagenti ?>" />
  16.  
  17. <p id="contact"><img src="img/kontakt.jpg" alt="kontakt_obrazek" /></p>
  18. <p id="cont">Wszelkie uwagi, problemy i opinie na temat.... są mile widziane</p>
  19. <p id="m1">Temat: <input id="m2" name="temat" type="text" size="45" maxlength="30" /></p>
  20. <p id="m1">Imię i Nazwisko: <input id="m2" name="imie" type="text" size="45" maxlength="30" /></p>
  21. <p id="m1">E-mail: <input id="m2" name="mail" type="text" /></p>
  22. <p id="m1"><span class="m11">Wiadomość:</span> <textarea id="m3" name="message" type="textarea" cols="60" rows="5"></textarea></p>
  23. <input id="send" name="submit" type="submit" value="" />
  24.  
  25. <?php
  26. $ip = $_POST['ip'];
  27. $httpref = $_POST['httpref'];
  28. $httpagent = $_POST['httpagent'];
  29. $temat=$_POST['temat'];
  30. $imie=$_POST['imie'];
  31. $mail=$_POST['mail'];
  32. $message=$_POST['message'];
  33. $submit=$_POST['submit'];
  34. ?>
  35.  
  36. </form>
  37. </div>
  38.  
  39. <?php
  40. include('include/footer.php');
  41. ?>


Co ja chce robic?
1. Chce robic formularz zeby uzytkownicy mojej strony moga wysylac do mnie email. jako action chce zeby byla ta sama strona co zakladka czyli contact.php.
2. Chce zeby kazde komunikaty dotyczace wysylaniem email oraz bledy sa wyswietlone nad formularzem (Juz zrobilem CSS do tego).
3. Chce zeby wszystkie pole byly uwzglednione czyli jezeli 1 z tych pol bedzie pusty to bedzie komunikat jak "Wszystkie pole sa obowiazkowe"
4. Chce zabiezpieczyc sie przed spamerami (ustawic tak zeby usery mogli napisac email w odstepie 30 mn np) - przyda sie tez poprawnosc emaila podane przez usera.

To wszystko czego bym sobie zyczyl. Mam nadzieje ze duzo nie prosilem. I bede bardzo wdzieczny jezeli ktos mi w tym pomoze. A mianowicie bym sie nauczyc i czegos wiecej sie dowiedzial bo ucze sie php wlasnie i potrzebuje mala pomoc.

Pozdrawiam serdecznie
Johny
Solimo
[PHP] pobierz, plaintext
  1. <div id="content2">
  2. <?php kod obsł. form ?>
  3. <form id="sendmail" action="contact.php" method="POST" >
[PHP] pobierz, plaintext
Do form dodaj jedno pole type="hidden" name np. send i value np. 1. Będzie to pole, które poinformuje obsł. form, że został on wysłany - po prostu pierwszy if($_POST['send']==1]. W obsł. form sprawdzaj czy $_POST['xx'] jest isset() i czy nie jest puste czyli np. $_POST['zz']==''. Jeżli false to wypisujesz np echo "form źle wypełniony". Jeżeli wszstkie warunki np. na IF'ach są poprawne to zapoznaj się w manualu z czymś takim jak mail() w php. Co do mini zabezpieczenia przed spamem to po wyslaniu mail() ustawiaj ciasteczko/sesje która uniemożliwi wysłanie ponowne form przez jakis czas.

Powodzenia w nauce:)
Quantum
Cytat
Do form dodaj jedno pole type="hidden" name np. send i value np. 1. Będzie to pole, które poinformuje obsł. form, że został on wysłany.


a po co tak ? tongue.gif przecież ma
  1. <input id="send" name="submit" type="submit" value="" />


  1. if(isset($_POST['submit']))
  2. {
  3. dalsze instrukcje
  4. }
Solimo
Masz rację. Tylko, że gdy na jednej stronie będzie chciał mieć kilka submit'ów o tym samym value to hidden lepiej się sprawdza. Napisałem z przyzwyczajenia snitch.gif .
Quantum
Cytat
Tylko, że gdy na jednej stronie będzie chciał mieć kilka submit'ów o tym samym value


ja nie sprawdzam wartości, nazwa się liczy, a ją akurat zmieniamy dla każdego nowego formularza winksmiley.jpg

  1. <input name="submit1" type="submit" value="" />
  2. </form>
  3.  
  4. <input name="submit2" type="submit" value="" />
  5. </form>
  6.  
  7. <input name="submit3" type="submit" value="" />
  8. </form>
  9.  


  1.  
  2. if(isset($_POST['submit1']))
  3. {
  4. echo 'wysłano formularz pierwszy';
  5. }
  6.  
  7. if(isset($_POST['submit2']))
  8. {
  9. echo 'wysłano formularz drugi';
  10. }
  11.  
  12. if(isset($_POST['submit3']))
  13. {
  14. echo 'wysłano formularz trzeci';
  15. }
  16.  
Solimo
Mój minimalizm pochwala Cię dobry człowieku tongue.gif . Mam nadzieję, że autorowi przydadzą się te uwagi.
thek
Odpowiedź na chyba wszystkie:
ad 1)
Układ kodu musiałby być taki, że sprawdzasz najpierw czy do pliku jest przesłana zmienna typu $_POST i jeśli tak to ją przetwarzasz. Dopiero potem następuje warstwa prezentacji. Innymi słowy mniej więcej tak:
  1. <?php
  2. if($_POST) {
  3. "odchwaszczamy_dane;"
  4. walidujemy_dane;
  5. robimy_co_chcemy;
  6. }
  7. ?>
  8. <html>
  9. <form action="">
  10. </form>
  11. </html>


ad 2) i ad 3) (bo się wiążą ze sobą)
Jesli chcesz wyświetlać errory to wystarczy ustawić sobie podczas walidacji zmienne odpowiedzialne za konkretne pola. Jeśli nie przejdą one walidacji to przypisz do nich komunikat błędu a w warstwie prezentacji sprawdź czy aby dla pola wartość jego zmiennej jest rózna od wartości pustej czy null
  1. <?php
  2. $form['field'] = ''
  3. $error['success'] = 1;
  4. if( $_POST ) {
  5. "odchwaszczamy_dane;"
  6. if( empty($_POST['field']) ) {
  7. $error['success'] = 0;
  8. $error['field'] .= 'Pole jest puste';
  9. $form['field'] = $_POST['field'];
  10. }
  11. if( $error['success'] == 1 ) {
  12. przejdź_na_stronę_z_informacja_o_wysłaniu_maila;
  13. }
  14. robimy_co_chcemy;
  15. }
  16. ?>
  17. <html>
  18. <form action="">
  19. <?php if( $error['field'] ) echo $error['field']; ?>
  20. <input type="text" name="field" value="<?php echo $form['field'] ?>" />
  21. </form>
  22. </html>

Ten kod robi masę dobrej roboty bo załatwia kilka rzeczy jednocześnie. $form przechowuje dane formularza. Jeśli wchodzimy na formularz po raz pierwszy to korzysta z domyślnych wartości jakie wprowadzamy na początku (mogą być to wartości puste), ale jesli się kod wysypie błędem, to do formularza przywracamy z powrotem co napisał użytkownik, czyli nie musi wpisywać tego od nowa i wystarczy, że poprawi. Kod sprawdzający istnienie błędów możesz wrzucić gdzie chcesz, ale najlepiej tuż nad polem jakiego tyczy, bo dzięki temu user wie GDZIE ma błąd. Możesz oprócz sprawdzania czy jest puste pole ustawić także inne warunki. Ważne by gdzieś sprawdziło czy wszystkie pola były zwalidowane i zmienna $error['success'] miała wartość zgodną z pełnym sukcesem lub porażką, bo od niej zależeć będzie czy wyjdziemy ze strony czy też wyświetlimy ja ponownie. To jakie warunki sobie w walidacji ustawisz jest obojętne. Możesz tam sprawdzac czy pole jest puste czyjest obowiązkowe, czy ma określony format danych itp.

ad 4) Możesz dla usera w bazie dać kolumnę z czasem ostatniego maila i podczas walidacji sprawdzać różnicę między nim oraz aktualnym. Od Ciebie zależy czy będziesz wtedy resetował w bazie znowu ten czas do aktualnego, czy poczekasz aż minie owo 30 minut. Pierwsze rozwiązanie będzie lepsze jeśli ktoś ostro próbuje spamować mailami, bo każda nieudana próba spowoduje zresetowanie licznika znów do 30 minut i przez to zablokuje spamera na dłużej winksmiley.jpg A możesz też ustawić kolejne pole, które będzie inkrementować licznik takich prób i jeśli wyniesie on iles tam, to mu wyłączysz wysyłanie na ileś godzin lub dni.
Jeśli chodzi o poprawność emaila to najlepsze są wyrażenia regularne. Format maila to mniej więcej:
- user: znaki alfanumeryczne oraz kropka, podkreślenie,myślnik,
- małpa: @
- strona: podobnie jak user,
- kodowe oznaczenie kraju: 2 lub 3 litery.
napisa wyrażenie mając te dane nie jest trudno, a frameworki nawet to ułatwiają bo często mają do tego gotową funkcję w stylu valid_email() lub podobna w nazwie smile.gif

Od razu zaznaczam, że sniffer32 podpowiada dobrze, przy czym można stosować kilka submitów o różnym name w tym samym formularzu i wtedy podczas walidacji posta sprawdzamy który z nich był wywołany w sposób:
  1. if( array_key_exists( 'nazwa_submita', $_POST ) ) {
  2. tu robimy instrukcje dla danego submita;
  3. }

Nie trzeba budować kilku formularzy by to zadziałało. Kto zaś dobrze pomyśli, to zrobi w sprytny sposób zamiast if, switch i osiągnie ciekawe efekty podczas walidacji kodu bez jego zbytniego rozrostu kodu, gdyż nie będzie dublował instrukcji wykonywanych w przypadku różnych submitów. Wystarczy, że te wykonywane we wszystkich przypadkach pójdą na sam dół i pominie się instrukcje break, które większość osób z rozpędu wstawia winksmiley.jpg
^(-.-)^
Witam wam jeszcze raz panowie. Dziekuje ze mieliscie chec do pomocy ale chyba nie za bardzo sie zrozumielismy wstydnis.gif .

Moze obrazkowo bedziecie rozumiec o co mi chodzi.

A wiec:
- Jak gość wchodzi na stronie contact.php to pokazyje sie czysty formularz tak jak na obrazku: http://i30.tinypic.com/wiqads.jpg
- Jak gość wysyla email z formularza to pokazuje sie formularz ponownie ale tym razem z komunikatem "wiadomość została wysyłana.." tak jak na obrazku: http://i25.tinypic.com/2yvmmg1.jpg
- Natomiast jak jakiś błąd się pokazuje bądź gość źle wpisał adres email to pokazuje sie formularz z błędem: http://i27.tinypic.com/245y4o2.jpg

Moj problem jest ze nie wiem jak zrobic zeby wlasnie pokazywalo sie formularz zawsze z komunikatami. Bo nie wiem czy za kazde warunki wstawione w php mam napisac echo i cala strone razem z komunikatem czy tylko jedno zdanie i to sformatowac CSS'em.

I wlasnie prosilbym o jakis przyklad tak zebym zrozumial.

PS: Ja mam tylko formularz do email. Nie mam formularzu do logowania sie poniewaz tego nie bedzie na moim stronie. Gosci wchodza na stronie i maja do dyspozycji formularz kontaktowy. Wiec z tym zabiezpieczeniem email mi chodzilo o to zeby php weryfikuje czy podany email w polu "E-mail" jest poprawny, jezeli nie to wyswietla sie komunikat z bledem tak jak na obrazku wyzej.

Bardzo prosze o pomoc sadsmiley02.gif
thek
No i mój pobieżny kod robi to o czym mówisz smile.gif
Jeśli wejdziesz po raz pierwszy - wszystko będzie puste,
Jeśli walniesz byka - wywali info o błędach, a gdzie je umieścisz to już Twoja sprawa.
Jedyna różnica to tyle, że w razie poprawnego wpisania nie zrobisz przejścia do innej strony, tylko puszczasz to dalej i na początku wyświetlania formularza dodasz linijkę:
  1. if( $error['success'] == 1 ) echo $komunikat_o_powodzeniu;


O walidacji e-mail tez napisałem już pod kątem wyrażeń regularnych, a nie porównywania z bazą. Do puszczenia wyrażenia regularnego na stringu nie jest ona potrzebna. Efekt jaki chcesz uzyskać jest podstawami znajomości obsługi php i jeśli sobie z tym już na tym etapie nie radzisz, to później będziesz miał jeszcze gorzej. Uwierz, że napisanie tego formularza mającego zaledwie kilka pól, z pełną walidacją, zabezpieczaniem przed sql injection, XSS itp, w czystym php to zadanie na góra 10 minut (jeśli człowiek jest śpiący i już kompletnie nie myśli ), a z pomocą frameworka jeszcze szybciej. Tyle, że pomoc - pomocą, wskazówki - wskazówkami, ale forum jest po to by uczyć JAK coś zrobić a nie tylko dawać gotowce.
Ze swojej strony podałeś kod jaki masz jako gotowiec skądś i liczysz, że teraz oddamy Ci go już poprawionego do formy jakiej oczekujesz. Osoby tutaj piszące w temacie dały już tyle wskazówek i podpowiedzi, że osobiście byłoby mi już wstyd, że nie skorzystałem z choćby części i nie spróbowalem sam tego poprawić, stosując się do nich.
Zauważ, że nie zamieszczono tutaj niczego, co wskazywałoby na Twój własny wkład w poprawienie go. Rzucono temat, rzucono wymagania i czekasz teraz aż ktoś Ci da gotowe rozwiązanie i jeszcze w odczuciu wielu osób zapewne dyrygujesz, choć jak napisalem wyżej, mój post poprzedni dał Ci niemal gotowca, którego już tylko trochę trzeba dostosować do tego co masz. A to tylko pokazuje, że nawet nie masz pojęcia o tym co do Ciebie piszemy i nie rozumiesz naprawdę podstaw. Widzisz tylko obrazki i jak ma to wyglądać, ale kod za tym stojacy jest dla Ciebie abstrakcją. Może i rozumiesz html czy css, tyle że php już najprawdopodobniej nie. I to nie jest przytyk by Cię obrazić, ale realne spojrzenie na możliwości. Naprawdę zacznij od zrozumienia języka, poczytania tutoriali, helpów, bo inaczej nawet z instalacją nieco bardziej skomplikowanych wtyczek do serwisu sobie nie poradzisz. A co dopiero mówić o poprawianiu kodu autora do własnych potrzeb.

By było jeszcze bardziej dołująco... Przez czas pisania tego posta do Ciebie, wielu z tu siedzących (w ty i ja) napisało by przynajmniej kilka razy ten kod już włącznie z deklaracjami stylu, stworzeniem grafiki i przetestowaniem na najpopularniejszych przeglądarkach tak, by jedynie śpiewać i tańczyć nie potrafił winksmiley.jpg
^(-.-)^
Nie no nie jestem az takim totalnym zielonym az do dna. Po to jest forum zeby sie pytac w razie problemow a wy albo udzielicie pomocy albo nie to prosty zamiast odbiegac sie od tematu i zaczynac wykladu moralnego dawac.
Poczatkowy kod jaki dalem jak napisalem ten watek jest moj i sam go zrobilem wiec zapewne nie z jakiegos gotowca. Ja tylko prosilem o pomoc i jakie wymaganie mialem. Prosilem o weryfikacji emaila na formularzu a ktos mi dal kod zeby sprawdzic czy email jest poprawny w bazie danych... a wspomnialem wczesniej ze na mojej strony nie ma zadnego logowania tylko prosta strona z zakladka kontakt dla userow jezeli maja jakis feedback.

A ty udzielasz sie w moim temacie i kazesz mi rozumiec php... gdybym nie rozumial na pewno bym ci nie pokazal ten kod wyzej ale ok wporzadku, kazda rada jest dobra wiec skorzystam.

Podsumujac zmienilem troche gry na moim kodzie. Teraz bawilem sie i zrobilem taki kod:

  1. <?php
  2. include('include/header.php');
  3. ?>
  4.  
  5. <span class="content_bg"></span>
  6. <span class="content_bg2"></span>
  7. <span class="content_bg3"></span>
  8.  
  9.  
  10.  
  11. <div id="content2">
  12. <?php
  13. if ((empty($_POST['temat']) or empty($_POST['imie']) or empty($_POST['mail']) or empty($_POST['message'])) and !empty($_POST['submit'])) {
  14. // wyświetlamy formularz
  15. <form id="sendmail" action="contact.php" method="POST" >
  16.  
  17.  
  18. <input type="hidden" name="ip" value="<?php echo $ipi ?>" />
  19. <input type="hidden" name="httpref" value="<?php echo $httprefi ?>" />
  20. <input type="hidden" name="httpagent" value="<?php echo $httpagenti ?>" />
  21.  
  22. <p id="contact"><img src="img/kontakt.jpg" alt="kontakt_obrazek" /></p>
  23. <p id="cont">Wszelkie uwagi, problemy i opinie na temat aaa.pl są mile widziane</p>
  24. <p id="m1">Temat: <input id="m2" name="temat" type="text" size="45" maxlength="30" /></p>
  25. <p id="m1">Imię i Nazwisko: <input id="m2" name="imie" type="text" size="45" maxlength="30" /></p>
  26. <p id="m1">E-mail: <input id="m2" name="mail" type="text" /></p>
  27. <p id="m1"><span class="m11">Wiadomość:</span> <textarea id="m3" name="message" type="textarea" cols="60" rows="5"></textarea></p>
  28. <input id="send" name="submit" type="submit" value="" />
  29. </form> ';
  30. // lub w przypadku nie wypełnienia formularza do końca
  31. echo '<div id="error">Proszę wypełnić wszystkie pole</div>';
  32. }
  33. elseif (empty($_POST['temat']) or empty($_POST['imie']) or empty($_POST['message']) or empty($_POST['email']) and empty($_POST['submit'])) {
  34. // wyświetlamy formularz
  35. echo '
  36. <form id="sendmail" action="contact.php" method="POST" >
  37.  
  38.  
  39. <input type="hidden" name="ip" value="<?php echo $ipi ?>" />
  40. <input type="hidden" name="httpref" value="<?php echo $httprefi ?>" />
  41. <input type="hidden" name="httpagent" value="<?php echo $httpagenti ?>" />
  42.  
  43. <p id="contact"><img src="img/kontakt.jpg" alt="kontakt_obrazek" /></p>
  44. <p id="cont">Wszelkie uwagi, problemy i opinie na temat aaa.pl są mile widziane</p>
  45. <p id="m1">Temat: <input id="m2" name="temat" type="text" size="45" maxlength="30" /></p>
  46. <p id="m1">Imię i Nazwisko: <input id="m2" name="imie" type="text" size="45" maxlength="30" /></p>
  47. <p id="m1">E-mail: <input id="m2" name="mail" type="text" /></p>
  48. <p id="m1"><span class="m11">Wiadomość:</span> <textarea id="m3" name="message" type="textarea" cols="60" rows="5"></textarea></p>
  49. <input id="send" name="submit" type="submit" value="" />
  50. </form> ';
  51. }
  52.  
  53. // sprawdzamy, czy zmienne przesłane z formularza nie są puste
  54. elseif (!empty($_POST['temat']) && !empty($_POST['imie']) && !empty($_POST['message']) && !empty($_POST['email'])) {
  55. // jeżeli powyższy warunek jest spełniony tworzona jest wiadomość
  56. // zmienna $message zawiera treść wiadomości
  57. $message = "Treść wiadomości:n$_POST[message]nWysłał: $_POST[imie]ne-mail: $_POST[email]";
  58. // zmienna $header zawiera przede wszystkim adres zwrotny
  59. $header = "From: $_POST[imie] <$_POST[email]>";
  60. $topic = "Temat: $_POST[temat]";
  61. // funkcja mail() za pomocą której wiadomość zostanie wysłana
  62. @mail("jakistam@mail.com","Wiadomosc ze strony WWW", "$topic", "$message","$header")
  63. or die('<div id="error">Nie udało się wysłać wiadomości</div>');
  64. // wyświetlenie komunikatu w przypadku powodzenia
  65. echo '<div id="succes">Wiadomość została wysłana poprawnie!</div>';
  66. }
  67.  
  68.  
  69. ?>
  70. </div>
  71. <?php
  72. include('include/footer.php');
  73. ?>


Prostego kodu chyba juz nie dalo sie napisac bo jeszcze nie dodalem tam formuly zeby zweryfikowac email ale zrobie to pozniej.

Problem w tym kodzie jest taki ze zaden komunikat sie nie wyswietla. Niby wszystko ladnie sie pokazuje w przegladarce ale jak zaczynam robic jakies akcje np klikajac na WYSLIJ majac puste pole to strona tylko sie laduje ale zaden komunikat albo jakies ERRORY. Wiec nie wiem czy w tych ECHO jest zle cos czy nie. Wiec co sadzicie o tym?
thek
No... nareszcie coś od siebie biggrin.gif
Motasz za bardzo z warunkami. Najlepiej podziel sobie to ładnie na część "logiki" i część "prezentacji" bez mieszania ich ze sobą, tak jak to zrobiłem w jednym ze swoich postów tutaj.
Przemyśl na przykład coś takiego
  1. <?php $form['temat'] = '';
  2. $form['message'] = '';
  3. $form['imie'] = '';
  4. $form['email'] = '';
  5. $error = $form;
  6. $error['success'] = 2;
  7. if( isset($_POST) ) {
  8. if( empty( $_POST['temat'] ) ) {
  9. $error['temat'] = 'Brak tematu';
  10. $error['success'] = 0;
  11. }
  12. if( empty( $_POST['message'] ) ) {
  13. $error['message'] = 'Brak wiadomości';
  14. $error['success'] = 0;
  15. }
  16. if( empty( $_POST['imie'] ) ) {
  17. $error['imie'] = 'Brak imienia';
  18. $error['success'] = 0;
  19. }
  20. if( empty( $_POST['email'] ) ) {
  21. $error['email'] = 'Brak emaila';
  22. $error['success'] = 0;
  23. } elseif( prawidlowy_mail( $_POST['email'] ) ) {
  24. $error['email'] = 'Nieprawidłowy email';
  25. $error['success'] = 0;
  26. }
  27. if( $error['success'] == 1 ) {
  28. tutaj sobie wyślij maila
  29. }
  30. $form = $_POST;
  31. }
  32.  
  33. if( $error['success'] == 0 ) {
  34. tutaj możesz wyświetlić w pętli lub jakkolwiek inaczej błędy z tablicy $errors
  35. } elseif( $error['success'] == 1 ) {
  36. tutaj info o prawidłowym przebiegu
  37. }
  38. ?>
  39. <form id="sendmail" action="contact.php" method="POST" >
  40.  
  41. <p id="cont">Wszelkie uwagi, problemy i opinie na temat aaa.pl są mile widziane</p>
  42. <p id="m1">Temat: <input id="m2" name="temat" type="text" size="45" value="<?php echo $form['temat'] ?>" maxlength="30" /></p>
  43. <p id="m1">Imię i Nazwisko: <input id="m2" name="imie" type="text" value="<?php echo $form['imie'] ?>" size="45" maxlength="30" /></p>
  44. <p id="m1">E-mail: <input id="m2" name="email" type="text" value="<?php echo $form['email'] ?>" /></p>
  45. <p id="m1"><span class="m11">Wiadomość:</span> <textarea id="m3" name="message" type="textarea" cols="60" rows="5"><?php echo $form['temat'] ?>
  46. </textarea></p>
  47. <input id="send" name="submit" type="submit" />
  48. </form>

Tu jest maksymalnie chyba rozdzielone obie warstwy o jakich wspominałem, ale to tylko szkic, bo można to zrobić inaczej i powinno to być poprawione, gdyż walidacja jest w szczątkowej wersji i brak sprawdzania danych przesłanych postem by uniknąć XSS, SQL injection i błędów wynikających ze znaków specjalnych. Ale ogólnie od tego do poprawnego kodu działającego już tylko kroczki małe. Jeśli teraz już nie będziesz sam mógł dalej pchnąć to nie wiem co jeszcze może być trudnego. Każdy tu chyba piszący by to przerobił w chwilkę na pełnoprawny kod.
Zauważ, że formularz wyświetlam tylko raz, odpowiednio uzupełniwszy danymi. I tak właśnie szablon tego co chcesz zrobić powinien wyglądać. A tak całość formularza uzależniasz od warunków, które niekoniecznie muszą być prawidłowe. Przerobienie tego na MVC jakiego używa wiele stron i frameworków jest chwilką.

Dziala to tak... Jeśli jest to pierwsze wejście - wyświetla wartości puste, jakie ustawiłem na samym początku. Jeśli ktoś już coś wypełnił to sprawdza czy są błędy i odpowiednio ustawia komunikaty błędów dla konkretnych pól oraz zmienna oznaczająca sukces ustawia się na sukces lub porażka w zależności od tego czy błędy były. Jeśli po wstępnej walidacji był sukces to wysyłamy maila.
Do zmiennej z polami formularza, w razie gdy ktoś dał submit,wpisujemy dane z POST, niezależnie czy wynik był prawidłowy czy nie, bo inaczej te dane "zgubimy". Jest to ważne w razie błędów, bo dzięki temu user nie będzie musiał wypełniać pól od nowa.

No i na koniec wyświetlamy informację w zależności od flagi sukcesu 0 - błędy, 1 - mail wysłano. Do tego z tabeli errors możemy wypisać dokładnie jakie błędy były. No i wyświetlamy formularz uzupełniając go danymi z tablicy form. Czasem są one puste, ale jeśli było coś w post to nimi się formularz sam uzupełni. Prościej już chyba nie da się wytłumaczyć... Prostszy już byłby tylko gotowiec, a taki miły nie jestem winksmiley.jpg
^(-.-)^
No rozumiem ze trzeba ciezko sie napracowac zeby cos osiagnac. smile.gif zgadzam sie z toba.

Ok, moja zabawa z kodami nadal trwa i zrobilem cos prostego, bardzo prosty skrypt ktory dziala, wysyla email ale nie do konca poprawny mysle. Oto jak kod wyglada:

  1. <?php
  2. include('include/header.php');
  3. ?>
  4.  
  5. <span class="content_bg"></span>
  6. <span class="content_bg2"></span>
  7. <span class="content_bg3"></span>
  8.  
  9.  
  10.  
  11. <div id="content2">
  12. <?php
  13.  
  14. $ip = $_POST['ip'];
  15. $httpref = $_POST['httpref'];
  16. $httpagent = $_POST['httpagent'];
  17. $topic=$_POST['temat'];
  18. $imie=$_POST['imie'];
  19. $mail=$_POST['mail'];
  20. $message=$_POST['message'];
  21. $submit=$_POST['submit'];
  22.  
  23. <form id="sendmail" action="'.$_SERVER['PHP_SELF'].'" method="POST">
  24.  
  25.  
  26. <input type="hidden" name="ip" value="<?php echo $ipi ?>" />
  27. <input type="hidden" name="httpref" value="<?php echo $httprefi ?>" />
  28. <input type="hidden" name="httpagent" value="<?php echo $httpagenti ?>" />
  29.  
  30. <p id="contact"><img src="img/kontakt.jpg" alt="kontakt_obrazek" /></p>
  31. <p id="cont">Wszelkie uwagi, problemy i opinie na temat aaa.pl są mile widziane</p>
  32. <p id="m1">Temat: <input id="m2" name="temat" type="text" size="45" maxlength="30" /></p>
  33. <p id="m1">Imię i Nazwisko: <input id="m2" name="imie" type="text" size="45" maxlength="30" /></p>
  34. <p id="m1">E-mail: <input id="m2" name="mail" type="text" /></p>
  35. <p id="m1"><span class="m11">Wiadomość:</span> <textarea id="m3" name="message" type="textarea" cols="60" rows="5"></textarea></p>
  36. <input id="send" name="submit" type="submit" value="" />
  37. </form> ';
  38.  
  39. if (isset($_POST[submit])) {
  40.  
  41. $header = "From: $imie <$mail>";
  42. $topic = "Temat: $_POST[temat]";
  43. mail("mail@gmail.com", "$topic", $_POST[message], "$header")
  44. or die('<p id="error">Nie udało się wysłać wiadomości ;(</p>');
  45. echo '<p id="succes" align="center">Wiadomość została wysłana poprawnie!</p>';
  46.  
  47. }
  48.  
  49. elseif (eregi('http:', $message)) {
  50. die ("Do NOT try that! ! ");
  51. }
  52.  
  53. elseif(!$mail == "" && (!strstr($mail,"@") || !strstr($mail,".")))
  54. {
  55. echo '<p id="error">Proszę podać prawidłowy email</p>';
  56.  
  57. }
  58.  
  59. elseif(empty($imie) || empty($topic)|| empty($mail) || empty($message )) {
  60. echo '<p id="error">Proszę wypełnić wszystkie pola</p>';
  61.  
  62. }
  63. ?>
  64.  
  65. </div>
  66. <?php
  67. include('include/footer.php');
  68. ?>


Problem:
1. mimo to ze zostawiam puste pole w formularzu to skrypt nadal wysyla email. A powinno dac komunikat "Prosze wypelnic wszystkie pole"
2. Skrypt nie weryfikuje wartosc emaila wiec ludzie moga wpisac byle co w pole email a skrypt wciaz wysyla. A powinno byc tak ze jezeli nie ma email w tym pole to skrypt zablokuje mozliwosc wysylania wiadomosci z komunikatem "Proszę podać prawidłowy email"


Narazie tyle potrzebuje. Co do zabezpieczenia strony od SQL injection to pozniej wymysle.

Jakis pomysl co do tych 2 punktow?? Co mam w moim kodzie poprawic?
Pozdro
Solimo
W pierwszym IF sprawdzasz czy został wysłaby form i jeżeli true to wysyłasz email. Błąd logiczny, ponieważ wysłanie powinno nastąpić w ostatnim (np. else) po sprawdzeniu wszystkich przypadków a nie tylko jednego...

  1. if(isset($_POST[submit]){
  2. if (eregi('http:', $message)) {
  3. die ("Do NOT try that! ! ");
  4. }
  5.  
  6. elseif(!$mail == "" && (!strstr($mail,"@") || !strstr($mail,"."))){
  7. echo '<p id="error">Proszę podać prawidłowy email</p>';
  8. }
  9.  
  10. elseif(empty($imie) || empty($topic)|| empty($mail) || empty($message )) {
  11. echo '<p id="error">Proszę wypełnić wszystkie pola</p>';
  12. }
  13.  
  14. else {
  15. $header = "From: $imie <$mail>";
  16. $topic = "Temat: $_POST[temat]";
  17. mail("mail@gmail.com", "$topic", $_POST[message], "$header")
  18. or die('<p id="error">Nie udało się wysłać wiadomości ;(</p>');
  19. echo '<p id="succes" align="center">Wiadomość została wysłana poprawnie!</p>';
  20. }
  21. }


^(-.-)^
skrypt ktorego poprawiles nie dziala. nic sie nie wyswietla w ogole. Jest tylko pusta biala strona... dlaczego?
thek
Po pierwsze - przerzuć sprawdzanie POST na sam początek, bo w chwili obecnej informacje będziesz miał POD formularzem. a na dodatek formularz będzie działał niezbyt logicznie i NIGDY nie wypełni się danymi w razie gdy ktoś zrobi błąd. Poinformuje tylko o błędzie i nic ponadto.
Po drugie - mieszasz całkowicie php i html. Zauważ, że wewnątrz echo wrzucasz otwieranie i zamykanie php robiąc wielokrotnie coś takiego:
  1. echo '<input type="hidden" name="ip" value="<?php echo $ipi ?>" />'

Tak się po prostu nie robi.
Więcej błędów zapewne z czasem nam przyniesiesz winksmiley.jpg
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.