2009-06-04 3 views
2

Я пишу скрипт PHP, который работает на cron и извлекает данные JSON из API [название (текст), путь (текст), посетителей (целое число)] и сохраняет его в базе данных SQLite , Каждый раз, когда он запускается, если он видит существующий заголовок, он должен добавлять новых посетителей к существующим посетителям. Если нет, он должен добавить новые данные в новую строку.Слияние и добавление данных с помощью SQLite

Вот упрощенный взгляд на моем цикле:

foreach($results as $printresults) { 

//this iterates though $title, $path and $visitors 

$existing_visitors = $db->query("SELECT SUM(visitors) FROM topten WHERE 
title='$title'"); 
while ($existing_vis_row = $existing_visitors->fetch(SQLITE_NUM)) { 


$dupe_enter = $db->query("UPDATE topten SET title='$title', path='$path', 
visitors='$existing_vis_row[0]' WHERE title='$title' "); 
    } 

$db->query("INSERT INTO topten (id,title,path,visitors,time) VALUES 
(NULL, '$title', '$path', '$visitors', '$time');"); 

} 

Тогда я сделаю SELECT тянуть DISTINCT рядов заказанных посетителей и записать это в файл. Так как запрос UPDATE добавляет всех посетителей этим строкам, не имеет значения, что будут все обманы. В определенный тайм-аут я отброшу всю таблицу и начну собирать снова, поэтому файл не станет слишком громоздким.

Проблема заключается в том, что она добавляет суммированные подсчеты посетителей на каждом проходе цикла, что делает счетчик посетителей полностью удаленным. Но я не мог найти лучший способ просто добавлять данные вместе при каждом запуске скрипта.

ответ

1

псевдо-код:

for($json_records as $rec){ 
    $row = SELECT visitors FROM topten WHERE title = $rec['title'] 
    if($row) 
     //record exists, add visitors and update 
     $sum_visitors = $row['visitors'] + $rec['visitors'] 
     UPDATE topten SET visitors = $sum_visitors WHERE title = $rec['title'] 
    else 
     //record doesn't exist, insert new 
     INSERT topten (title, visitors) VALUES ($rec['title'], $rec['visitors']) 
} 

Может быть?

0

избегать обмана. установите уникальный ключ и используйте INSERT OR REPLACE ... вместо того, чтобы делать это самостоятельно.

что-то вроде CREATE UNIQUE INDEX 'title_path' ON topten (title, path). это сделает невозможным наличие двух записей с одинаковыми заголовками и полями пути. поэтому, если вы просто сделаете слепой INSERT ...., вы получите ошибку конфликта, если это будет ошибкой.

так, просто используйте INSERT OR REPLACE ...., это сначала проверит любой уникальный индекс, и если есть уже запись, он будет удален, тогда он будет делать вставку. конечно, это все атомал (так что другая проверка процесса не увидит, что запись исчезнет и снова появится).

+0

Вы могли бы немного опустить его для меня? Я не слишком хорош с SQL. также удалено упоминание о JSON. –

Смежные вопросы