2016-11-19 6 views
0

データバスがvisitorsCounterで、誰かがそのページにアクセスするたびに新しい行を追加したいと思います。私は彼らのIPを取得している、そして、私は彼らのIPでdatabasteの行がないかどうかをチェックする。存在しない場合は、新しい行を追加します。データベースに行を追加していない場合

$visitor_ip = getUserIP(); 
if(!isset($db)) $db = connect_db(); // connecting to the databaste with PDO 
$userName = $_SESSION['username']; 

$query = "SELECT entries from visitorsCounter WHERE ip=:ip"; 
$stmt = $db->prepare ($query); 
$stmt->bindParam (":ip", $visitor_ip); 
$stmt->execute(); 
$result = $stmt->fetch (PDO::FETCH_ASSOC); 

if($result != null){ // **** if there isn't a row with that IP **** 
$addEntryQuery = "UPDATE visitorsCounter SET entries = entries + 1 WHERE ip=:ip"; 
$stmt = $db->prepare ($addEntryQuery); 
$stmt->bindParam (":ip", $visitor_ip); 
$stmt->execute(); 
} 

EDIT:ユーザーコードに行を追加する:

$userName = $_SESSION['username']; 
$query = "INSERT INTO visitorsCounter(ip, entries, user) 
    VALUES (:ip, 1,:user) 
    ON DUPLICATE KEY UPDATE entries = entries + 1; 
     "; 
$stmt = $db->prepare ($query); 
$stmt->bindParam (":ip", $visitor_ip); 
$stmt->bindParam (":user", $userName); 
$stmt->execute(); 


if(isset($_SESSION['username'])){ 
$addEntryQuery = "UPDATE visitorsCounter SET user = :user WHERE ip=:ip"; 
$stmt = $db->prepare ($addEntryQuery); 
$stmt->bindParam (":ip", $visitor_ip); 
$stmt->bindParam (":user", $userName); 
$stmt->execute(); 
} 

訪問者がウェブサイトに来て、ユーザは、データベース内のNULLです。しかし、彼がログインすると、nullのままです。どんな考え?

+1

私は最初のsql文(select)は多少冗長であると思います。特に、ipを一意のキーとして設定した後は、「into into visitorsCounter .... duplicate key update ...」を使用すると冗長です。つまり、複数のユーザーが同じIPアドレスを持つことができ、ユーザーは複数のIPアドレスを持つことができます。 – RamRaider

+1

行が存在するかどうかを確認するロジックが機能しません。あなたのカラムのデフォルト値がNULLでNULL値を受け入れるなら、 'null'!=" empty "または" non-existant "。追加のwhere句を追加することもできます。 –

+0

@RamRaider正しいです。どうすればそれを処理できますか? – Dave

答えて

0

私はあなたがnullをチェックするべきではなく、代わりにfalseの値をチェックするべきであるということです。 PDOStatement::fetch()のドキュメントによると、失敗した場合はfalseが返されます。

だからあなたのコードは、あなたが1文としてこれを実行する必要があります

if($result !=== false) { 
    ... 
} 
2

とのより良い動作するはずです。重要なアイデアはon duplicate key updateです。に加えて

INSERT INTO visitorsCounter(ip, entries) 
    VALUES (ip, 1) 
    ON DUPLICATE KEY UPDATE entries = entries + 1; 

create unique index unq_visitorscounter_ip on visitorsCounter(ip); 

はその後、更新/として値を挿入します。データベースは、IPごとに1つの行を強制するよう

だから、あなたのテーブルに一意のインデックスを追加しますコードを単純化すると、これは論理をより正確に表現する方法です。同じipが異なるアプリケーション/スレッドによって同時に挿入されている場合、コードに競合状態が発生することがあります。

+0

あなたは 'UP DATE'を' ON DUPLICATE KEY'にないと思いますか? – RamRaider

+0

@RamRaider。 。 。ありがとうございました。 –

+0

@GordonLinoffいいですね。しかし、私は行にユーザーを追加したい。私はいくつかのコードを追加し、主な質問を編集しました。あなたはそれをチェックしてもらえますか?ありがとう。 – Dave

関連する問題