【问题标题】:How can I make this sql request work in my php?如何使这个 sql 请求在我的 php 中工作?
【发布时间】:2020-04-23 10:11:15
【问题描述】:

我正在尝试在我的网站上创建一个非常基本的跟踪系统,只记录在场人数。

很遗憾,下面的代码不起作用。我检查了我的服务器中的错误日志,基本上这是问题所在:第一次执行后没有找到实体,即使已经有一个具有该值的条目,所以代码直接进入“else”然后崩溃,因为已经有一个具有该主键的条目。有人可以帮我找出为什么在第一次执行时找不到实体吗?

代码如下:

$q = "SELECT date, amount FROM tracking WHERE date = ?";
$req = $bdd->prepare($q);
$req->execute(date("Y-m-d"));
$results = $req->fetchAll();
if (count($results) != 0){
    $results["amount"] = $results["amount"] + 1;
    $track = $bdd->prepare("UPDATE tracking SET amount = ? WHERE DATE(date) = ?");
    $track->execute(array($results["amount"], date("Y-m-d")));
    exit;
}
else{
    $q = 'INSERT INTO tracking (date, amount) VALUES (:val1, :val2)';
    $req = $bdd->prepare($q);
    $req->execute(
        [
            "val1" => date(Y-m-d),
            "val2" => 1,
        ]
    );
}

谢谢

【问题讨论】:

标签: php mysql


【解决方案1】:

您的tracking 表似乎每个date 只能有一行。有一种方法可以直接在 MySQL 的查询语言中处理。

首先,将date 列设为表的主键,或在其上创建唯一索引。您可以像这样创建唯一索引。

CREATE UNIQUE INDEX trackdate ON tracking(date);

然后使用这个单一查询进行插入/更新。

INSERT INTO tracking (date, amount) VALUES (CURDATE(), 1)
   ON DUPLICATE KEY UPDATE amount = amount + 1;

每次运行此查询时,它要么插入必要的行,要么增加amount 列。而且它是“原子地”执行的,这意味着如果两个不同的 php 程序实例尝试同时执行它,它不会混淆。

【讨论】:

    猜你喜欢
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2020-12-23
    • 2017-09-11
    相关资源
    最近更新 更多