2015-05-31 10 views
5

Ho un file di thread del forum thread.php che ottiene informazioni sull'ID argomento.Aggiornamento di viste univoche utilizzando i cookie

Esempio:

thread.php?id=781

Sto cercando di creare una configurazione di vista unico, ma non ho idea se questo è in realtà realizzabile:

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'"); 

Questo creerà un nuovo cookie per ogni thread differente. Quindi se l'utente vede 100 thread, avranno 100 cookie memorizzati. Sono preoccupato se creare un nuovo cookie per ogni thread è troppo. Va bene o c'è un modo migliore per farlo?

risposta

3

Anche se possibile, questo è uno spreco di risorse. Ad esempio, è necessario serializzare i dati in un singolo cookie utilizzando JSON.

in JavaScript è possibile codificare l'array argomenti in una stringa JSON con JSON.stringify:

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

allora si può ottenere i dati con JSON.parse:

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

Ricordare che è possibile utilizzare il metodo per aggiungere il metodo JS per aggiungere elementi a un array (http://www.w3schools.com/jsref/jsref_push.asp), in modo da poter ottenere i dati dal cookie aggiungi il nuovo Id con push e quindi salvalo con stringify.

Per finire, dovresti preoccuparti dei duplicati. Se non si desidera che quando si usa spinta, è possibile utilizzare https://api.jquery.com/jQuery.unique/ per cancellare la matrice o utilizzare una propria funzione JS come ad esempio:

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); 

E alla fine, qualcosa di simile a questo dovrebbe funzionare:

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

Solo una domanda - in quanto ha bisogno di controllare se il TopicId è impostata con il valore "1" all'interno di quella cookie di grandi dimensioni e in realtà ha anche bisogno di memorizzare il valore del cookie di "1", come dovrei farlo e impostare la dichiarazione if? – frosty

+0

Ok, per me se vuoi solo salvare gli argomenti visitati, dovresti usare un array di id come ** var topicsId_array = [1, 2, 4, 26]; ** (semplice ed efficiente), quindi solo nell'array dovrebbero rimanere gli argomenti che sono impostati su 1 (e cancellare gli altri).Ma se non è questo il tuo caso e hai bisogno di memorizzare dati aggiuntivi (come il numero di viste o qualsiasi altra cosa), puoi usare una serie di oggetti e archiviare tutto quello che vuoi. Stringify funzionerà anche molto bene. Ecco un esempio: [http://jsfiddle.net/y11zLra7](http://jsfiddle.net/y11zLra7) –

0

In ogni caso, i cookie fanno parte del protocollo HTTP e vengono inviati via cavo con ogni richiesta HTTP e, poiché la richiesta ha un limite di dimensioni, a un certo punto supererà quella dimensione e causerà incoerenza comportamento del browser, indipendentemente dal fatto che si utilizzano molti piccoli cookie o un cookie di grandi dimensioni.

avrei scelto una soluzione diversa da un cookie - molto probabilmente avrei persistono sul lato server

Problemi correlati