目前,我尝试为我的网页建立一个类似的计数器。
您可以在下面看到点击计数器。完全正常。遗憾的是(但可以肯定)仅用于当前会话...是否有可能永久存储该值?
最后一件事!网站上有不止一张图片喜欢。所以我不知道如何使用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": …