2015-05-31 19 views
5

Tôi có một tệp chuỗi diễn đàn thread.php nhận thông tin ID chủ đề.Cập nhật chế độ xem duy nhất bằng cookie

Ví dụ:

thread.php?id=781

Tôi đang cố gắng để tạo ra một thiết lập quan điểm độc đáo, nhưng tôi không có ý tưởng nếu điều này là thực sự khả thi:

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

Điều này sẽ tạo cookie mới cho từng chuỗi khác nhau. Vì vậy, nếu người dùng xem 100 chủ đề, họ sẽ có 100 cookie được lưu trữ. Tôi lo lắng nếu tạo một cookie mới cho mỗi chủ đề là quá nhiều. Có ổn không hoặc có cách nào tốt hơn để làm điều đó không?

Trả lời

3

Thậm chí có thể, đó là một sự lãng phí tài nguyên. Ví dụ, bạn nên tuần tự hóa dữ liệu của mình thành một cookie duy nhất bằng JSON.

Trong javascript bạn có thể mã hóa chủ đề mảng của bạn thành một chuỗi JSON với JSON.stringify:

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

Sau đó, bạn có thể nhận được dữ liệu với JSON.parse:

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

Hãy nhớ rằng bạn có thể sử dụng phương pháp đẩy JS để thêm các phần tử vào một mảng (http://www.w3schools.com/jsref/jsref_push.asp), vì vậy bạn có thể lấy dữ liệu từ cookie thêm Id mới với push và sau đó lưu nó với stringify.

Để hoàn tất, bạn nên quan tâm đến các bản sao. Nếu bạn không muốn họ khi sử dụng push, bạn có thể sử dụng https://api.jquery.com/jQuery.unique/ để xóa mảng hoặc sử dụng một hàm JS riêng như:

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

Và cuối cùng, một cái gì đó như thế này nên làm việc:

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

Chỉ cần một câu hỏi - kể từ khi nó cần phải kiểm tra xem topicId được thiết lập với giá trị "1" trong vòng một mà cookie lớn và cũng thực sự cần lưu trữ giá trị cookie của "1", làm cách nào tôi làm điều đó và thiết lập câu lệnh if? – frosty

+0

Ok, đối với tôi nếu bạn chỉ muốn lưu các chủ đề được truy cập, bạn nên sử dụng một mảng id như ** var topicsId_array = [1, 2, 4, 26]; ** (đơn giản và hiệu quả), vì vậy chỉ trong mảng nên giữ nguyên các chủ đề được đặt thành 1 (và xóa các chủ đề khác).Nhưng nếu bạn không phải là trường hợp của bạn và bạn cần phải lưu trữ dữ liệu bổ sung (chẳng hạn như số lượt xem hoặc bất kỳ điều gì khác), bạn có thể sử dụng một mảng các đối tượng và lưu trữ tất cả những gì bạn muốn. Stringify cũng sẽ hoạt động khá tốt. Ở đây bạn có một ví dụ: [http://jsfiddle.net/y11zLra7](http://jsfiddle.net/y11zLra7) –

0

Trong mọi trường hợp, cookie là một phần của giao thức HTTP và được gửi qua dây với mọi yêu cầu HTTP và do yêu cầu có giới hạn kích thước, tại một thời điểm nhất định, cookie sẽ vượt quá kích thước đó và sẽ gây ra sự không phù hợp hành vi của trình duyệt, bất kể bạn sử dụng nhiều cookie nhỏ hay một cookie lớn.

tôi sẽ chọn một giải pháp khác hơn là một cookie - nhiều khả năng tôi sẽ kiên trì nó ở phía máy chủ

Các vấn đề liên quan