2016-11-19 50 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

相关问题