Я создал функцию в PHP для записи статистики в CSV, работает нормально в настоящее время, но после окончания дня не выходит на новую строку

Заголовок csv - это дата, eav, ess и т. Д. Загрузки, которые я отслеживаю. У меня есть функция, которая получает параметр: ex: eav. Активирую функцию dl_stats("eav"); на странице, которая обрабатывает EAV. Он должен получить число загрузок за сегодня, например: 10, и добавить один к 11. И т.д.... Если дата в csv не сегодня, то создается новая строка, начинающаяся с 1. Проблема в том, что она работает нормально в настоящее время, но после полуночи перерывы. не переходит на новую строку, продолжает на той же строке.

Я провел 3 дня, пытаясь исправить это, но я не могу найти решение.

Вот код

function dl_stats($produs){
$dir = "stats/"; // file directory - edit directory if you run function from diferent folder
$file = $dir."dl.csv"; // file  -

$file = file($file);
//$file = array_reverse($file); // reverse so last dl is first

$data_array = array();
foreach($file as $f){ // file is csv and is exploded by ,
    $data_array[] = explode(",",$f);
}

// variables
$csv_content = '';
$data = strftime("%d-%m-%Y", time()); // define today
$data = strval($data);
$new_data = false;

$header = array("data","eav","ess","ems","qr", "ecs","ecsp"); // associative array header

$products = array("eav","ess","ems","qr", "ecs","ecsp");
$product = array();

// loop array 
foreach($data_array as $content){

    $content = array_combine($header, $content); // combine to make associative array

    // look to see if the date in csv is the same as today, if not a new row must be created with the new date
    if($data == $content['data']){
        $new_data = false; // if false the date is not changed and will be added +1 to the product
    }else{
        $new_data = true; // if true, new date + zero all dl that day
    }

    //$produs = 'eaven32';
    // set product to add 1 
    foreach($products as $key){
        if($produs == $key){
            $product[$key] = '1';
        }else{
            $product[$key] = '0';
        }
    }

    if($content['data'] == 'data'){
        // do not display the header row
        $csv_content.=  $content["data"] . "," . $content["eav"] . "," . $content["ess"] . "," . $content["ems"] . "," . $content["qr"] . "," . $content["ecs"] . "," . $content["ecsp"];
    }else{
        if($data == $content['data']){
            $csv_content.=  $content["data"] . "," . 
            ($content["eav"] + $product['eav']) . "," . 
            ($content["ess"] + $product['ess']) . "," . 
            ($content["ems"] + $product['ems']) . "," . 
            ($content["qr"] + $product['qr'])   . "," . 
            ($content["ecs"] + $product['ecs']) . "," . 
            ($content["ecsp"] + $product['ecsp']) . "\n";
        }else{
            $csv_content.=  $content["data"] . "," . $content["eav"] . "," . $content["ess"] . "," . $content["ems"] . "," . $content["qr"] . "," . $content["ecs"] . "," . $content["ecsp"];
        }
    }
} // eof foreach($data_array as $content)


$csv = $dir."dl.csv"; // file


if($new_data == false){
    file_put_contents($csv, $csv_content);
}else{
    $prod = implode(",", $product); // implode to get product values
    $csv_content_new = $data . "," . $prod;
    file_put_contents($csv, $csv_content . $csv_content_new);
}

}

Может быть, если кто-то еще смотрит на код в первый раз, может найти решение.

Заранее спасибо.

Редактировать:

Формат CSV выглядит следующим образом.

первая строка (в качестве заголовка): все данные в отдельном столбце

дата | EAV | Эсс | ЭМС | qr | ЭКС | ESCP

вторая и все остальные строки ниже (предполагается, что это данные с шагом 1)

18-07-2013 | 38 | 50 | 4 | 0 | 2 | 2

Если я запусту его сейчас с этой датой, добавлю еще одну строку, как и планировалось, вот так: 05-09-2013| 38 | 50 | 4 | 0 | 2 | 2 но если я позволю это до завтра... это произойдет

дата | EAV | Эсс | ЭМС | qr | ЭКС | ESCP

18-07-2013 | 38 | 50 | 4 | 0 | 2 | 2

05-09-2013 | 38 | 50 | 4 | 0 | 2 | 206-09-2013 | 38 | 50 | 4 | 0 | 2 | 2

Дата будет идти после последней строки и последнего столбца предыдущего дня, а не на новой строке. Я думаю, что вы можете понять это, только если вы запустите его на своем собственном сервере. И это может вас обмануть, что он работает нормально, но на следующий день csv испорчен:) случилось со мной 3 дня подряд с несколькими модификациями.

Последнее редактирование:

Хорошо, код является corect, я думаю, что это проблема с файлом CSV. Если вы измените на if($new_data == false){на if($new_data!= False) {новая дата будет состоять из двух дат с сегодняшней датой, а затем вернется назад, если ($ new_data! = False) {на если ($ new_data == false) {и csv как-то исправлено:), это работает, и если кто-то захочет использовать мой код, он может сделать это свободно. У меня есть файл, который отображает CSV-файл в PHP, если вы хотите, просто дайте мне сообщение.

1 ответ

Либо в этой строке (по-видимому, это не виновник, но вы никогда не знаете):

if($data == $content['data']){

условие либо срабатывает все время, что вызывает $new_data быть всегда ложным

или этот код (вызвано $new_data == true):

$prod = implode(",", $product); // implode to get product values
$csv_content_new = $data . "," . $prod;
file_put_contents($csv, $csv_content . $csv_content_new);

не работает, как вы ожидаете.


Чтобы проверить первую часть:

попробуйте использовать var_dump($data) а также var_dump($content['data']) чтобы увидеть, отличаются ли они когда-либо.

Чтобы проверить вторую часть:

Попробуйте перевернуть ваш if($new_data == false){ в if($new_data == true){ и посмотрите, действительно ли ваш код записывает новую строку.

Другие вопросы по тегам