ďťż

[PHP] Problem z cache Przycisk Wstecz + AJAX POST

       

Podstrony


telcocafe

1. Gdy user wciśnie WSTECZ, strona poprzednia powinna załadować się z CACHE przeglądarki - nie powinna być ładowana ponownie. Zapobiegnie to np. utracie danych w formularzu, kiedy nie będzie można go wyświetlić w wyniku poważnego błędu. Na localhost udało mi się to zrobić za pomocą wysyłanego nagłówka:Header('Cache-Control: public');Niestety na niektórych hostingach ten sposób nie działa, gdyż serwer wysyła własne nagłówki z wartościami typu must-revalidate, no-store, max-age=0 i pomija powyższy kod.

2. Z rozwiązania pierwszego problemu wynika drugi. Gdy wysyłam AJAX-em dane metodą POST na określony adres URL, przeglądarka zapamiętuje odpowiedź serwera. W efekcie po ponownym wysłaniu formularza skrypt PHP nie wykonuje się. Przykład: wpisujemy treść komentarza i klikamy PODGLĄD. Następnie naciskamy WYŚLIJ - nic się nie dzieje. Jaki jest najlepszy sposób, aby naprawić problem? W przypadku, gdy serwer ustawia własne nagłówki Cache-Control i Pragma (jak wyżej), skrypt PHP zawsze wykonuje się i zwracane są prawidłowe odpowiedzi.



Nie obejdziesz ani różnych konfiguracji serwerów ani różnic przeglądarek. Jeżeli wystąpił "poważny błąd" to cofnięcie wiele i tak nie da (plus większość problemów wynikłych przy przetwarzaniu danych z tego formularza można przechwycić i obsłużyć wyświetlając wypełniony formularz z odpowiednim komunikatem)

Co do Ajaxa - jednym z prostszych rozwiązań jest dodanie do url losowej liczby przy tworzeniu URL (adres na który wysyłasz formularz) na zasadzie

var url = 'jakis_plik.php'; url = url + "?clear_cache=" + Math.random()*Math.random();

To spowoduje, że przeglądarce będzie się wydawać że zawsze wysyła na inny plik.
Użytkownik j-mail edytował ten post 30 maj 2009, 09:16
co potrafi robić np. jQuery samo z siebie :)



nie spamuj ;P

nie było słowa o jQuery więc założyłem, ze kolega wszystko sam kodzi. To trzeba mu podpowiedzieć ;)

Jeszcze co do pierwszej części pytania. Dobra rada - jak wysyłasz formularz to wysyłaj na ten sam skrypt, i jak się uda zapisać przekierowuj na stronę z informacją o poprawnym zapisie ;)

Jeżeli wystąpi błąd, który można złapać, zwracam formularz z wypełnionymi danymi do klienta. Są jednak sytuacje, które to uniemożliwiają, np. pad serwera (nie każdy wie, że trzeba wcisnąć F5) albo jeszcze inna niespodzianka.

Wracając do AJAX - można też tak zrobić, jak napisał j-mail, ale może są lepsze sposoby?

na pad serwera to raczej nic nie poradzisz. wtedy nawet ustawienie czegoś w sesji nie pomoże.

no chyba, że chce Ci się bawić w zapis cookies. Wtedy po powrocie na poprzednią stronę odczytujesz czy ten formularz już został zapisany. jeżeli nie to z cookies przywracasz dane. a po zapisie czyścisz cookies.

co do Ajax'a -> no to to chyba najszybszy sposób i szybszego nie znajdziesz ;)


Wracając do AJAX - można też tak zrobić, jak napisał j-mail, ale może są lepsze sposoby?
Nie ;) Co najwyżej możesz popatrzyć jak rozwiązują to frameworki JS (to forum nie jest centrum nowych technologii programistycznych). jQuery dokleja timestampa (coś randomowego). Inne raczej stosują to samo rozwiązanie.

W przypadku błędów na wyższym poziomie user dostaje stronę błędu i zaprzątanie sobie głowy danymi z formularza to raczej strata czasu. Coś się wykrzaczyło i jeżeli user zacznie wielokrotnie próbować wysyłać ten formularz to tylko zawali logi błędów.

PS. AJAXowo wysyłane formularze to aż tak konieczne rozwiązanie? Wrzucanie bajerów żeby "fajnie wyglądało", albo "ja to potrafię" nie zawsze jest uzasadnione z punktu funkcjonalności, czy też przejrzystości kodu client i server-side.
Użytkownik Riklaunim edytował ten post 30 maj 2009, 18:47
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.