繁体   English   中英

如果不存在,则向数据库添加行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM