2014-02-07 40 views
1

我不能让计数器加1到数据库中,每次有人进入页面时增加值......只有在重新加载时才起作用。 我的代码中的错误在哪里?你能帮我解决这个问题吗?mysql pdo命中计数器

我不知道你是否需要我的整个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(); 
         } 
       ?> 

回答

4

我建议让您的SQL就像这样:

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

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

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

+0

在这种形式的柜台不做任何事情,不显示任何错误,不添加新的价值...是罕见的 –

+0

我知道错误在哪里...显然,错误只与铬,当我使用Firefox或资源管理器的更新很好..铬显然将其保留在缓存中,因此只有当我重新加载页面时才看到更新中的更改。谢谢你@Bill Karwin –