mysql pdo点击计数器

时间:2014-02-07 22:38:22

标签: php mysql pdo counter

我不能让计数器在数据库中添加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();
                        }
                ?>

1 个答案:

答案 0 :(得分:4)

我建议您使用这样的SQL:

UPDATE BLOG SET 
vistoblog = vistoblog + 1
WHERE id_blog = :id_blog

原因是避免使用race condition。如果两个人同时访问该页面,并且两个PHP线程都读取vistoblog值123,添加1,并且两者都尝试将其增加到值124,该怎么办?

通过使用上面的表达式,您不必读取当前值,并且可以避免出现类似竞争条件的可能性。