[英]How can I make this sql request work in my php?
我正在尝试在我的网站上创建一个非常基本的跟踪系统,只记录在场人数。
不幸的是,下面的代码不起作用。 我检查了服务器中的错误日志,基本上这是问题所在:第一次执行后没有找到实体,即使已经有一个具有该值的条目,所以代码直接进入“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,
]
);
}
谢谢
看起来您的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 程序实例尝试同时执行它,它不会混淆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.