Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zaawansowany system reklamowy
Forum PHP.pl > Forum > PHP
Michael2318
Witam!

Mam zamiar wziąć się za tworzenie zaawansowanego systemu reklamowego na swojej stronie. Chodzi o to, że użytkownik będzie mógł wykupić na stronie dowolną formę reklamy (albo XX wyświetleń albo XX dni wyświetlania jego bannera). Do tego chciałbym stworzyć panel, gdzie użytkownik będzie mógł sobie podglądać skuteczność jego reklamy, czyli po prostu panel z takimi danymi jak ilość kliknięć w reklamę oraz ilość wyświetleń w danym dniu.
No i teraz pytanie - jak zliczać wyświetlenia tej reklamy? Co odświeżenie pakować:

  1. $sql = "UPDATE `adverts` SET count = count+1 WHERE id = X";


?

Nie wiem zbytnio jak to jest zrobione na innych stronach, jeśli wykupuje się powiedzmy 1000 wyświetleń za ileś tam zł. Chodz o wyświetlenia unikalne czy też nie?
SmokAnalog
Myślę, że chodzi o wyświetlenia unikalne, bo w przeciwnym wypadku byłoby to zbyt łatwe do nabijania. Ja bym zrobił chyba zliczanie wyświetleń po IP, gdzie liczyłoby się tylko jedno wyświetlenie z danego IP na dzień, albo np. jedno na 12 godzin - kwestia do ustalenia.

Wtedy mógłbyś mieć osobną tabelę np. adverts_views:
Kod
id | advert_id | ip | time


Rozwiązanie takie ma jeszcze taką zaletę, że w każdej chwili możesz zmienić zdanie na temat liczby godzin, co którą nowe wyświetlenie ma zostać uwzględnione.
Michael2318
Kliknięcia w link proponujesz zliczać w podobny sposób czy tam nie patrzeć już na unikalność i wrzucać value+1 zawsze ?

EDIT:

Nasunęło mi się jeszcze jedno pytanie. Będzie kilka reklam losowo wyświetlanych i zależnie od tego która reklama w danym momencie się wyświetli - jej licznik będzie aktualizowany. Tak więc sprawdzanie czy dane IP już było zliczone dla danej reklamy jest możliwe tylko po sprawdzeniu tego w bazie danych, co daje dwa zapytania:

  1. $sql = "SELECT * FROM `adverts_view` WHERE advert_id = X AND ip = Y;";


potem:

  1. if ( $num < 1 )
  2. {
  3. $sql = "INSERT INTO ... bla bla";
  4. }


tak więc i tak zawsze będę musiał chyba wykonywać to sprawdzanie w ten sposób. Zastanawiam się czy nie będzie lżej przetrzymywać w jakimś cache tablicy z numerami IP dla danych reklam i tak to porównywać ?
SmokAnalog
  1. Dla kliknięć też zrobiłbym unikalne.
  2. Wystarczy przechowywać IP w sensownej postaci (nie jako ciąg znaków) i założyć indeks na to pole. Jest jeszcze inna możliwość: zakładając, że chcesz zliczać np. jedno kliknięcie/wyświetlenie dziennie, możesz skryptem wywoływanym automatycznie po północy czyścić całą tabelę z kliknięciami/wyświetleniami. Możesz wtedy nawet uniknąć sprawdzania ręcznego czy należy dodać klik/wyśw., nakładając unikalny indeks na parę pól: advert_id i ip. Wtedy baza sama nie pozwoli wstawić np. dwóch klików dla tej samej reklamy z jednego IP.
Michael2318
Tak tylko jeśli będę chciał wstawić dla advert_id = 4, dwa różne IP to przepuści ? Bo przecież będzie nadany indeks na advert_id. Chyba będzie trzeba zrobić unikalny inteks tylko na pole z IP i oddzielna tabela dla wyświetleń, oddzielna dla kliknięć.
freemp3
Wybaczcie, że się wtrącam, ale proponował bym, zrobić zliczanie zarówno wszystkich jak i unikalnych kliknięć / wyświetleń.
Jeśli chodzi o sam mechanizm sprawdzania unikatowości oprócz IP, możesz użyć także sesji oraz cookies. Mógłbyś sprawdzać najpierw sesje, później cookies, a dopiero na końcu adres IP. Sesja jak i cookies na pewno będą szybsze niż sprawdzanie za każdym razem IP.

Michael2318
Tylko zapytanie kierowane do bazy przy każdorazowym odświeżeniu strony dodatkowo obciąży stronę, a nie wiem czy te informacje będę wykorzystywał w panelu. Zastanawiam się czy nie ograniczyć tego po prostu do liczb:

Poniedziałek, dd-mm-yy: 243 wejścia unikalne,
Wtorek, dd-mm-yy: 212 wejść unikalnych.

Lub po prostu samo:

Wszystkich wejść unilalnych: 1342

Aczkolwiek to drugie jest trochę zbyt ubogie, myślę, że wersja pierwsza cieszyłaby się większym zainteresowaniem.
freemp3
Informacje możesz zapisywać w pliku tymczasowym. Jeśli się uzbiera określona liczba to zapisujesz ją do bazy lub jeśli klient będzie sprawdzał statystyki. Zapis do plików będzie szybszy niż do bazy.
Michael2318
No więc finalnie, może w ten sposób.

Wyświetlam reklamę o ID = X, userowi, któremu się to wyświetliło tworzę sesję - $_SESSION['advert_X'] = time(); oraz ciastko z tymi samymi wartościami (sesja zniknie, jeśli user np. wyloguje się na stronie, ponieważ zachodzi session_destroy() )
Jednocześnie do tabeli advert_views dodaję nowy wpis.

Teraz, chcąc sprawdzić czy dany delikwent już widział/klikał w reklamę:

  1. if ( (!isset($_SESSION['advert_231']) || (intval($_SESSION['advert_231'])+86400) < time() ) // jesli sesja nie istnieje albo jest sprzed 24h
  2. {
  3. if ( (!isset($_COOKIE['advert_231']) || (intval($_COOKIE['advert_231'])+86400) < time() ) // jw. tylko z ciastkami
  4. {
  5. // jesli sesja/ciacho nie istnieje lub czas jest wiekszy niz 24h to...
  6. // pierw sprawdzam czy czasami nie usunal ciasteczek albo czy nie wchodzi przez inna przegladarke
  7. // SELECT * FROM `adverts` WHERE ip = xx AND advert_id = X;
  8.  
  9. // jesli $num_items < 1 to wrzucam nowy wpis do bazy
  10. // jesli user mnie "oklamal" i usunal ciasteczka i sesje to tworze je na nowo
  11. }
  12. }


bedzie ok?
SmokAnalog
Cytat(Michael2318 @ 28.11.2013, 13:46:15 ) *
Tak tylko jeśli będę chciał wstawić dla advert_id = 4, dwa różne IP to przepuści ? Bo przecież będzie nadany indeks na advert_id. Chyba będzie trzeba zrobić unikalny inteks tylko na pole z IP i oddzielna tabela dla wyświetleń, oddzielna dla kliknięć.

Możesz nałożyć pojedynczy indeks na kilka pól naraz. To jest właśnie cały myk - wtedy analizowana jest dana kombinacja, czyli zabroniona będzie w Twoim przypadku każda powtórka PARY advert_id i ip.

Nie polecam opierać tego mechanizmu na sesji / ciastkach. To są zbyt ulotne dane - wystarczy, że ktoś np. używa trybu Incognito w Google Chrome - wtedy za każde wyłączenie przeglądarki będzie kasowało jego ciastka, nie mówiąc o możliwości ich ręcznego usunięcia.

Idealnej metody nie ma, bo IP to też nie jest w stu procentach sprawiedliwy sposób. Przecież kilka osób może korzystać niezależnie z tej samej sieci (np. kafejka), a Ty wtedy zliczysz ich wszystkich jako jedną osobę. Poza tym są przecież tzw. zmienne IP. Mimo wszystko to jest moim zdaniem najmniejsze zło.
freemp3
Cytat
Nie polecam opierać tego mechanizmu na sesji / ciastkach. To są zbyt ulotne dane - wystarczy, że ktoś np. używa trybu Incognito w Google Chrome - wtedy za każde wyłączenie przeglądarki będzie kasowało jego ciastka, nie mówiąc o możliwości ich ręcznego usunięcia.

Racja, ale nadają się do szybkiego sprawdzenia pewnych informacji. W przypadku braku sesji lub usunięcia ciasteczka używany jest drugi mechanizm sprawdzający smile.gif

Oczywiście adres IP też nie jest idealnym rozwiązaniem, dlatego warto zebrać możliwie jak najwięcej informacji.
Michael2318
Zgadza się, IP samo w sobie też nie jest sprawiedliwe, ale jest to najlepszy punkt zaczepienia z możliwych.
IP zmienia się chyba co jakiś czas lub po restarcie routera (czyli co jakiś okres czasu), więc na te 12 czy tam 24h to nie będzie miało znów tak wielkiego znaczenia bo i tak wtedy wszystkie dane "znikną".

Teraz jest kolejny problem bo jeśli ta tabela ma być czyszczona co 24h to muszę jakoś zapisywać te dane równocześnie to innej tabeli, żeby mieć jak tworzyć statystyki (mieć na czym bazować, tworząc je).
Kolejna tabela, ze schematem:

advert_id | unique_views

i przed czyszczeniem tabeli, aktualizacja w ten sposób? Wada tego będzie taka, że statystyki z dnia obecnego poznam dopiero następnego dnia, czyli tak naprawde nigdy nie bede w stanie sprawdzić statystyk danej reklamy z danej chwili/dnia bo zapiszę je do tabeli dopiero na początku nastepnego dnia (po północy).
Ah i kolejna wada - jeśli chcę, aby reklama była emitowana do 1000 wyświetleń i przykładowo dnia poprzedniego reklama miała 930 wyświetleń to może się okazać, że po aktualizacji dnia następnego będzie miała już 1211, czyli przekroczy limit czego bym nie chciał.
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.