Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rotator bannerów - ratio
Forum PHP.pl > Forum > PHP
Viperx
Mój problem wygląda następująco:
mam już w pełni gotowy rotator bannerów, ale do wybierania bannera do wyświetlenia używam funkcji rand(), a chce żeby bannery wyświetlały się bardziej proporcjonalnie względem innych. I tu wpadłem na pomysł żeby zastosować ratio.
Bardzo proszę o podrzucenie mi jakiegoś pomysłu jak bym mógł to wprowadzić do skryptu. Nie chodzi mi o dokładny skrypt, tylko opis jak mógłbym to wykonać. Dobrze by było żeby też zbytnio nie spowalniało mojego skryptu. Bannery są przechowywane w bazie MySQL jak by to coś zmieniło winksmiley.jpg
crash
Możesz dodaj jakieś pole int do każdego wpisu, przy wylosowaniu tego właśnie banera inkrementować tą wartość. Przy losowaniu uwzględnić wartość tego pola przez np. ORDER BY ratio DESC Przez co będą losowane w miarę "sprawiedliwie".
Viperx
Hmm. Rozwiązanie ogólnie dobre, ale tylko wtedy gdy się nie dodaje nowych bannerów. Bo jak już wcześniej dodane bannery są po kilku tysiącach wyświetleń to nowo dodany będzie się wyświetlał bez przerwy aż dojdzie do wartości pozostałych. Więc to rozwiązanie mi nie pomoże sad.gif Ale i tak dzięki za chęci smile.gif Może inne pomysły ?
reemii
to przy wstawianiu nowego wartość tego pola ustawiasz jako najmniejszą, najwiekszą lub średnią wartość ze wszystkich banerów i po kłopocie.

Ew. inne rozwiązanie - robisz sobie drugą tabelę z samymi id banerów i z niej losujesz. Wylosowany usuwasz z tabeli, jak nic nie zostanie to przed losowaniem zapełniasz tabelę. Przy dodawaniu nowego po prostu dodajesz id do tabeli. Żeby nie bawić się dwoma tabelami to dodajesz do tabelki z banerami pole ktore może mieć dwie wartości 1 i 0, losujesz tylko z tych co mają np. 1 i po wylosowaniu zmieniasz na 0, jak są same zera to wszystkie zmieniasz na 1.

Możliwości jest multum - można by tak jeszcze wymyslać i wymyslać...
Viperx
No to już troche lepsze rozwiązanie smile.gif Ale tylko dla ratio 1:1 sad.gif W innych przypadkach (na przykład 2:1) się nie sprawdzi ale na razie to zastosuje smile.gif Dzięki za pomoc smile.gif

Po edycji przez reemii:
Dwie tabele raczej odpadną. To by zbyt zaśmiecało bazę danych. Ale ten ostatni pomysł myślę że po drobnych usprawnieniach może się sprawdzić dla innych ratio. Dzięki smile.gif
dr_bonzo
No to dodaj rekord z ratio X, X razy.
Viperx
@dr_bonzo:
Za dużo z tym mieszania, bo dodając banner przez panel administracyjny podaną liczbę wyświetleń trzeba by dzielić przez ratio i dodać banner kilka razy do bazy.

Pomysł reemii już częściowo zaimplementowałem do skryptu w ten sposób że do kolumny ratio wpisuje ratio bannera (np. 1, 2, 200 winksmiley.jpg. Po za tym dodałem jeszcze jedną kolumnę w której wartości początkowe dla każdego wiersza są takie same jak w kolumnie ratio dla tego wiersza. Po każdym wyświetleniu bannera po prostu zmniejszam wartość z tej drugiej kolumny. I gdy w tej ostatniej kolumnie wszystkie bannery będą miały wartość 0 to ... no właśnie. I tu mam problem. W MySQL'u nie jestem zbyt zaawansowany. Szukałem w manualu funkcji która by wypełniła całą kolumnę jedną wartością, ale nie znalazłem. Ale to i tak by się sprawdziło tylko dla ratio 1:1. Tym razem proszę o pomoc w postaci kodu, który by przeleciał całą tabelę i w ostaniej kolumnie (nazwałem ją 'ratio_left') wpisał takie wartości jak w kolumnie przed ostatniej ('ratio'). Jeśli dostanę tą odpowiedź to ten temat będzie można oficjalnie zamknąć winksmiley.jpg Dzięki wszystkim za pomoc smile.gif
Kocurro
masz:

1)

  1. UPDATE `tabelka` SET `pole` = 'wartosc' WHERE 1


Uaktualni Ci cała tabelkę `tabelka` i wpsize do wszystkich pól `pole` jedną wartość 'wartosc'

2)

  1. UPDATE `tabelka` SET `pole` = `inne_pole` WHERE 1


Uaktualni Ci cała tabelkę `tabelka` i wpsize do wszystkich pól `pole` wartość pola `inne_pole` z tego samego rekordu.

Mam nadzieję, że dobrze Cię zrozumiałem.

Pozdrawiam


btw -> co to kolorowanie skłądni takie denne ?
hawk
Matematycznie rzecz biorąc, "ratio" powinno oznaczać, że niektóre bannery wyświetlają się cześciej od innych. Statystycznie: proporcjonalnie do tego nieszczęsnego ratio. Czyli proces bez pamięci. Wtedy sprawa jest prosta: dla każdego bannera umieszczasz w bazie jego wagę, a losując banner trzeba:
- ustalić jakoś kolejność bannerów
- policzyć sumę wag
- wylosować liczbę od 0 do (suma wag - 1)
- sprawdzić, który banner odpowiada wylosowanej liczbie
Prosty rozkład prawdopodobieństwa.

Natomiast jeżeli proces ma mieć pamięć (pokazanie bannera zmniejsza prawdopodobieństwo pokazania go w przyszłości), to... gorzej. Wtedy musisz określić, jak taki proces ma się zachowywać, i słowo "ratio" na pewno nic tutaj nie wyjaśnia.
Kocurro
@hawk: jemu chodzi o prosty system winksmiley.jpg

Sam stosuję takie rozwiazanie jak on, i powiem, że sprawdzwa się w miarę dobrze gdy jest nie więcej niż 10 bannerów. Ale gdy jest więcej niż 50 bannerów to robię normalnie bez ratio - na zwykłych polach - wyświetlono i do wyświetlenia. I tak wtedy raz za razem banenr pojawia się żadko.
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.