Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obrazek wczytywany z pliku PHP i różne reakcje na różnych przeglądarkach
Forum PHP.pl > Forum > PHP
Michael2318
Wczytuję z pliku .php obrazek, jednak zanim on się wczyta to do bazy danych mają lecieć dwa zapytania no i na mozilli ładnie lecą, ale kiedy odpaliłem exploerera to zaczęły się dziać dziwne kwiatki. Standardowo, jeśli wczytujemy jakiś plik jako obraz:

Kod
<img src="http://link.pl/obraz.gif" border="0">


To ten obraz jest wczytywany (odświeżany) równocześnie z każdym odświeżeniem przeglądarki użytkownika. Innymi słowy, jeśli dany obrazek występuje na podstronie a, b, c, d to jeśli user będzie tak między nimi latał - za każdym razem obrazek powinien na nowo się wczytać. I tak się dzieje na mozilli, jednak na explore'rze o dziwo - zapytania do bazy się nie wykonują co dla mnie jest nieracjonalne, szczególnie że najpierw zdefiniowane są zapytania (bez poprzedzonych żadnych warunków!), dopiero później sam kod obrazka.

Początek kodu wygląda tak:

  1. $tokens = '345679acdefghjkmnprstuwy';
  2. $key = '';
  3. for ($i=0; $i<5; $i++)
  4. {
  5. $key .= $tokens[rand()%(strlen($tokens))];
  6. }
  7.  
  8. $sql = "DELETE FROM `tabela`
  9. WHERE timestamp < '" . (CR_TIME - 3600) . "'
  10. OR session_id = '" . $userdata['session_id'] . "'";
  11. if ( !$result = $db->sql_query($sql) )
  12. {
  13. }
  14.  
  15. $sql = "INSERT INTO `tabelka`
  16. VALUES ('" . $userdata['session_id'] . "', '" . $key . "', '" . time(). "')";
  17. if ( !$result = $db->sql_query($sql) )
  18. {
  19. }
  20.  
  21. $gen_reg_key = $key;
  22. header('Content-Type: image/png');


Jak widać na samym początku lecą dwa zapytania do bazy, potem dopiero w ogóle otwieram nagłówek png. Jak to wytłumaczyć, że z poziomu explorera te zapytania się nie wykonują, a z poziomu mozilli ładnie działają? ;/ Czy z powodu jednej przeglądarki, te zapytania będę musiał umieszczać w XX miejscach w plikach bo explorer jakoś to dziwnei interpretuje? ;/


EDIT:

Dodanie tego:

  1. header("Cache-Control: no-cache, must-revalidate");


Niby załatwiło sprawę, ale kolejny błąd jaki odkryłem to fakt, że jeśli jesteśmy na stronie A, przechodzimy na podstrone B i wracamy (back) z powrotem na stronę A to obrazek się nie odświeża, czyli chyba trzymany jest w cache przeglądarki. Czy powyższy zapis nie mówi o tym, że obrazek ma być wczytywany cały czas na nowo?
sowiq
Słowo-klucz: cache. Widocznie IE cache'uje obrazki i nie wysyła do serwera requestów pytających o te same pliki statyczne.

Rozwiązanie jest równie sprawne, co złe - dodawaj do obrazka jakiś losowy string:
Cytat
<img src="http://link.pl/obraz.gif?<?php echo rand() ?>" border="0">

Ew. możesz dodać nagłówki, które będą przeciwdziałały cache'owaniu w przeglądarce:
http://www.w3schools.com/php/func_http_header.asp -> Prevent page caching
http://www.electrictoolbox.com/php-caching-headers/
http://www.anyexample.com/programming/php/...ser_caching.xml

Sprawnie działające - bo za każdym razem obrazek będzie miał inny URL, więc przeglądarki za każdym razem będą go pobierały na nowo. Złe - bo obrazek będzie pobierany za każdym odświeżeniem.

Inna sprawa jest taka, że zapewne Twój problem można rozwiązać w prostszy/lepszy sposób.
Michael2318
heh, pomyslałem o tym samym i zedytowałem przed Tobą posta. Jednak oprócz tego nagłówka, który tam podałem, wpisałem jeszcze dodatkowo dwa, ogólnie mam takie nagłówki przed cała treścią:

  1. header("Cache-Control: no-cache, must-revalidate");
  2. header("Pragma: no-cache");
  3. header("Expires: 0");


I teraz niespodzianka - explorer nie trzyma już nic w cache, zawsze wszystko wczytuje od nowa. Nawet cofając strony (back/wróć) ładuje mi nowy obrazek. Ale mozilla niestety z kolei nie ;/ cofając stronę, dostaję ten sam obrazek.
Czy powyższe nagłówki są ok?
sowiq
To nie kwestia nagłówków. Firefox (i zapewne np. Chrome) trzymają w cache całe poprzednio odwiedzone strony. Więc akcja "Wstecz" nie powoduje tego samego co przejście do nowego adresu URL, ale wczytanie całej strony z pamięci podręcznej. Mechanizm ten poprawia szybkość wyświetlania poprzednio odwiedzonych stron.

Dlatego napisałem - może istnieje lepsze rozwiązanie Twojego problemu? Napisz co chcesz osiągnąć.
Michael2318
Co chcę osiągnąć? Generowanie nowego kodu captchy dla każdej nowej strony (w tym wliczając 'wstecz'). Już nie wspomnę, że dopisywanie do adresu jakichś rand'owskich bajerów też nie pomaga ;/
Kod mogę aktualizować w innym miejscu, tylko wolałbym mieć całą captchę w jednym pliku, w tym aktualizowanie tego tokena.

Według mnie to głupota ze strony autorow tych przeglądarek... Przecież skoro definiuje,że nie chcę aby dany element szedł do cachu to nie chcę... No ale pomruczeć sobie pod nosem każdemu wolno.
sowiq
  1. <img src="/sciezka/do/obrazka.gif?<?php echo rand() ?>" id="captcha" />
  2. <script type="text/javascript">
  3. document.getElementById('captcha').src = '/sciezka/do/obrazka.gif?' + Math.random();


Spróbuj tak. Tylko musisz jeszcze wymyślić jakiś sposób, żeby obrazek nie ładował się dwa razy po "normalnym kliknięciu".
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.