Я создал функцию в 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 выглядит следующим образом.

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

дата | еав | эс | эмс | кв | экс | escp

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

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

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

дата | еав | эс | эмс | кв | экс | 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 дня подряд с несколькими модификациями.

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

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


person George    schedule 05.09.2013    source источник
comment
Он когда-либо переходит на новую строку? Вы проверяли настройки часового пояса на сервере?   -  person Jason McCreary    schedule 05.09.2013
comment
+ Добро пожаловать в StackOverflow.   -  person Jason McCreary    schedule 05.09.2013
comment
Да, он переходит на новую строку, как и предполагалось, но только на следующий день не пойдет ... это очень странно и сбивает с толку, потому что, если вы измените дату в csv на день раньше, он отлично работает.   -  person George    schedule 05.09.2013


Ответы (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){ и посмотрите, действительно ли ваш код записывает новую строку.

person victorantunes    schedule 05.09.2013
comment
if($data == $content['data']){ установлен в if($data != $content['data']){ он создаст новую строку с сегодняшней датой и добавит ее, как и ожидалось... дело в том, что код работает идеально ... если я изменю дату в csv на вчерашнюю, добавлю сегодняшнюю дату, как и ожидалось, но когда наступает полночь, что-то не так, я не могу понять, что ... я пробовал все, что вы предложили, прежде чем публиковать .. . - person George; 05.09.2013