2016-11-19 48 views
0

我有一個數據流,訪問者計數器,我想每次有人訪問該頁時都添加一行。我得到他們的知識產權,然後我檢查數據庫中是否沒有一行知識產權。如果沒有,我添加一個新的行。如果數據庫不存在,則向數據庫添加一行

$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(); 
} 

編輯:添加用戶代碼中的一行:

$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(); 
} 

訪問者進來的網站,用戶在數據庫空。但是當他登錄時,它保持爲空。任何想法爲什麼?

+1

我認爲第一個sql語句(select)或多或少是多餘的,尤其是如果您將ip設置爲唯一鍵後,使用'insert into visitorsCounter .... on duplicate key update ...'。也就是說,多個用戶可以擁有相同的IP地址,並且用戶可以擁有多個IP ... – RamRaider

+1

您的檢查行是否存在的邏輯不起作用。如果您的列的默認值爲NULL並接受NULL值,則爲'null'!=「空」或「不存在」。你也可以添加一個附加的where子句。 –

+0

@RamRaider你是對的。我該如何處理? – Dave

回答

0

我認爲你從來沒有進入「更新」if語句的原因是你不應該檢查null,而是檢查false值。 根據PDOStatement::fetch()的文檔,您將獲得false失敗時返回。

所以,你的代碼應該用

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

你應該做這個作爲一個說法更好地工作。關鍵的想法是on duplicate key update

所以,添加一個唯一索引到表所以數據庫強制每個IP一行:

create unique index unq_visitorscounter_ip on visitorsCounter(ip); 

然後,更新/插入值:

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

除簡化你的代碼,這是表達邏輯的更正確的方式。如果由不同的應用程序/線程同時插入相同的ip,則代碼可能具有競爭條件。

+0

我覺得你錯過了'在'重複密鑰'更新'? – RamRaider

+0

@RamRaider。 。 。謝謝。 –

+0

@GordonLinoff這很好。但我想添加一個用戶到該行。我添加了一些代碼,我編輯了主要問題。你能檢查一下嗎?謝謝。 – Dave

相關問題