1

每次加载网页时,我都会尝试更新页面浏览量。

每次页面加载时它都会运行以下函数,但它不会将 1 添加到post_viewsmysql 数据库中的行。

function addPostView($post_id, $dbh){

        $stmt = $dbh->prepare('SELECT post_views FROM crm_posts WHERE post_id=?');
        $stmt->bindValue(1, $post_id);
        $stmt->execute();

        while($views = $stmt->fetch(PDO::FETCH_ASSOC)) {

                $addView = $views++;
        }

        $stmt2 = $dbh->prepare('UPDATE crm_posts SET post_views=? WHERE post_id=?');
        $stmt2->bindValue(1, $addView);
        $stmt2->bindValue(2, $post_id);
        $stmt2->execute();

    }

我正在运行该功能,如下所示:

if(isset($_GET['post_id']) && checkPostID($_GET['post_id'], $dbh)!= 0){


        $post_id = $_GET['post_id'];
        addPostView($post_id, $dbh);
...

正如你所看到的,我试图在同一个函数中使用两个准备好的语句来 a) 获取当前的帖子视图数量,然后 b) 通过添加一个来更新帖子视图,但它根本没有更新。

谢谢

4

1 回答 1

1

您正在使用后缀增量运算符而不是 suffix

$addView = $views++;

这意味着您$addView将在增加值$view之前++具有价值。
将行更改为:

$addView = ++$views;

变量$view 包含结果, PDOStatement::fetch(PDO::FETCH_ASSOC)它是一个带键的数组post_views,因此您应该将代码更改为:

$addView = ++$views['post_views'];

或者,如果您想节省一个执行的 sql 查询,您可以调用它:

$stmt2 = $dbh->prepare('UPDATE crm_posts SET post_views=post_views+1 WHERE post_id=?');
$stmt2->bindValue(1, $post_id);
$stmt2->execute();

不需要调用第一个查询来获取旧值,除非你想用它做一些额外的事情

代码的另一条注释:
如果您希望只有一个结果(page_id 告诉我它应该只有一个),则不需要使用 while 循环。

似乎人们不知道后缀和后缀++运算符的区别:

$view = 0;
$addView = $view++; // $addView = 0, $view = 1, since ++ is executed after value of $view has been assigned to $addView

$view = 0;
$addView = ++$view; // $view = 1; $addView = 1, since $view is first incremented then assigned to $addView
于 2013-08-24T12:49:40.893 回答