За последние 24 часа нас посетили 17434 программиста и 1684 робота. Сейчас ищут 1619 программистов ...

file_exists возвращает false когда файл существует

Тема в разделе "Прочие вопросы по PHP", создана пользователем Slava2293, 23 июл 2023.

Метки:
  1. Slava2293

    Slava2293 Новичок

    С нами с:
    16 июл 2023
    Сообщения:
    7
    Симпатии:
    0
    У меня есть файл с кешем. Когда захожу на страницу и проверяю его наличие, он работает правильно. Когда удаляю файл и обновляю страницу он также работает правильно. А вот после отправки формы он почему-то всегда возвращает true, а при повторном нажатии на кнопку уже начинает работать правильно. Подскажите, пожалуйста, как это исправить и в чем может быть проблема
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Ну, либо нужно перенаправлять (смотреть https://www.php.net/manual/ru/function.header.php первый же пример), либо, если файл большой, то до полного удаления, просто не хватает времени до вызова file_exists(). Файл еще существует
     
  3. Slava2293

    Slava2293 Новичок

    С нами с:
    16 июл 2023
    Сообщения:
    7
    Симпатии:
    0
    Я немного непонятно, наверное, написал. Я имел ввиду почему после нажатии кнопки file_exists возвращает false, хотя должен true, потому что файл в директории в этот момент есть
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    "Кнопки"?
    C "The"?
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Slava2293 проверьте на предмет примечания из документации для PHP: file_exists - Manual:
     
    [vs] нравится это.
  6. Slava2293

    Slava2293 Новичок

    С нами с:
    16 июл 2023
    Сообщения:
    7
    Симпатии:
    0
    Я использовал clearstatcache(). Это не помогает. И в принципе пробовал php запрещать кэшировать данные
     
  7. Slava2293

    Slava2293 Новичок

    С нами с:
    16 июл 2023
    Сообщения:
    7
    Симпатии:
    0
    Вот такое условие у меня в контроллере. Если файла с кэшем нету, делается запрос к бд, добавляется в кэш и отправляется во view в котором есть форма с кнопкой. Если кэш есть, просто он передается во view, а если он есть и еще есть данные из $_POST, они вставляются в запрос и уже этот запрос кэшируется. Так вот, при нажатии на кнопку должен выполнятся этот последний блок с условием для $_POST, потому что в этот момент есть файл с кэшем. А file_exists его не находит и выполняется else
    upload_2023-7-24_21-56-29.png
    --- Добавлено ---
    Вот это view
    upload_2023-7-24_22-9-39.png
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    @Slava2293 это по твоему нормально вместо кода картинки слать?
    не думаю! переделай
    --- Добавлено ---
    Инфа 100% надо проверить логику в обработке формы. Редирект поле обработчика формы делаешь? Тебе уже написали об этом, но ты проигнорировал и стал писать о своём чём-то.

    Чтобы не запутаться, разделяй обработку формы и вывод страницы.
     
  9. Slava2293

    Slava2293 Новичок

    С нами с:
    16 июл 2023
    Сообщения:
    7
    Симпатии:
    0
    Это в контроллере
    PHP:
    1.      if($app->cache->url('product')){
    2.                         echo 'Файл существует';
    3.                        $posts = $app->cache->get('product');
    4.                         if(isset($_POST["products"])){//ЕСЛИ МАССИВ ЕСТЬ И СЕЛЕКТ ВЫБРАН
    5.                             echo 'bbb';
    6.                             $app->cache->delete('product');//УДАЛИТЬ СТАРЫЙ КЭШ
    7.                             $this->postRequest = $_POST["products"];
    8.                             $posts = \R::getAll("SELECT products.id, products.name, products.price, products.info, products.image_path
    9.                            FROM products
    10.                            INNER JOIN selProducts ON products.sel_id = selProducts.product_id WHERE selProducts.product_type = ?", array($this->postRequest));//СДЕЛАТЬ НОВЫЙ ЗАПРОС
    11.                             // $app->cache->set('products', $posts, 3600*24);
    12.                             var_dump($posts);
    13.                         }
    14.                      
    15.                     }
    16.                     else{
    17.                        echo 'Файл не существует';
    18.                        $posts = \R::findAll('products');
    19.                        $app->cache->set('product', $posts, 3600*24);
    20.  
    21.            
    22.                     }
    23.        
    Это во view
    PHP:
    1. <form action="goods" method="POST">
    2.                 <select name="products">
    3.                     <option value="Ноутбук">Ноутбуки</option>
    4.                     <option value="Холодильник">Холодильники</option>
    5.                 </select>
    6.                 <button>ADD</button>
    7.             </form>
    8.             <?php if (!empty($posts)): ?>
    9.                 <?php foreach ($posts as $post): ?>
    10.                     <div class="col-3">
    11.                     <form action="goods" method="POST">
    12.                         <img src="<?= $post['image_path'] ?>" class="card-img-top col_height" alt="<?= $post['id'] ?>" id="<?= $post['id'] ?>">
    13.                         <div class="card-body">
    14.                             <h5 class="card-title">
    15.                                 <?= $post['name'] ?>
    16.                             </h5>
    17.                             <p class="card-text">
    18.                                 <?= $post['info'] ?>
    19.                             </p>
    20.                             <button class="btn btn-primary" name="<?php echo $post['id']?>" value="<?php echo $post['id']?>">BTN</button>
    21.                         </div>
    22.                 </form>
    23.                     </div>
    24.                 <?php endforeach; ?>
    25.             <?php endif; ?>
    --- Добавлено ---
    У меня они разделены на view и controller. Обработчик в контроллере находится и как раз чтобы он выполнился file_exists должен найти тот файл. Поэтому я не совсем понимаю где там делать перенаправление
     
    #9 Slava2293, 25 июл 2023
    Последнее редактирование: 25 июл 2023
  10. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    что за бред про медленное удаление больших файлов, файл просто помечается удалённым.
    вот если move с copy перепутать при работе с бэкапами, можно встрять.
     
  11. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    То есть, больше ничего не насторожило, к "кнопке" претензий нет?
    Имелось в виду последовательность действий в сценарии, наводящий вопрос так сказать. Или нужно каждое сообщение сопровождать разъяснениями на двусмысленные места?
     
    #11 Drunkenmunky, 25 июл 2023
    Последнее редактирование: 25 июл 2023
  12. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    топик не интересен абсолютно, но писать не весть чего тоже как-то не так )
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Перенаправление надо делать после обработки данных из формы. Вместо вывода страницы надо выдать заголовок переадресации и немедленно завершить работу ( exit() ). Браузер получив заголовок, создаст новый запрос, где уже будет читаться твой кеш или при его отсутствии что-то читать из базы.

    Смотрю твой листинг: Помоему странно помещать обработку формы внутрь if-а с проверкой "существует ли кеш". Тут какой-то логический косяк. Тебе должно быть пофигу был кеш или нет в этом месте.
    --- Добавлено ---
    - - -

    Кеш это по определению штука необязательная. В любой момент, по неважно какой причине, желаемые данные могут отсутствовать в кеше. Реакция скрипта, как её видит пользователь, должна быть одна и та же с кешем или без. Может только скорость ответа измениться.

    Советую просто выпилить всё что там про кеш, добиться безошибочной работы GET и POST запросов, а потом ненавязчиво добавить кеширование с учетом правила сверху ↑↑↑
    --- Добавлено ---
    - - -

    Самый правильный объектно-ориентированный путь работы с кешем — заменить класс или метод получения данных на точно такой же, но с (необязательным) кешем. А не вкорячивать новую логику прямо в контроллер.
     
  14. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    тебе выше написали, отдели (в твоём случае)"бизнес-логику" от представления, в этом киселе никому колупаться неинтересно
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    @Slava2293 когда не получается, надо упрощать, а не усложнять.
    Я вижу даже удаленные посты ;) ты усложняешь. Раз ты не слушаешь, не вижу смысла следить за этой темой. Удачи!