我不能让计数器在数据库中添加1,每次有人进入页面时值都会增加...只有在重新加载时才有效。 我的代码中的错误在哪里?你能帮我解决这个问题吗?
我不知道你是否需要我的整个html页面,如果你想要我的页面。该网址的ID显示如下:post.php?id_blog=4
代码:
<?php
try {
$query = "SELECT id_blog, blog_titulo, blog, vistoblog FROM BLOG WHERE id_blog = ?";
$stmt = $conn->prepare( $query );
$stmt->bindParam(1, $_REQUEST['id_blog']);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$id_blog = $row['id_blog'];
$blog_titulo = $row['blog_titulo'];
$blog = $row['blog'];
$vistoblog = $row['vistoblog'];
}catch(PDOException $exception){
echo "Error: " . $exception->getMessage();
}
try{
$visto = $vistoblog + 1;
$sql = "UPDATE BLOG SET
vistoblog = :vistoblog
WHERE id_blog = :id_blog";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':vistoblog', $visto, PDO::PARAM_STR);
$stmt->bindParam(':id_blog', $id_blog, PDO::PARAM_INT);
$stmt->execute();
}catch(PDOException $exception){
echo "Error: " . $exception->getMessage();
}
?>
答案 0 :(得分:4)
我建议您使用这样的SQL:
UPDATE BLOG SET
vistoblog = vistoblog + 1
WHERE id_blog = :id_blog
原因是避免使用race condition。如果两个人同时访问该页面,并且两个PHP线程都读取vistoblog值123,添加1,并且两者都尝试将其增加到值124,该怎么办?
通过使用上面的表达式,您不必读取当前值,并且可以避免出现类似竞争条件的可能性。