fbのようなボタン関数(Facebook APIではありません)を作成しようとしています。私のウェブサイトには、好きと嫌いの 2 つのボタンがあります。データベースは、好きなものと嫌いなものの合計数を保存します。
db テーブルは次のとおりです。
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 から始まります。理論的には、ボタンをクリックする人が 1 人しかいない場合、
like_count
は 1 を超えたり 0 未満になったりしません。
1->行を解放->ボタンとは異なり表示)
(ボタンとは異なるクリック->行をロック->like_count-1->行を解放->ボタンのように表示)
ボタンをゆっくりクリックすると、この作業が正しく行われますが、ボタンをすばやくクリックし続けると、like_count の数が 2 を超えたり、負の数になったりすることがあります。
私は自分が何を間違ったのかわかりません。助けてください!