2013-08-29 3 views
0

Я пытаюсь создать функцию fb-like-button (а не facebook api). На моем сайте есть две кнопки: нравится и не нравится. База данных сохранит, сколько всего нравится и не нравится в целом.SELECT ... FOR UPDATE с подготовленным оператором не работает

Вот дб таблица:

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 

здесь проблема ...
количество похожих_счет начинается с 0.
Теоретически, если есть только один человек, нажмите кнопку, например, номер_сочетания не будет превышать 0.
(нажмите кнопку -> -> lock row-> like_count + 1-> release row-> отобразить непохожие кнопки)
(щелкните в отличие от кнопки-> lock row-> like_count-1-> release row-> display like button)
Я получаю эту работу сразу, когда я нажимаю кнопку медленно, однако, когда я быстро нажимаю кнопку , число like_count может превышать 2, и иногда это может быть отрицательное число.
Я понятия не имею, что я сделал неправильно. Пожалуйста помоги!

+0

за последнее обновление, зачем выполнять до bind_param? –

+0

Позвольте мне задать вам вопрос. Что здесь не так с состоянием гонки? –

ответ

0

в запросе обновления поместить

$stmt->execute(); 

ниже

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

yes, execute(); ниже bind_param в коде im im работает с, просто ошибка размещения кода здесь, это мой первый пост, спасибо за указание, что – 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'])); 

Обратите внимание, что вам не нужен столбец идентификатора в этой таблице. post_id в порядке

+0

по-прежнему не может решить проблему, спасибо tho: D – user2728266

+0

Этот код не предназначен для решения проблемы независимо от вашей проблемы, заметьте. это правильный код для обработки вашей кнопки на стороне PHP. Хотя в отношении вашей конкретной проблемы вы должны сначала выяснить, в чем проблема, которую вы имеете –