Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] jak zrobić cache do listy rozwijanej?
Forum PHP.pl > Forum > Przedszkole
skleps
Zawartość tabeli A wyświetlam jako lista rozwijana <select>, wszystko oczywiście generowane w php.
Zawartość tej tabeli prawie że się nie zmienia więc aż się prosi o robienie jakiegoś cache, żeby nie obciążać bazy danych tym samym zapytaniem.
Zrobienie takiego cache to banał.

Problem robi się, gdy User zaznaczy w liście rozwijanej np. opcję 3 i trzymamy ten wybór w zmiennej sesyjnej. Później ta opcja powinna być automagicznie ustawiona przez całe jego chodzenie po serwisie, dopóki nie zmieni sobie (czyli chodzi o to, ze któraś opcja musi być selected).
Problem w tym, że jeśli zapiszemy do pliku cache ten wybór, to wszystkim innym internautom też będzie się automagicznie wybierałą opcja 3.

Ja wykoncypowałem 2 wyjścia i oba mi się nie podobają:

1. robimy kilka plików cache - jeden dla listy z niewybraną żadną opcją i po jednym dla każdej wybranej opcji
2. robimy pliki cache i wiążemy te pliki z danym internautą przez np. jakiś identyfukator przechowywany w sesji.

Czy jest jakaś inna, łatwiejsza i przyjemniejsza metoda obejścia problemu?
lukaskolista
Piszesz
Cytat
Zrobienie takiego cache to banał.

a pozniej
Cytat
Problem w tym, że jeśli zapiszemy do pliku cache ten wybór, to wszystkim innym internautom też będzie się automagicznie wybierałą opcja 3.
wiec widac nie jest to taki banal. Jak u Ciebie wygladaja pliki cache? Podaj przyklad zawartosci takiego pliku.
skleps
Na razie w ogóle nie wyglądają, bo zastanawiam się jak to rozwiązać.

Na razie widzę algorytm tak, że funkcja generująca tą listę:
1. sprawdza czy istnieje plik cache.
2. jak istnieje to zaczytuje treść pliku i ją zwraca jako swoją odpowiedź. koniec działania funkcji.
3. jeśli plik cache nie istnieje, to zadaje odpowiednie pytanie bazie, następnie tworzy kod listy, zapisuje ją do nowoutworzonego pliku cache i zwraca listę. koneic działania.

a jak może wyglądać taka lista? Ot choćby tak:

  1. <select name="A">


zabawa się robi, gdy trzeba gdzieś wcisnąć "selected" przy odpowiedniej opcji
lukaskolista
wiec nie wiem dlaczego dla uzytkownika 1 mialo by cache'owac liste uzytkownika 2.

Przy okazji jedynym slusznym rozwiazaniem jest cache wynikow zapytania SQL, jezeli dobrze napiszesz zapytanie to wszystko bedzie ok
skleps
Cytat(lukaskolista @ 12.04.2011, 13:36:48 ) *
wiec nie wiem dlaczego dla uzytkownika 1 mialo by cache'owac liste uzytkownika 2


bo jeśli dla użytkownika 1 wpiszesz selected przy np. opcji 3:
  1. 1.
  2. <select name="A">
  3. <option selected>3</option>
  4. </select>


i tak zapiszesz do pliku cache, to gdy użytkownik 2 dostanie dane z tego pliku cache, to będzie miał od razu wybraną opcję 3:
lukaskolista
to dla uzytkownika 2 rob osobny plik cache i po problemie. Nie wiem o co Ci chodzi, cache'uje sie wyniki zapytan z bazy, a nie listy select...

Edit:
opisz jak wedlug Ciebie mialby wygladac mechanizm cache
skleps
Cytat(lukaskolista @ 12.04.2011, 13:43:42 ) *
to dla uzytkownika 2 rob osobny plik cache i po problemie


no i to jest wyjście 2 o którym pisałem, że mi się nie podoba.

Cytat(lukaskolista @ 12.04.2011, 13:43:42 ) *
cache'uje sie wyniki zapytan z bazy, a nie listy select...


a jak zapisać samą odpowiedź z bazy, bez kodów html, do pliku cache?
Tak żeby później jej użyć z poziomu skryptu do stworzenia poprawnej listy rozwijanej?

lukaskolista
czyli jednak nie pojmujesz mechanizmu cache. Normalnie, przez serialize() albo json_encode()

skoro nie podoba Ci sie tworzenie kilku plikow to nie mamy o czym rozmawiac, cache odpada
thek
Ech... A to nie możesz zostawić w spokoju cache Selecta i wybór zapamietać w cookies lub sesji? Pobierać tego nie będziesz z bazy, a po stronie php lub js jedynie zajmiesz sie ustawieniem tego wyboru smile.gif
lukaskolista
Przykladowa zawartosc pliku cache

  1. a:2:{i:0;a:7:{s:2:"id";s:1:"3";s:15:"object_group_id";s:1:"2";s:5:"width";s:1:"1";s:6:"height";s:1:"1";s:8:"width_px";s:2:"31";s:9:"height_px";s:2:"19";s:4:"name";s:5:"Ulica";}i:1;a:7:{s:2:"id";s:1:"5";s:15:"object_group_id";s:1:"3";s:5:"width";s:1:"3";s:6:"height";s:1:"2";s:8:"width_px";s:2:"76";s:9:"height_px";s:3:"136";s:4:"name";s:4:"Blok";}}
skleps
Cytat(lukaskolista @ 12.04.2011, 13:48:25 ) *
przez serialize()


OK, o to chyba chodziło, dzięki

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.