![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Podczas tworzenia skryptu strony napotkałem problem. Cała strona ma działanie dynamiczne tj. linki w stylu bla.php?akcja=bla&akcja2=ble. Dajmy na to pojawia się problem przy wysyłaniu komentarza do newsa: ktoś nie wypełni pola nick i pola treść. W moim systemie zakładam, że wiadomość będzie wyświetlać się dynamicznie: jest jeden plik który po otrzymaniu wartości zmiennej $wiadomosc wyświetla ją jako jedyny tekst na świecie (wszystko inne znika, zaś wiadomość zostaje ładnie wycentrowana i wyświetlona). Niby proste ale pojawiają się problemy... oto kilka plików dla przedstawienia problemu: index.php - odpowiedzialny za dynamiczne wyświetlanie strony:
plik news.php - wyświetlanie newsów i dodawanie komentarzy:
kod troszkę przydługi ale uspokajam - nie chodzi o jego całość a raczej o logikę... Jak widać jeśli jest coś do wyświetlenia (jakiś komunikat) to przypisuje się go do zmiennej $wiadomosc. Pod koniec skryptu jeśli zmienna istnieje następuje przekierowanie do index.php?akcja=raporter (część raportująca komunikaty). Niby wszystko działa, ale dzieje się dziwna rzecz - strona owszem zmienia się na index.php?akcja=raporter ale tylko na jedną sekundę i znów wraca do swojej postaci. Poza tym widoczne jest, że nie tylko treść wiadomości się wyświetla ale także formularz do wysyłania komentarzy. Sam się zastanawiam dlaczego tak się dzieje. Macie jakieś inne pomysły jak rozwiązać problem wyświetlania takich komunikatów? Jest to dość częsty skrypt spotykany na większości for (również na tym forum są tego typu komunikaty). Liczę na odpowiedź, pozdrawiam Ten post edytował ZuyPan 4.07.2010, 11:10:05 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Wszystko działa oprócz wyświetlania błędu. Podczas działania news.php pojawił się błąd ponieważ nie wpisałem treści - $wiadomosc już istnieje. Przekierowanie owszem działa natomiast nie wyświetla się treść wiadomości. Oto rozwiązanie jakie zastosowałem:
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Cytat nie chodzi o jego całość a raczej o logikę - otóż to, Twoje problemy wynikają z tego, że masz złą logiczną konstrukcję kodu. Powinieneś podzielić to tak:1. Odbieranie i walidacja zmiennych GET i POST 2. Tworzenie strony 3. Wysłanie strony do przeglądarki Jak się "echuje" stronę po kawałku to stwarza się sobie problemy, bo trzeba masy ifów, trzeba dbać o kolejność i nie można "zawrócić" tego co się już "wyechowało" i ratuje się człowiek przekierowaniem... Zrób sobie tablicę błędów i wszystkie błędy do niej dopisuj, a przed każdym etapem sprawdzaj, czy tablica błędów jest pusta: - wtedy masz czytelne bloki kodu podzielone wg funkcji I zamiast echować pracuj na zmiennych, wtedy w każdej chwili możesz usunąć lub nadpisać treść strony zastępując ją komunikatem błędu lub zmodyfikować w inny sposób. Tak jest chyba wygodniej? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
No cóż... Przyznam szczerze, że nie do końca zrozumiałem (IMG:style_emoticons/default/wstydnis.gif) Od początku Cytat 1. Odbieranie i walidacja zmiennych GET i POST 2. Tworzenie strony 3. Wysłanie strony do przeglądarki Jeśli mógłbyś jakiś najbanalniejszy przykład. Wiem to dziwne, ale jakoś nie umiem połapać się w tym wszystkich jeśli ktoś mi po prostu napiszę. Ja muszę mieć to na przykładzie. W każdym razie ja to tak zrozumiałem: etap 1 - odbieranie:
I jeszcze to. Wiem, że tu pewnie nie ma co tłumaczyć, ale ja naprawdę mam ogromne trudności z przyswajaniem teorii, lepiej wchodzi mi to w praktyce. Przepraszam za kłopot, mam nadzieję, że rozumiesz (IMG:style_emoticons/default/winksmiley.jpg) Ten post edytował ZuyPan 5.07.2010, 09:01:16 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 13 Dołączył: 16.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Możesz przekazać wiadomość z błędem przez sesję. Całkiem fajne rozwiązanie i niezbyt skomplikowane.
|
|
|
![]()
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 ![]() |
A co tu trudnego w tym co napisał Pilsener?
1. Walidacja i obróbka POST, GET na starcie + zapisywanie efektów walidacji do zmiennych 2. Tworzenie strony - albo tutaj piszesz treść, albo wrzucasz ją do zmiennej. 3. Wysyłanie, tylko gdy wrzucałeś stronę do zmiennej to tu ją wyechowujesz. Przykład? Dam banalny form z 2 zmiennymi do obróbki: Tak wygląda startowo formularz. Zauważ, że wiele zostawiłem do dowolnej interpretacji, zależnie od zawartości. Nie chciałem też Ci całego rozpisywania dodawania do bazy pisać. P.S.: Nie dodałem oczywiście nic ze swojej strony o komunikatach dla usera, że Wpis dodano czy są inne błędy niż błędy pól. Je dodajesz oczywiście do $errors, ale już bez nazewnictwa pól i możesz wyświetlić je tam gdzie sprawdzasz czy count($errors) > 0 , tylko minimalnie warunek modyfikujesz. Jeśli są w $errors wpisy, których kluczem jest nazwa pola to wyświetlasz je pod polem odpowiednim. Jeśli sa w $errors klucze, które nie są nazwami pól - wyświetlasz je gdzieś na górze dokumentu. Najprościej kombinować z czymś w stylu array_diff_key( $errors, array('id' => '', 'email' => '') ), czyli pominięciem z tablicy $errors ewentualnych kluczy tyczących pól. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Uch -.- Po prawie 3 latach programowania w php gdzie wydawało mi się, że coś umiem okazało się, że jedno wielkie gówno potrafię -.- Może dlatego, że moje zabawy ograniczały się do wpisywania danych do mysql, robienia systemów newsów, logowania. To co napisałeś (choć to pewnie dziwne) jest dla mnie skomplikowane... (oczywiście nie wszystko, ale mam problem ze zrozumieniem tego kodu)
Boże jakie to irytujące Ten post edytował ZuyPan 5.07.2010, 14:33:25 |
|
|
![]()
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 to strzelę wyjaśnienia poszczególnych linii:
2-3: połączenie z bazą 4-7: struktura z polami formularza i nadaniem im wartości domyślnych jako tablica 8: tablica błędów 9-24: obsługa zmiennej $_GET 10-16: sprawdzenie czy jest zmienna $_GET['id'], czy jest liczbą i jest większa od 0, a jeśli tak to pobranie rekordu z bazy i wrzucenie go do struktury $fields, co zmieni wartości domyślne na właściwe, pobrane z bazy 25-50: obsługa zmiennej $_POST 26-42: walidacja pól i przypisywanie zmiennych z $_POST do $fields, by formularz "pamiętał" co było wpisane. Ewentualne wpisywanie do $errors['nazwa_pola'] odpowiedniego komunikatu błędu 44: sprawdzenie czy udało nam się wszystko zwalidować bezbłędnie. Od tego zależy czy wyświetlimy formularz z komunikatami błędów, czy zrobimy operacje w bazie danych. Tutaj najważniejsze są błędy pól. Tylko je najlepiej tutaj liczyć, bo tylko one są istotne dla procesu operacji w bazie danych. Tak więc albo liczysz ile jest wpisów w $errors, które mają nazwę pola jako klucz, albo dla dodatkowych błędów zakładasz osobną zmienna i zamiast wywołania $errors[] we wcześniejszym kodzie robisz przykładowo $inne_bledy_niz_pol[] 45: od id zależy czy będzie robiony INSERT do bazy, czy UPDATE 53-88: wyświetlenie strony. To jest to o czym pisano jako oddzielenie logiki od prezentacji. Zauważ, że do tej pory nic nie echowałem. Wszystko szło do zmiennych, więc mogłem się śmiać z "headers already sent", bo u mnie nie miał prawa wystąpić. Nigdzie bowiem nic nie wysyłałem. Ten błąd nie ma prawa w moim przykładzie wystąpić. 59: dopiero tutaj wyświetlam ewentualnie napotkane błędy. Uzależniam ich wyświetlanie od struktury tablicy błędów. Można to zrobić na wiele sposobów. 67 i 75: do value pola wpisuję to co zawiera $fields. Trzeba uważać na podwójne apostrofy. Dla pewności najlepiej to co dostajemy z $fields potraktować, albo tutaj, albo już podczas przypisywania wartości do tego pola funkcją htmlspecialchars 69 i 77: sprawdzamy, czy tablica $errors zawiera klucze tyczące tych pól. Jeśli tak, to znaczy, że były jakieś byki podczas walidacji. To sprawdzenie może być walnięte gdzie chcesz. Ja dla wygody usera ustawiam je bezpośrednio pod polem jakiego tyczy. Dzięki temu user zerknie i wie że pole powyżej ma byka, a nie widzi komunikat na górze i szuka potem w formie które to (IMG:style_emoticons/default/winksmiley.jpg) 71 i 79: tu są wyświetlane komunikaty błędów jakie wpisałeś. Popatrz, przemyśl i wiedz, że to jest tylko wstęp do znacznie bardziej rozbudowanych, który ładnie da się zapisać w formie obiektowej, gdzie utworzysz klasę formularza, klasę walidacji i ładnie będziesz na metodach działał. Mając taką jedną, zrobienie formularza z regułkami walidacji, komunikatami błędów itp to później bajka (IMG:style_emoticons/default/smile.gif) Ograniczy się bowiem do paru wpisów, które cały formularz Ci same wygenerują (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem całej tej zabawy z tablicami a zwłaszcza tej od linijki 9 do 24
dalej:
Ogólnie - cała ta zabawa z tablicami jest dla mnie hmmm... Zbyt skomplikowana (?). Tego właśnie chyba najbardziej nie lubię... Co do obiektówki, to próbowałem się nauczyć i w życiu nie zacznę tego używać. Głupie jak lewy but (takie moje osobiste zdanie (IMG:style_emoticons/default/smile.gif) ) Dobra udało mi się to zrobić jako tako sposobem Riggs ale pojawił się problemik (IMG:style_emoticons/default/tongue.gif)
jak zniszczyć tylko sesję "wiadomosc"? session_destroy(); niszczy wszystkie a ja chcę tą konkretną. Ten post edytował ZuyPan 5.07.2010, 17:53:32 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 309 Pomógł: 56 Dołączył: 3.11.2006 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
jak zniszczyć tylko sesję "wiadomosc"? session_destroy(); niszczy wszystkie a ja chcę tą konkretną. unset() |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Teraz chyba maksymalnie wyjaśnione (IMG:style_emoticons/default/smile.gif) Popatrz kiedy jaki if-else i sam załapiesz czemu tak a nie inaczej. Dla POST jest podobnie ale stosuje czasem wbudowane funkcje PHP by sobie ułatwić życie ( empty, filter_var ). |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 21:30 |