2016-11-30 9 views
-1

現在のページを送信するクエリを作成しようとしましたが、データベーステーブルclick_countに送信しています。私は私が間違って何をしているのか分からないのですが、私は今、私のエラー報告に何の誤りもないからです。クエリは実行されておらず、エコーされたエラーは表示されません。現在のページURLをデータベースに送信する

問題がセッションを構築しているかどうかはわかりません。 $_SESSION['page'] = $curPage;。私がしようとしているのは、SELECTのクエリでレコードがあるかどうかを確認し、そうでない場合はINSERTとし、その時点からUPDATEpage_countのユーザーがページを訪れるたびに実行します。

誰かが間違っている可能性があることを指摘しているものはありますか?

表click_count:

click_count 
CREATE TABLE `click_count` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`user_id` int(11) NOT NULL, 
`page_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
`page_count` int(11) NOT NULL, 
PRIMARY KEY (`id`) 
) 

コード:

session_start(); 
//create current page constant 
$curPage = $_SERVER['PHP_SELF']; 
//echo $_SERVER['REQUEST_URI']; 
//set number of clicks variable to 0 
$clicks = 0; 

    //set current page as session variable 
    $_SESSION['page'] = $curPage; 
//do not recount if page currently loaded 
if($_SESSION['page'] != $curPage) { 


    $click_sql = " 
    SELECT * 
    FROM click_count 
    WHERE user_id = ? 
    AND page_url = ? 
    "; 
    if (!$click_stmt = $con->prepare($click_sql)) { 
     $click_stmt->execute(array($user_id, $curPage)); 
     $click_stmt_rows = $click_stmt->fetchAll(PDO::FETCH_ASSOC); 
     $page_count = $click_stmt->rowCount(); 
     if (!$click_stmt->errno) { 
      echo "Error selecting page count."; 
     } 
    } else if ($page_count == 0) { 
     //try to create new record and set count for new page to 1 
     //output error message if problem encountered 
      $click_insert_stmt = " 
      INSERT INTO click_count 
      (page_url, page_count) 
      VALUES(?, ?)"; 

     if(!$click_stmt = $con->prepare($click_insert_stmt)) { 
      $click_insert_stmt->execute(array($curPage, 1)); 
      echo "Could not create new click counter."; 
     } 
     else { 
      $clicks = 1; 
     } 
    } else { 
    //get number of clicks for page and add 1  fetch(PDO::FETCH_BOTH) 
     while($click_row = $click_insert_stmt->fetch(PDO::FETCH_BOTH)) { 
      $clicks = $row['page_count'] + 1; 
      //update click count in database; 
      //report error if not updated 

      $click_update_stmt = " 
      UPDATE click_count 
      SET page_count=page_count+1 
      WHERE page_url = ? 
      "; 
      if(!$click_stmt = $con->prepare($click_update_stmt)) { 
       $click_update_stmt->execute(array($curPage)); 
       echo "Could not save new click count for this page."; 
     } 
     } 
    } 
} 

更新されたコード:

$curPage = $_SERVER['PHP_SELF']; 
$clicks = 0; 

    $click_sql = " 
    SELECT * 
    FROM click_count 
    WHERE user_id = ? 
    AND page_url = ? 
    "; 
     $click_stmt = $con->prepare($click_sql); 
     $click_stmt->execute(array($user_id, $curPage)); 
     $click_stmt_rows = $click_stmt->fetchAll(PDO::FETCH_ASSOC); 
     $page_count = $click_stmt->rowCount(); 
    if ($page_count == 0) { 
     //try to create new record and set count for new page to 1 
     //output error message if problem encountered 
      $click_insert_stmt = " 
      INSERT INTO click_count 
      (user_id, page_url, page_count) 
      VALUES(?, ?, ?)"; 

     if(!$click_stmt = $con->prepare($click_insert_stmt)) { 
      $click_insert_stmt->execute(array($user_id, $curPage, 1)); 
      echo "Could not create new click counter."; 
     } 
     else { 
      $clicks = 1; 
     } 
    } else { 
    //get number of clicks for page and add 1  fetch(PDO::FETCH_BOTH) 
     while($click_row = $click_insert_stmt->fetch(PDO::FETCH_BOTH)) { 
      $clicks = $row['page_count'] + 1; 
      //update click count in database; 
      //report error if not updated 

      $click_update_stmt = " 
      UPDATE click_count 
      SET page_count=page_count+1 
      WHERE user_id = ? 
      AND page_url = ? 
      "; 
      if(!$click_stmt = $con->prepare($click_update_stmt)) { 
       $click_update_stmt->execute(array($user_id, $curPage)); 
       echo "Could not save new click count for this page."; 
     } 
     } 
    } 

NEWEST CODE:

$curPage = $_SERVER['PHP_SELF']; 
$clicks = 0; 

    $click_sql = " 
    SELECT * 
    FROM click_count 
    WHERE user_id = ? 
    AND page_url = ? 
    "; 
    $click_stmt = $con->prepare($click_sql); 
    $click_stmt->execute(array($user_id, $curPage)); 
    $click_stmt_rows = $click_stmt->fetchAll(PDO::FETCH_ASSOC); 
    $page_count = $click_stmt->rowCount(); 
    if ($page_count == 0) { 
     $click_insert_sql = " 
      INSERT INTO click_count 
      (user_id, page_url, page_count) 
      VALUES(?, ?, ?) 
      ON DUPLICATE KEY UPDATE page_count=page_count+1; 
     "; 
     $click_insert_stmt = $con->prepare($click_insert_sql); 
     $click_insert_stmt->execute(array($user_id, $curPage, 1)); 
    } 
+0

私はむしろhttp://dev.mysql.com/doc/refman/5.7/en/insert-on([重複するキー更新の挿入]を使用します-duplicate.html)を使ってコードロジックを最小化する – Dragos

+0

私にとって、この行 'if($ _ SESSION ['page']!= $ curPage){'は悪役の役を演じています。 –

+0

@NanaPartykarもっと良い選択肢についてのご意見はありますか? – Paul

答えて

0

これは失敗のポイントは次のとおりです。

//set current page as session variable 
$_SESSION['page'] = $curPage; 
//do not recount if page currently loaded 
if($_SESSION['page'] != $curPage) { 

あなたは$ curPageに$ _SESSION [「ページ」]の値を設定し、値が$ curPageと異なる場合右、その後、あなたは確認してください。その値に設定するだけで、異なる値にすることはできません。

$ _SESSION ['page']が設定されていない場合はチェックしてください。それ

if (isset($_SESSION['page']) && $_SESSION['page'] != $curPage) { 
    // increment counter 
} else { 
    $_SESSION['page'] = $curPage; 
    // add new record 
} 

か、あなただけのINSERT ON DUPLICATE KEY UPDATEを使用している場合、あなたはすべてのそのロジックをスキップして行うことができますの値:

INSERT INTO click_count (user_id, page_url, page_count) VALUES (?, ?,?) 
    ON DUPLICATE KEY UPDATE page_count=page_count+1; 

そのページのレコードがあるかどうかをチェックする必要はありません、現在の値を表示する必要はありません。クエリがそれを処理します。 削除のuser_idとPAGE_URL

+0

セッションコードを削除するだけで、 '$ page_count'がここで定義されていないというエラーが出ます:' else if($ page_count == 0){'...ですが、 'rowCount'を実行します。 – Paul

+0

変数$ page_countは別の障害点です。これはifブロック内で定義されています。 if変数から変数を取得する必要があります。 – Dragos

+0

私のコードを更新し、それを私の質問に入れました。まだ動かない。 – Paul

0

変更

1)に、しかし組み合わせたユニークなキーを定義しなければならないのif($_SESSION['page'] != $curPage) {

2)私はなぜあなたを知りませんこのif(!$click_stmt=$con->prepare($click_insert_stmt)){を複数の場所に書きました。残念ながら、これらの準備文が失敗した場合、次に、どのようにして&が文を実行するかを準備します。

3)$user_idは私の謎です。なぜなら、私はあなたが初期化した場所を見たことがないからです。

コードを更新しました。見てみましょう。

更新されたコード

$click_sql = "SELECT * FROM click_count WHERE user_id = ? AND page_url = ?"; 
$click_stmt = $con->prepare($click_sql); 
$click_stmt->execute(array($user_id, $curPage)); 
$page_count = $click_stmt->rowCount(); 

if ($page_count == 0) { 
    $page_count ++; 
    $click_insert_stmt = "INSERT INTO click_count (page_url, page_count, user_id) VALUES(?, ?, ?)"; 
    $click_stmt = $con->prepare($click_insert_stmt); 
    if(!$click_insert_stmt->execute(array($curPage, $page_count, $user_id))){ 
    echo "Could not create new click counter."; 
    } 
} else { 
    $click_update_stmt = "UPDATE click_count SET page_count= page_count+1 WHERE page_url = ? AND user_id = ?"; 
    $click_stmt = $con->prepare($click_update_stmt); 
    if(!$click_update_stmt->execute(array($curPage,$user_id))){ 
    echo "Could not save new click count for this page."; 
    } 
} 
関連する問題