(PHP, AJAX) Простой счетчик.Понял проблему, нет решения - PullRequest
0 голосов
/ 01 октября 2018

Извиняюсь за то, что спросил.Короче говоря, я делаю простую доску с кнопкой «Мне нравится» для каждого изображения. Количество кликов (лайки) сохраняет в файле counter.txt в следующем формате:

click-001||15
click-002||7
click-003||10

Нажатие кнопок запускает небольшой код php через AJAX.counter.php:

<?php
$file = 'counter.txt'; // path to text file that stores counts
$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";
        }
    } 
file_put_contents($file, $lines);
fclose($fh);

?>  

Поэтому, когда я запускаю веб-сайт и тестирую клик по кнопкам, я получаю следующее сообщение:

Примечание: неопределенное смещение: 1 в C: \ wamp64 \www \ wogue \ counter.php в строке 18

Я подумал, что скрипт counter.php создает пробел в новой строке в counter.txt, поэтому он не может взорватьсяи, таким образом, сделать [1] индекс.Я понял это путем возврата последней пустой строки в TXT-файле и ее сохранения.Он работал без ошибок, пока я не нажал кнопку несколько раз, затем появилась та же ошибка.

Кусок кода в индексе выглядит так:

<?php 
$clickcount = explode("\n", file_get_contents('counter.txt'));
foreach($clickcount as $line){
    $tmp = explode('||', $line);
    $count[trim($tmp[0])] = trim($tmp[1]);
    }
?>

Есть идеи? ..

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Вы пишете, используя \r\n в качестве разделителя строк в counter.php и читаете тот же файл, взрывающийся только для \n.Вы должны быть последовательными.

Достаточно просто удалить \n, чтобы избежать лишних "пробелов", которые вы видите.

<?php
$file = 'counter.txt'; // path to text file that stores counts
$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\n"; //removing the \r here
        }
    } 
file_put_contents($file, $lines);
fclose($fh);

?>  
0 голосов
/ 01 октября 2018

Обрезать $line и, если оно не пустое - сделать то, что вам нужно:

$line = trim(fgets($fh));
if ($line) {
    $line = explode('||', $line);
    $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";
    }
} 

Или проверить с помощью empty таким образом:

$line = explode('||', fgets($fh));
if(!empty(line[0]) && !empty($line[1])){
    if(line[0] == $id){
        $line[1]++; // increment count by 1
        echo $line[1];
    }
    $lines .= "{$line[0]}||{$line[1]}\r\n";
}
} 
...