我想創建一個fb-like-button函數(不是Facebook的api)。 我的網站上有兩個按鈕:喜歡和不喜歡。 數據庫將節省多少喜歡和不喜歡的總數。SELECT ... FOR UPDATE與預處理語句不起作用
這裏是db表:
$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
這裏是當用戶點擊喜歡按鈕
id |post_id |like_count
40 | 20 | 0
代碼問題...
like_count的數量從0開始。
理論上,如果只有一個人點擊該按鈕,like_count不會超過1或小於0.
(點擊按鈕 - > - >鎖定行 - > like_count + 1->釋放行 - >顯示不同按鈕)
(單擊按鈕 - >鎖定行 - > like_count-1->釋放行 - >像按鈕一樣顯示)
當我單擊按鈕時我慢慢點擊該按鈕,但是,當我繼續快速單擊該按鈕時,like_count的數量可以超過2,有時它可以是負數。
我不知道我做錯了什麼。請幫忙!
爲最後一次更新,爲什麼execute是在bind_param之前? – 2013-08-29 08:42:02
讓我問你一個問題。這裏的比賽狀況有什麼問題? –