我正在尝试创建一个类似 fb 的按钮功能(不是 facebook api)。我的网站上有两个按钮:喜欢和不喜欢。数据库将保存总共有多少喜欢和不喜欢。
这是数据库表:
id |post_id |like_count
40 | 20 | 0
当用户点击喜欢按钮时的代码:
$id = 40;
$conn->autocommit(FALSE);
$conn->query("BEGIN;");
//lock the row to prevent race condition
$sql = "SELECT like_count FROM post_like WHERE id = ? LIMIT 1 FOR UPDATE";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
//update the table
$sql = "UPDATE post_like SET like_count = like_count + 1 WHERE id = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
$conn->commit();
$conn->autocommit(TRUE);
$conn->close();
//when success, display unlike button to user throught AJAX
以及用户单击不同按钮时的代码:
$id = 40;
$conn->autocommit(FALSE);
$conn->query("BEGIN;");
//lock the row to prevent race condition
$sql = "SELECT like_count FROM post_like WHERE id = ? LIMIT 1 FOR UPDATE";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
//update the table
$sql = "UPDATE post_like SET like_count = like_count - 1 WHERE id = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
$conn->commit();
$conn->autocommit(TRUE);
$conn->close();
//when success, display like button to user throught AJAX
问题来了……
like_count的数量从0开始。
理论上,如果只有一个人点击按钮,like_count不会超过1或小于0。
(点击like按钮->->锁定行->like_count+ 1->释放行->显示不同按钮)
(单击不同按钮->锁定行->like_count-1->释放行->显示类似按钮)
当我慢慢单击按钮时,我可以正确地完成这项工作,但是,当我继续快速点击按钮,like_count 的个数可能会超过 2,有时可能是负数。
我不知道我做错了什么。请帮忙!