[英]Adding a row to database if it doesn't exist
我有一个databaste,visitorsCounter,我想添加一个新行每次有人访问该网页。 我正在获取他们的IP,然后检查数据粘贴中是否没有包含他们IP的行。 如果没有,我添加新行。
$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 ();
}
访问者进入网站,并且用户在数据库中为空。 但是当他登录时,它保持为空。 知道为什么吗?
您应该以此作为一个陈述。 关键思想是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
则您的代码可能具有竞争条件。
我认为您永远不会进入“更新” if语句的原因是,您不应检查null
,而应检查false
值。 根据PDOStatement :: fetch()的文档,您将在失败时返回false
。
因此,您的代码应与
if($result !=== false) {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.