2014-02-07 2 views
1

카운터에 1을 DB에 추가 할 수 없으며 누군가가 페이지로 이동할 때마다 값이 증가합니다 ... 리로디드되었을 때만 작동합니다. 내 코드의 오류는 어디에 있습니까? 이 문제에 대해 저를 도울 수 있습니까?mysql pdo hit counter

내가 원하는 페이지를 원한다면 내 전체 HTML 페이지가 필요한지 잘 모릅니다. post.php?id_blog=4

코드 : 난 그냥이처럼 SQL을 권장

<?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

:

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

이유는 race condition를 방지하는 것입니다 URL은 ID가 다음과 같이 표시입니다 있습니다. 두 사람이 동시에 페이지를 방문하면 두 PHP 스레드 모두 vistoblog 값 123을 읽고 1을 더하고 두 값 모두 124로 증가 시키려고합니까?

위의 식을 사용하면 현재 값을 읽을 필요가 없으며 이와 같은 경쟁 조건이 발생할 가능성을 방지 할 수 있습니다.

+0

그 형태로 카운터가 아무것도하지 않으면 오류를 표시하지 않고 새로운 값을 추가하지 마십시오 ... 희귀합니다 –

+0

어디서 오류인지 ... 분명히 오류는 크롬에만 있습니다. 파이어 폭스 나 익스플로러와 함께하면 업데이트가 훌륭하게 작동합니다. 크롬은 캐시에 남기 때문에 페이지를 새로 고침 할 때만 업데이트가 변경되지 않습니다. 다시 한번 감사드립니다 @ Bill Karwin –