【发布时间】:2013-02-03 17:16:05
【问题描述】:
我正在运行一个为我的用户提供下载的脚本。我想在每个字节级别监控他们的流量,我保存他们在$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()
但我想在一个查询中完成整个操作。如果记录不存在则创建记录的查询,如果存在则更新现有记录。
这可以做到吗,还是我每次下载都必须运行两个查询?
【问题讨论】: