![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 4.09.2008 Ostrzeżenie: (20%) ![]() ![]() |
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:
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 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 2 Dołączył: 11.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
[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:) Ten post edytował Solimo 23.08.2009, 07:22:51 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 450 Pomógł: 84 Dołączył: 27.11.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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 ? ![]()
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 2 Dołączył: 11.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
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
![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 450 Pomógł: 84 Dołączył: 27.11.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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 ![]()
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 2 Dołączył: 11.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Mój minimalizm pochwala Cię dobry człowieku
![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
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:
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
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 ![]() 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 ![]() 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:
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 ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 4.09.2008 Ostrzeżenie: (20%) ![]() ![]() |
Witam wam jeszcze raz panowie. Dziekuje ze mieliscie chec do pomocy ale chyba nie za bardzo sie zrozumielismy
![]() 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 ![]() Ten post edytował ^(-.-)^ 23.08.2009, 16:05:29 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
No i mój pobieżny kod robi to o czym mówisz
![]() 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ę: 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ł ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 4.09.2008 Ostrzeżenie: (20%) ![]() ![]() |
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:
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? Ten post edytował ^(-.-)^ 23.08.2009, 18:36:07 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
No... nareszcie coś od siebie
![]() 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
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 ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 4.09.2008 Ostrzeżenie: (20%) ![]() ![]() |
No rozumiem ze trzeba ciezko sie napracowac zeby cos osiagnac.
![]() 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:
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 Ten post edytował ^(-.-)^ 23.08.2009, 23:24:38 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 2 Dołączył: 11.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
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...
Ten post edytował Solimo 24.08.2009, 09:22:39 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 4.09.2008 Ostrzeżenie: (20%) ![]() ![]() |
skrypt ktorego poprawiles nie dziala. nic sie nie wyswietla w ogole. Jest tylko pusta biala strona... dlaczego?
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
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: Tak się po prostu nie robi. Więcej błędów zapewne z czasem nam przyniesiesz ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 6.07.2025 - 12:17 |