За последние 24 часа нас посетили 22884 программиста и 1224 робота. Сейчас ищут 687 программистов ...

вывод изображений в браузер через php + ajax

Тема в разделе "JavaScript и AJAX", создана пользователем Alexus, 23 май 2020.

  1. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    Всем доброго времени суток уважаемые форумчане, обычно решаю свои проблемы самостоятельно, но в этот раз требуется Ваша подсказка, задача проста: необходимо с помощью связки php + ajax вывести определенное количество изображений в браузер, скрипт в упрощенном виде выглядит так:

    HTML:
    1. <div id="show">
    2.  
    3. Вниз
    4. </div>
    Код (Javascript):
    1.   <script type="text/javascript">
    2.  
    3.  
    4.             var form = $('#show');
    5.                var cnt = 1;
    6.          
    7.             form.on("click", function(){
    8.  
    9.             $.ajax( {
    10.                 method: "POST",
    11.                 data: {cnt},
    12.                 url: "pages/portfolio.php",
    13.                 success: function(data){
    14.                  
    15.                     $('#show').html(data);
    16.                     }
    17.                 });
    18.             });
    19. </script>
    PHP:
    1. $cnt = filter_input(INPUT_POST, 'cnt', FILTER_SANITIZE_SPECIAL_CHARS);
    2. $num = 0;
    3.  
    4.     if ($cnt){
    5.              
    6.                 showFoto($cnt,$_SESSION['img']);
    7.        
    8.               $output = array_slice($_SESSION['img'], $cnt);
    9.             $_SESSION['img'] = $output;
    10. }
    11.  
    12. function showFoto($cnt,$files){          
    13.  
    14.     foreach ($_SESSION['img'] as $files){
    15.         $num++;
    16.  
    17. echo <<<HERE
    18. <img class='portfolio' src='../foto/$files' alt='$alt' id='$files' onclick="document.getElementById('$files').requestFullscreen()";>
    19. HERE;
    20.  
    21.         if ($num == $cnt){
    22.  
    23.             break;
    24.         }    
    25.     }
    26. }
    И все вроде бы срабатывает, НО по какой-то неведомой мне причине при повторной отправке ajax-ом значения cnt, массив $_SESSION['img'] уменьшается каждый раз не на 1 элемент, а в удвоенном знаении, из-за чего часть изображений автоматически пролистывается. Я уже грешил на функцию array_slice, но тщетно. Не могу понять где проблема :(
     
    #1 Alexus, 23 май 2020
    Последнее редактирование: 23 май 2020
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    Как всегда, хотят чтоб помогли именно в их видении решении задачи,и которую подробно не описали, чую там гораздо проще можно сделать если понимать задачу

    Пока из приведенного кода вижу что в функции не инициализируется $num, откуда там начинается отсчёт неясно
     
  3. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    Спасибо за Ваш комментарий на счет $num добавил значение, я не стал полностью код выкладывать, так как будет еще запутаннее возможно чем я написал. Я взял именно тот кусок кода в котором происходит ошибка. Суть в том, что первоначально я получаю набор файлов из дирректории foto через функцию readdir и сохраняю их в виде массива в сессионную переменную, которую называю $_SESSION['img'], затем я с помощью AJAX отправляю значение переменной cnt, которая по умолчанию у меня равна 1, переменная отправляется в php каждый раз при нажатии на <div> с id = 'show', и отправляется в php, где присваевается переменной $cnt. В php по моей задумке внутри функции showFoto я пробегаю по массиву $_SESSION['img'] ровно столько раз сколько содержит в себе переменная $cnt, затем обрываю функцию и отнимаю из массива $_SESSION['img'] это же значение. На экране я вижу добавленное фото. Затем я нажимаю на <div> с id = show еще раз, но вместо следующего значения в массиве $_SESSION['img'] я перепрыгиваю через значение, то есть часть фото пролистывается, потом еще и еще и так в геометрической прогрессии..

    Сначала я грешил на array_slice, но она срабатывает в точности правильно. Потом на переменную $cnt, но она тоже не меняется, $_SESSION['img'] меняется именно после отработки AJAX, каждый раз в геомиетрической прогрессии, то есть каждый раз внутрь функции showFoto оно уже приходит измененное, я не могу понять почему и как мне от этого избавится!

    PHP:
    1. $cnt = filter_input(INPUT_POST, 'cnt', FILTER_SANITIZE_SPECIAL_CHARS);
    2. $num = 0;
    3.     if ($cnt){
    4.            
    5.                 showFoto($cnt);
    6.      
    7.               $output = array_slice($_SESSION['img'], $cnt);
    8.             $_SESSION['img'] = $output;
    9. }
    10. function showFoto($cnt){        
    11.     foreach ($_SESSION['img'] as $files){
    12.         $num++;
    13. echo <<<HERE
    14. <img class='portfolio' src='../foto/$files' alt='$alt' id='$files' onclick="document.getElementById('$files').requestFullscreen()";>
    15. HERE;
    16.         if ($num == $cnt){
    17.             break;
    18.         }  
    19.     }
    20. }
    Вот код php в последней редакции..
    --- Добавлено ---
    Пардоньте.. Проблема видимо действительно в аяксе.. при нажатии на div каждый раз POST запрос увеличивается в геометрической прогрессии.. Это ошибка в JS не PHP :(
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    что делает каждая строка ?
     
  5. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    PHP:
    1. showFoto($cnt);
    уже исправил. По моей задумке внутри функции showFoto я пробегаю по массиву $_SESSION['img'] ровно столько раз сколько содержит в себе переменная $cnt, затем обрываю функцию и отнимаю из массива $_SESSION['img'] это же значение. На экране я вижу добавленное фото
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    Чем говоря как то кривенько все...
    Вы лучше задачу опишите типа при нажатии на кнопку хочу видеть то то и то то.

    Непонятно зачем сессии, зачем по несколько раз пролегать иид итп

    Вы цель скажите конечную - при каждом нажатии очередную картинку из директории выводить?
     
  7. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    Да суть в этом и делаю да кривенько, потому что по-своему (по костылевому :) ) при правильном подходе я знаю что это делается через LIMITы SQL например, но в связи с особенностями кода, искал альтернативный путь, суть PHP уже работает, я уже написал выше, что проблема кроется в множественных POST запросах, то есть где-то в JS, так что ушел лопатить ;)