您应该将它们存储在数据库中。
您应该将项目的 id 和当前计数发送到服务器,通过查询数据库检查项目的当前计数和存在,如果验证,将它们保存到数据库(更新或插入,取决于您的数据库方案)。
更新
注意:在将值保存到数据库之前检查值的正确性非常重要。因此,通过在$_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。