2015-05-31 42 views
5

Mam plik wątku forum thread.php, który pobiera informacje o identyfikatorze tematu.Aktualizowanie unikalnych widoków za pomocą plików cookie

Przykład:

thread.php?id=781

Próbuję stworzyć unikalną konfigurację poglądy, ale nie mam pojęcia, czy jest to rzeczywiście możliwe:

thread.php:

topicId = <?php echo $_GET['id']; ?>; 

if ($.cookie("unique"+topicId)!=="1") { 
    $.cookie("unique"+topicId,1,{expires: 1000, path: '/'}); // create cookie if it doesn't exist 
    $.post('unique.php',{id:topicId}); // update thread unique views 
} 

unique.php

// connection stuff 

$id = mysqli_real_escape_string($conn,$_POST['id']); 
mysqli_query($conn,"UPDATE topics SET unique_views=unique_views+1 WHERE id='$id'"); 

Spowoduje to utworzenie nowego pliku cookie dla każdego wątku. Jeśli użytkownik wyświetli 100 wątków, będzie przechowywać 100 plików cookie. Martwię się, jeśli tworzenie nowego pliku cookie dla każdego wątku jest zbyt duże. Czy to w porządku, czy jest lepszy sposób na zrobienie tego?

Odpowiedz

3

Nawet jest to możliwe, to strata zasobów. Powinieneś serializować swoje dane w jeden plik cookie za pomocą JSON, na przykład.

W JavaScript można zakodować swój wachlarz tematów na ciąg znaków JSON z JSON.stringify:

$.cookie("cookie_name", JSON.stringify(topicsId_array)); 

Następnie można uzyskać dane z JSON.parse:

var topicsId_array = JSON.parse($.cookie("cookie_name")); 

Pamiętaj, że możesz użyć metody JS do dodawania elementów do tablicy (http://www.w3schools.com/jsref/jsref_push.asp), aby uzyskać dane z cookie dodaj nowy identyfikator za pomocą przycisku push, a następnie zapisz go za pomocą stringify.

Na zakończenie należy zadbać o duplikaty. Jeśli nie chcą ich przy użyciu impuls, można użyć https://api.jquery.com/jQuery.unique/ aby wyczyścić tablicę lub użyć własnej funkcji JS, takich jak:

function unique(array_source) 
{ 
    var array_destination = []; 
    var found = false; 
    var x, y; 

    for (x=0; x<array_source.length; x++) 
    { 
     found = false; 
     for (y=0; y<array_destination.length; y++) 
     { 
      if (array_source[x] === array_destination[y]) 
      { 
       found = true; 
       break; 
      } 
     } 
     if (!found) 
     { 
      array_destination.push(array_source[x]); 
     } 
    } 
    return array_destination; 
} 

var topicsId_array = ['aaa', 'bbb', 'ccc', 'aaa']; 
topicsId_array = unique(topicsId_array); 

I w końcu, coś jak to powinno działać:

var topicsId_array = JSON.parse($.cookie("cookie_name")) 
topicsId_array.push("your_new_id"); 
topicsId_array = $.unique(topicsId_array); 
$.cookie("cookie_name", JSON.stringify(topicsId_array));; 
+0

Tylko pytanie - ponieważ musi sprawdzić, czy topicId ustawiany jest na wartość „1”, w tym jeden duży plik cookie, a także faktycznie musi przechowywać wartość cookie "1", jak mam to zrobić i skonfigurować instrukcję if? – frosty

+0

Ok, jeśli chcesz tylko zapisać odwiedzone tematy, powinieneś użyć tablicy id jak ** var topicsId_array = [1, 2, 4, 26]; ** (proste i efektywne), więc tylko w tablicy powinny pozostać tematami ustawionymi na 1 (i usuwać pozostałe).Ale jeśli to nie twoja sprawa i musisz przechowywać dodatkowe dane (takie jak liczba wyświetleń lub cokolwiek innego), możesz użyć tablicy obiektów i przechowywać wszystko, co chcesz. Stringify również będzie działać całkiem dobrze. Oto przykład: [http://jsfiddle.net/y11zLra7](http://jsfiddle.net/y11zLra7) –

0

W każdym przypadku pliki cookie są częścią protokołu HTTP i są przesyłane za pośrednictwem przewodu z każdym żądaniem HTTP, a ponieważ żądanie ma limit rozmiaru, w pewnym momencie przekroczy ten rozmiar i spowoduje niespójność. zachowanie przeglądarki, niezależnie od tego używasz wielu małych plików cookie lub jednego dużego pliku cookie.

bym wybrał rozwiązanie inne niż cookie - najprawdopodobniej będę utrzymywać ją po stronie serwera

Powiązane problemy