ユーザーにダウンロードを提供するスクリプトを実行しています。バイトレベルでトラフィックを監視したいのですが、ダウンロードしたバイト数を保持しています$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()
ただし、操作全体を1つのクエリで実行したいと思います。レコードが存在しない場合はレコードを作成し、存在する場合は既存のレコードを更新するクエリ。
これを実行できますか、それともダウンロードごとに2つのクエリを実行する必要がありますか?