0

我正在尝试创建一个类似 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,有时可能是负数。
我不知道我做错了什么。请帮忙!

4

3 回答 3

0

in your update query put

$stmt->execute();

below

$stmt->bind_param('i', $id);
于 2013-08-29T08:43:38.373 回答
0

处理所有按钮的代码。

$amount = (isset($_POST['like'])) ? 1 : -1;
$sql    = "UPDATE post_like SET like_count = like_count + ? WHERE post_id = ?";
$stmt   = $conn->prepare($sql);
$stmt->execute(array($amount,$_POST['id']));

请注意,您不需要此表中的 id 列。post_id 没问题

于 2013-08-29T08:47:12.253 回答
0

改变:

$conn->autocommit(FALSE);

至:

$conn->autocommit(TRUE);

更新和插入查询不适用于$conn->autocommit(FALSE);

于 2018-05-01T13:10:21.073 回答