2013-08-29 91 views
0

我想創建一個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,有時它可以是負數。
我不知道我做錯了什麼。請幫忙!

+0

爲最後一次更新,爲什麼execute是在bind_param之前? – 2013-08-29 08:42:02

+0

讓我問你一個問題。這裏的比賽狀況有什麼問題? –

回答

0

在您更新查詢 把

$stmt->execute(); 

下面

$stmt->bind_param('i', $id); 
+0

yes,execute();是在代碼im工作與下面的bind_param,只是一個錯誤發佈代碼在這裏,這是我的第一篇文章,感謝指出, – user2728266

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是好的

+0

仍然不能解決問題,謝謝你:D – user2728266

+0

這個代碼是不是要解決無論你的問題,關注你。它是處理PHP端按鈕的正確代碼。關於你的特殊問題,你必須首先了解你有什麼問題 –