2015-06-01 78 views
0

目前我嘗試爲我的網頁建立一個類似的計數器。
您可以在下面看到點擊計數器。它完全正常工作。可悲的是(但肯定)只是針對當前的會話...有沒有可能永久存儲價值?保存點擊每個項目的點擊次數

最後一件事!在網站上是不止一張圖片。所以我不知道如何使用cookie或localstorage存儲值。

也許你有另一個想法?也許沒有JS?

var currentValue = 0, 
 
    count = $('.count'); 
 

 
$(document).ready(function() { 
 
    count.each(function(i) { 
 
    $(this).addClass('' + (i += 1)); 
 
    }); 
 
}); 
 

 

 

 
$('.heart').on('click', function(e) { 
 
    var clickElement = $(this).find('.count'); 
 

 
    clickElement.html(parseInt(clickElement.html(), 10) + 1); 
 
});
<p>Click on the Number to increase it by 1</p> 
 

 
<a class="heart"> 
 
    <span class="icon"></span> 
 
    <span class="count">0</span> 
 
</a> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

這是它看起來像在頁面上: enter image description here

+2

寫入數據的基礎上 –

+0

數據庫將是理想的,但如果你不處理一些後端代碼,你可以使用'locaStorage'保持在瀏覽器中的值頁面被關閉後,後來檢索。 –

回答

2

你應該做的就是將它們存儲在數據庫中。 您應該將項目的id和當前計數發送到服務器,通過查詢數據庫檢查項目的當前計數和是否存在,如果已驗證,則將它們保存到數據庫(根據您的數據庫方案更新或插入) 。

修訂

注:將它們保存到數據庫之前檢查值正確性是極其重要的。因此,通過發送$_POST值中的項目當前點擊次數來檢查當前點擊次數是可靠的。你確實應該做的是剛剛經歷$_POST發送的內容的ID,然後看該項目是否存在,如果存在,編寫以下查詢遞增點擊數只是一個值:

UPDATE item_table SET (click_counter = click_counter+1) WHERE item_id = ? 

這有幾個特點:

  • 它比常規的SELECT + increment_in_php +更新更快,更 更快
  • 它使用更少的系統資源
  • 這是遞增的最可靠的方法,因爲得到控制而e 以PHP處理用戶值,另一個請求可能只是更新該值,因此您的PHP值不是最新的 之一。但通過SQL,它已經知道什麼是最新值 ,並且不會有這種衝突。

如果您將click_counter作爲item_table的一列並僅更新它,則上述方法和解釋適用。但我有一個建議(當然,如果你還沒有實現這個)

製作一個表,例如item_counts,然後是三個列,如id,item_id,date_created。您可以添加許多其他列,如user_ip,user_id(如果已通過驗證)等。

然後通過每次訪問,您只需向表中添加一條記錄。這與以前的解決方案有幾個特點:

  • 它與數據庫原子性規則兼容。

  • 以後可以有它的分析。

您可以通過查詢得到click_counts的於數據庫:

SELECT COUNT(id) FROM item_counts WHERE item_id = ? 

這種解決方案的缺點是,你必須有渲染頁面時獲得一個項目的click_counts一個額外的查詢。 它當然需要更多的服務器空間,但如果您的項目不是一個小型項目,那麼這是值得的。但是,如果這種做法很容易獲得,我個人從不試圖爲項目的規模殺死好的做法。

結束時更新注的

您可以發送一個Ajax請求:

var already_clicked = []; 

$('.heart').on('click', function(e) { 
    var clickElement = $(this).find('.count'); 
    var itemId = $(this).attr("data-id"); 
    // changes to current view in the page 
    clickElement.html(parseInt(clickElement.html(), 10) + 1); 


    // send an ajax request 
    $.ajax({ 
    url : "server.php", 
    data : { count : parseInt(clickElement.html(), 10), 
      id : }, 
    type : "POST", 
    success : function(data){ 
     // do something in the success 
    } 
    }); 
}); 

現在你的PHP腳本應該是這樣的

// using MySQLi extension 
$db = new mysqli("localhost", "usr", "pass", "db"); 

if(isset($_POST["count"]) && isset($_POST["id"])) 
{ 
    if (check_if_the_count_is_ok($_POST["count"], $_POST["id"])) 
    { 
     $new_count = $_POST["count"] + 1; 
     $stmt = $db->prepare("INSERT INTO counts (count, id) VALUES(?, ?)"); 

     $stmt->bind_param("ii", $new_count, $_POST["id"]); 
     $stmt->execute(); 

     echo json_encode([ "result" : true ]); 
    } 
    else 
    { 
     echo json_encode([ "result" : false]); 
    } 


} 


function check_if_the_count_is_ok($item_count, $item_id) 
{ 
    // write a select query to see if the count is true 
} 

注:我假設你被點擊item包含一個名爲「data-id」的屬性,它保存要保存到數據庫的項目的ID。

+0

謝謝!我會明天嘗試..不能相信我忘了2使用數據庫... –

+0

不客氣。您可以接受它作爲未來訪問者的答案。 –

+0

當然我會;)但我需要一些時間2測試它,因爲我有2個工作爲其他客戶@第一 –

-1

如果使用DB與應用程序,管理與每個稱爲lovit_count像你的數據庫列的畫面計數。然後爲每個點擊事件增加或減少該字段的值。

當加載頁面,您可以加載從數據庫中的圖像上點擊次數。

+0

歐普沒有談論數據庫。你也可以提供一些你正在談論的代碼嗎? –

+0

@LelioFaieta沒有關於數據庫和數據庫結構的想法,我該如何提供代碼? – KTAnj