gpt4 book ai didi

php - 在一条语句中插入 IGNORE INTO 和 UPDATE

转载 作者:可可西里 更新时间:2023-11-01 01:04:21 28 4
gpt4 key购买 nike

我正在运行一个为我的用户提供下载服务的脚本。我想在每个字节级别上监控他们的流量,并且我在 $bytes 中保存了他们下载的字节数。我想将它记录到我的数据库中,我正在使用以下函数:

register_shutdown_function(function() {
global $bytes;

/* Save the traffic to the database */
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$st = $db->prepare('INSERT IGNORE INTO `stats`
SET `date` = CURDATE(), `bytes` = :bytes');
$st->bindParam(':bytes', $bytes);
$st->execute();
$st = null;
$db = null;
});

这个查询似乎工作了一次,当下载完成后,表中有一条新记录,包含以下数据:

   date      |    bytes
------------------------
2013-02-03 | 2799469

然而,在所有其他下载中,bytes 字段不会改变。没有新记录,也没有对表中已有记录的更改。很明显问题是什么,查询尝试插入一条记录,但如果它已经存在,则它会中止。我需要这样的更新语句:

UPDATE `stats`
SET `bytes` = `bytes` + :bytes
WHERE `date` = CURDATE()

但我想在一个查询中完成整个操作。如果记录不存在,将创建记录的查询;如果存在,则更新现有记录。

这可以做到吗,还是我必须在每次下载时运行两个查询?

最佳答案

您可能需要查看ON DUPLICATE KEY UPDATE。你可以阅读它here .

您的查询看起来像这样。

$st = $db->prepare("INSERT INTO `STATS`
VALUES('CURDATE()', :bytes)
ON DUPLICATE KEY UPDATE `BYTES` = `BYTES` + :bytes");

您还应避免使用 INSERT IGNORE INTO,因为在出​​现重复行的情况下,不会生成错误,而只会生成警告。

关于php - 在一条语句中插入 IGNORE INTO 和 UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675023/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com