【问题标题】:mysql pdo hit countermysql pdo命中计数器
【发布时间】:2014-02-07 22:38:22
【问题描述】:

我不能让计数器在数据库中添加 1,并且每次有人访问页面时值都会增加......只有在重新加载时才有效。 我的代码中的错误在哪里?你能帮我解决这个问题吗?

我不知道你是否需要我的整个 html 页面,如果你想要我分页。具有 id 的 url 显示如下: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();
                        }
                ?>

【问题讨论】:

    标签: php mysql pdo counter


    【解决方案1】:

    我建议您像这样编写 SQL:

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

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

    通过使用上面的表达式,您不必读取当前值,并且您避免了出现这种竞争条件的机会。

    【讨论】:

    • 这种形式的计数器什么都不做,不显示任何错误,也不添加新值……很少见
    • 我知道错误在哪里...显然错误仅出现在 chrome 上,当我使用 firefox 或 explorer 时,更新效果很好.. chrome 显然将其留在缓存中,因此不会仅当我重新加载页面时才能看到更新中的更改。再次感谢@Bill Karwin
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多