2014-02-07 5 views
1

Я не могу заставить счетчик добавить 1 в БД и приращение значения каждый раз, когда кто-то идет на страницу ... работает только при перезагрузке. Где ошибка в моем коде? Можете ли вы помочь мне в этом вопросе?mysql pdo hit counter

Я не знаю, нужна ли вам вся вся страница html, если вы хотите, чтобы я ее опубликовал. 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(); 
         } 
       ?> 

ответ

4

Я рекомендую сделать свой SQL так же, как это:

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

Причина заключается в том, чтобы избежать race condition. Что делать, если два человека посещают страницу одновременно, и оба потока PHP читают значение vistoblog 123, добавляют 1, и оба пытаются увеличить его до значения 124?

Используя приведенное выше выражение, вам не нужно читать текущее значение, и вы избегаете шанса такого состояния гонки.

+0

В этой форме счетчик ничего не делает, не показывает никаких ошибок и не добавляет нового значения ... редко –

+0

Я знаю, где ошибка ... видимо, ошибка только с хром, когда я делать с firefox или explorer, обновление отлично работает. Хром, похоже, оставляет его в кеше и поэтому не видит изменения в обновлении только при перезагрузке страницы. Еще раз спасибо @Bill Karwin –