Scady
@Scady
UI/UX Designer

Как починить счётчик кликов ajax/php?

Всем привет. Есть код счётчика кликов через Ajax, но при клике выдаёт ошибку вида:
Код ошибки
Warning: fopen(C:/OSPanel/OSPanel/domains/test.ru/): failed to open stream: No such file or directory in C:\OSPanel\OSPanel\domains\test.ru\php\clicks.php on line 5
Warning: flock() expects parameter 1 to be resource, boolean given in C:\OSPanel\OSPanel\domains\test.ru\php\clicks.php on line 6
Warning: fclose() expects parameter 1 to be resource, boolean given in C:\OSPanel\OSPanel\domains\test.ru\php\clicks.php on line 20


counter.txt создал в папке с файлом clicks.php и вписал 0. Прошу помощи, ребят.
HTML
<a href="#" id="like">Файл [скачено <output id="statlike">0</output> раз]</a>

<script>
    document.getElementById('like').addEventListener('click', function(e){
        if (window.XMLHttpRequest) {
            var http = new XMLHttpRequest();
            http.open('POST', 'php/clicks.php');
            http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            http.addEventListener('readystatechange', function() {
                if (this.readyState == 4 && this.status == 200) {
                    document.getElementById('statlike').innerHTML = this.responseText;
                }
            });
            http.send('url=' + location.pathname);
        }
    });
</script>


PHP
<?php //clicks.php
if (isset ($_POST['url'])) {
    $fn = $_SERVER['DOCUMENT_ROOT'] . $_POST['url'];
    if (file_exists($fn)) {
        $f = fopen($fn, "r+");
        if (flock($f, LOCK_EX)) {
            $fr = fread($f, filesize($fn));
            $pattern = '/(<output id="statlike">)(\d+)(<\/output>)/i';
            $line_ok = preg_match($pattern, $fr, $matches);
            if($line_ok == 1) { 
                $m = $matches[2] + 1;
                $fr = preg_replace($pattern, '${1}'.$m.'$3', $fr, 1);
                rewind($f);
                ftruncate($f, 0);
                fwrite($f, $fr);
            }
            echo $m;
            flock($f, LOCK_UN);
        }
        fclose($f);
    }
}
?>


И если решение найдётся, хотелось бы ещё узнать как сделать запись не только в файл, но и в БД.
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
$fn = $_SERVER['DOCUMENT_ROOT'] . $_POST['url'];
явно бред, если только в $_POST['url'] не передавать имя файла куда писать, что тоже странно. Если нужны файлы с именем url, то как минимум не кидайте в корень, создайте папку и расширение файла добавьте, и создание файла добавьте если его нет.
file_exists не годится, так как он проверяет наличие файла или директории, а у Вашего файла нет расширения вот он и дает true так как директория есть. Тут оправданно будет is_writable()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы