Запись в текстовый файл работает, но он время от времени сбрасывает все в текстовый файл? - PullRequest
0 голосов
/ 05 декабря 2018

Здравствуйте,

Я написал небольшой эксперимент на PHP.Этот скрипт подсчитывает, сколько раз пользователь нажал кнопку, помеченную определенным классом (id = "link_1", class = "heart")

Во время каждого клика скрипт читает текстовый файл, находит правильный идентификатор, затем добавляет +1 к номеру этого идентификатора, вот так:

#counte_me.php
$file = 'count_me.txt'; // stores the numbers for each id
$fh = fopen($file, 'r+');
$id = $_REQUEST['id']; // posted from page
$lines = '';
while(!feof($fh)){
    $line = explode('||', fgets($fh));
    $item = trim($line[0]);
    $num = trim($line[1]);
    if(!empty($item)){
        if($item == $id){
            $num++; // increment count by 1
            echo $num;
            }
        $lines .= "$item||$num\r\n";
        }
    }
fclose($fh);
file_put_contents($file, $lines, LOCK_EX);

Результат

# count_me.txt
hello_darling||12

Это прекрасно работает.Проблема возникает, когда время от времени я смотрю на пустой count_me.txt!

Не совсем знаю, когда и как это происходит, но это так.Я начинаю делать приращения и происходит, иногда раньше, иногда намного позже.Это может быть на моем пути к 10 или к 200 или к 320 или что-нибудь между ними.Это совершенно случайно.

Сводит меня с ума.Я не достаточно опытен, но именно поэтому я играю с этой штукой.

Кто-то знает, что я делаю не так, чтобы файл так выгружался?

ОБНОВЛЕНИЕ 1 Пока предложение Олувафеми Суле работает, но я должен удалить LOCK_EX из file_put_contents, чтобы он работал, иначе он просто не работает.

    // NEW LINE ADDED
    if (!empty($lines)) {
        file_put_contents($file, $lines);
    }

1 Ответ

0 голосов
/ 05 декабря 2018

$lines изначально установлен в пустую строку и обновляется только при следующих условиях.

if(!empty($item)) { 
  # and so on and so on
}

И, наконец, в конце,

file_put_contents($file, $lines, LOCK_EX);

Причина, по которой $lines по-прежнему остается установленным в исходную пустую строку, когда item пусто.Вспомните новую строку, добавленную из "$item||$num\r\n", там может быть добавлено более одной строки (я не буду вставлять текстовый редактор, чтобы добавить новую строку в конец этого файла.)

Я предлагаюзапись только в файл, когда $lines не пусто.

if (!empty($lines)) {
    file_put_contents($file, $lines, LOCK_EX);
}
...