У меня есть файл с кешем. Когда захожу на страницу и проверяю его наличие, он работает правильно. Когда удаляю файл и обновляю страницу он также работает правильно. А вот после отправки формы он почему-то всегда возвращает true, а при повторном нажатии на кнопку уже начинает работать правильно. Подскажите, пожалуйста, как это исправить и в чем может быть проблема
Ну, либо нужно перенаправлять (смотреть https://www.php.net/manual/ru/function.header.php первый же пример), либо, если файл большой, то до полного удаления, просто не хватает времени до вызова file_exists(). Файл еще существует
Я немного непонятно, наверное, написал. Я имел ввиду почему после нажатии кнопки file_exists возвращает false, хотя должен true, потому что файл в директории в этот момент есть
Я использовал clearstatcache(). Это не помогает. И в принципе пробовал php запрещать кэшировать данные
Вот такое условие у меня в контроллере. Если файла с кэшем нету, делается запрос к бд, добавляется в кэш и отправляется во view в котором есть форма с кнопкой. Если кэш есть, просто он передается во view, а если он есть и еще есть данные из $_POST, они вставляются в запрос и уже этот запрос кэшируется. Так вот, при нажатии на кнопку должен выполнятся этот последний блок с условием для $_POST, потому что в этот момент есть файл с кэшем. А file_exists его не находит и выполняется else --- Добавлено --- Вот это view
@Slava2293 это по твоему нормально вместо кода картинки слать? не думаю! переделай --- Добавлено --- Инфа 100% надо проверить логику в обработке формы. Редирект поле обработчика формы делаешь? Тебе уже написали об этом, но ты проигнорировал и стал писать о своём чём-то. Чтобы не запутаться, разделяй обработку формы и вывод страницы.
Это в контроллере PHP: if($app->cache->url('product')){ echo 'Файл существует'; $posts = $app->cache->get('product'); if(isset($_POST["products"])){//ЕСЛИ МАССИВ ЕСТЬ И СЕЛЕКТ ВЫБРАН echo 'bbb'; $app->cache->delete('product');//УДАЛИТЬ СТАРЫЙ КЭШ $this->postRequest = $_POST["products"]; $posts = \R::getAll("SELECT products.id, products.name, products.price, products.info, products.image_path FROM products INNER JOIN selProducts ON products.sel_id = selProducts.product_id WHERE selProducts.product_type = ?", array($this->postRequest));//СДЕЛАТЬ НОВЫЙ ЗАПРОС // $app->cache->set('products', $posts, 3600*24); var_dump($posts); } } else{ echo 'Файл не существует'; $posts = \R::findAll('products'); $app->cache->set('product', $posts, 3600*24); } Это во view PHP: <form action="goods" method="POST"> <select name="products"> <option value="Ноутбук">Ноутбуки</option> <option value="Холодильник">Холодильники</option> </select> <button>ADD</button> </form> <?php if (!empty($posts)): ?> <?php foreach ($posts as $post): ?> <div class="col-3"> <form action="goods" method="POST"> <img src="<?= $post['image_path'] ?>" class="card-img-top col_height" alt="<?= $post['id'] ?>" id="<?= $post['id'] ?>"> <div class="card-body"> <h5 class="card-title"> <?= $post['name'] ?> </h5> <p class="card-text"> <?= $post['info'] ?> </p> <button class="btn btn-primary" name="<?php echo $post['id']?>" value="<?php echo $post['id']?>">BTN</button> </div> </form> </div> <?php endforeach; ?> <?php endif; ?> --- Добавлено --- У меня они разделены на view и controller. Обработчик в контроллере находится и как раз чтобы он выполнился file_exists должен найти тот файл. Поэтому я не совсем понимаю где там делать перенаправление
что за бред про медленное удаление больших файлов, файл просто помечается удалённым. вот если move с copy перепутать при работе с бэкапами, можно встрять.
То есть, больше ничего не насторожило, к "кнопке" претензий нет? Имелось в виду последовательность действий в сценарии, наводящий вопрос так сказать. Или нужно каждое сообщение сопровождать разъяснениями на двусмысленные места?
Перенаправление надо делать после обработки данных из формы. Вместо вывода страницы надо выдать заголовок переадресации и немедленно завершить работу ( exit() ). Браузер получив заголовок, создаст новый запрос, где уже будет читаться твой кеш или при его отсутствии что-то читать из базы. Смотрю твой листинг: Помоему странно помещать обработку формы внутрь if-а с проверкой "существует ли кеш". Тут какой-то логический косяк. Тебе должно быть пофигу был кеш или нет в этом месте. --- Добавлено --- - - - Кеш это по определению штука необязательная. В любой момент, по неважно какой причине, желаемые данные могут отсутствовать в кеше. Реакция скрипта, как её видит пользователь, должна быть одна и та же с кешем или без. Может только скорость ответа измениться. Советую просто выпилить всё что там про кеш, добиться безошибочной работы GET и POST запросов, а потом ненавязчиво добавить кеширование с учетом правила сверху ↑↑↑ --- Добавлено --- - - - Самый правильный объектно-ориентированный путь работы с кешем — заменить класс или метод получения данных на точно такой же, но с (необязательным) кешем. А не вкорячивать новую логику прямо в контроллер.
тебе выше написали, отдели (в твоём случае)"бизнес-логику" от представления, в этом киселе никому колупаться неинтересно
@Slava2293 когда не получается, надо упрощать, а не усложнять. Я вижу даже удаленные посты ты усложняешь. Раз ты не слушаешь, не вижу смысла следить за этой темой. Удачи!