Php mysql pdo命中计数器
我不能让计数器在每次有人进入页面时都向数据库中添加1和值增量。。。仅在重新加载时工作。 我的代码中的错误在哪里?你能帮我解决这个问题吗 我不知道你是否需要我的整个html页面,如果你想我页面。url的id如下所示:Php mysql pdo命中计数器,php,mysql,pdo,counter,Php,Mysql,Pdo,Counter,我不能让计数器在每次有人进入页面时都向数据库中添加1和值增量。。。仅在重新加载时工作。 我的代码中的错误在哪里?你能帮我解决这个问题吗 我不知道你是否需要我的整个html页面,如果你想我页面。url的id如下所示:post.php?id\u blog=4 守则: <?php try { $query = "SELECT id_blog, blog_titulo, blog, vistoblog FROM BL
post.php?id\u 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();
}
?>
我建议您将SQL设置为如下:
UPDATE BLOG SET
vistoblog = vistoblog + 1
WHERE id_blog = :id_blog
原因是为了避免一个错误。如果两个人同时访问该页面,并且两个PHP线程都读取vistoblog值123,并添加1,然后都尝试将其增加到值124,该怎么办
通过使用上面的表达式,您不必读取当前值,并且可以避免出现这样的竞争条件。我建议您的SQL如下所示:
UPDATE BLOG SET
vistoblog = vistoblog + 1
WHERE id_blog = :id_blog
原因是为了避免一个错误。如果两个人同时访问该页面,并且两个PHP线程都读取vistoblog值123,并添加1,然后都尝试将其增加到值124,该怎么办
通过使用上面的表达式,您不必读取当前值,也可以避免出现这样的竞争条件。在这种形式下,计数器不会执行任何操作,不会显示任何错误,也不会添加新值…很少见我知道错误在哪里…显然,错误只存在于chrome,当我使用firefox或explorer时,更新效果非常好。。chrome显然将其保留在缓存中,因此只有在我重新加载页面时才会看到更新中的更改。再次感谢@Bill Karwin在这种情况下,计数器什么也不做,不显示任何错误,也不添加新的值…很少见我知道错误在哪里…显然错误只出现在chrome上,当我使用firefox或explorer时,更新效果很好。。chrome显然将其保留在缓存中,因此只有在我重新加载页面时才会看到更新中的更改。再次感谢你@Bill Karwin