1

Web ページが読み込まれるたびにページ ビューを更新しようとしています。

ページが読み込まれるたびに次の関数が実行されますpost_viewsが、mysql データベースの行に 1 が追加されません。

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);
...

ご覧のとおり、同じ関数で 2 つの準備済みステートメントを使用して、a) 現在の投稿ビュー数を取得し、b) 1 つ追加して投稿ビューを更新しようとしていますが、まったく更新されていません。

ありがとう

4

1 に答える 1

1

suffix の代わりに後置インクリメント演算子を使用しています:

$addView = $views++;

これは、値をインクリメントする前に$addView値を持つことを意味します。 行を次のように変更します。$view++

$addView = ++$views;

また、変数 $view には結果が含まれ PDOStatement::fetch(PDO::FETCH_ASSOC)ており、キーを持つ配列post_viewsであるため、コードを次のように変更する必要があります。

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

または、実行された 1 つの SQL クエリを節約したい場合は、次のように呼び出すことができます。

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

何か特別なことをしたい場合を除き、最初のクエリを呼び出して古い値を取得する必要はありません

コードへのもう 1 つの注意:
結果が 1 つだけであると予想される場合は、while ループを使用する必要はありません (page_id は、1 つだけであるべきだと教えてくれます)。

人々は後置演算子と接尾辞演算子の違いを知らないようです++:

$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 に答える