0

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 を超えたり、負の数になったりすることがあります。
私は自分が何を間違ったのかわかりません。助けてください!

4

3 に答える 3

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 に答える