保存一个项目的点击计数,每个项目被点击 - javascript

目前,我尝试为我的网页建立一个类似的计数器。
您可以在下面看到点击计数器。完全正常。遗憾的是(但可以肯定)仅用于当前会话...是否有可能永久存储该值?

最后一件事!网站上有不止一张图片喜欢。所以我不知道如何使用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>

这是页面上的样子:

参考方案

您应该做的是将它们存储在数据库中。
您应该将ID和该项目的当前计数发送到服务器,通过查询数据库来检查该项目的当前计数和存在,并且如果验证成功,则将它们保存到数据库(更新或插入,具体取决于您的DB方案)。

更新

注意:在将值保存到数据库中之前检查其正确性极其重要。因此,通过以$_POST值发送项目的当前点击数来检查当前点击数是可靠的。实际上,您应该做的只是通过$_POST发送项目的ID,然后查看该项目是否存在(如果存在),编写以下查询以将点击计数增加一个值:

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

它具有几个功能:

它比常规的select + increment_in_php + update速度快得多
快点
它使用更少的系统资源
这是最可靠的增量方法,因为
在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
} 

注意:我假设您单击的项目包含一个名为“ data-id”的属性,该属性保存要保存到数据库的项目的ID。

如何在没有for循环的情况下在Javascript中使用Django模板标签 - javascript

我想在JavaScript中使用模板变量:我的问题是在javascript代码中使用for循环,for循环之间的所有事情都会重复..但我不想要....下面粘贴了我的代码..有人可以告诉我更好的方法吗这..因为这看起来很丑..这是我的代码: {% block extra_javascript %} <script src="/static/js…

使用JS和PHP更改弹出窗口背景图像 - javascript

我有一个JS函数:function zoom(now) { document.getElementById("popup").style.display = "block"; document.getElementById("photos").style.backgroundImage = …

打印二维阵列 - javascript

我正在尝试打印子元素。在this example之后。怎么做?。$myarray = array("DO"=>array('IDEAS','BRANDS','CREATIVE','CAMPAIGNS'), "JOCKEY"=>a…

执行onclick时获得意外令牌 - javascript

我正在使用onclick事件从PHP调用JS函数。这是我的代码:我在一个函数中,因此我需要通过PHP来完成它,因为然后我会返回:$html = '<input type="checkbox" checked value="1" id="setGetSku" name="se…

Mongo汇总 - javascript

我的收藏中有以下文件{ "_id": ObjectId("54490b8104f7142f22ecc97f"), "title": "Sample1", "slug": "samplenews", "cat": …