Задать вопрос
  • Как добавить/удалить class после прокрутки?

    ValeriuCutebov
    @ValeriuCutebov
    Для добавления класса scroll-up при прокрутке вверх и его удаления при достижении header__section-info, вам нужно изменить функцию fixedHeader() следующим образом:

    function fixedHeader() {
      if (currentScrollpos > sectionInfo) {
        headerOneELement.classList.add('fix');
        document.querySelector('.page__header').style.marginBottom = headerOneELement.offsetHeight + 'px';
    
        if (currentScrollpos < prevScrollpos) {
          headerOneELement.classList.add('scroll-up');
        } else {
          headerOneELement.classList.remove('scroll-up');
        }
      } else {
        headerOneELement.classList.remove('fix');
        headerOneELement.classList.remove('scroll-up');
        document.querySelector('.page__header').style.marginBottom = '0';
      }
      prevScrollpos = currentScrollpos;
    }

    Когда пользователь прокручивает страницу вверх, мы добавляем класс scroll-up, а когда пользователь прокручивает страницу вниз, мы удаляем этот класс, если пользователь достигает header__section-info. Обратите внимание, что мы также удаляем класс scroll-up в блоке else для случаев, когда пользователь достигает верха страницы.

    Касательно вашего вопроса про изменение sectionInfo переменной, ее значение должно быть вычислено как расстояние от верха страницы до нижней границы header__section-info вместо высоты элемента. Используйте следующий код:

    var sectionInfo = document.querySelector('.header__section-info').getBoundingClientRect().bottom;

    Конечный код может выглядеть следующим образом:

    document.addEventListener('DOMContentLoaded', function() {
      'use strict';
    
      var prevScrollpos = window.pageYOffset;
      var sectionInfo = document.querySelector('.header__section-info').getBoundingClientRect().bottom;
      var headerOneElement = document.querySelector('.header__section-navbar');
    
      window.addEventListener('scroll', function() {
        var currentScrollpos = window.pageYOffset;
    
        // fixedHeader on scroll
        function fixedHeader() {
          if (currentScrollpos > sectionInfo) {
            headerOneElement.classList.add('fix');
            document.querySelector('.page__header').style.marginBottom = headerOneElement.offsetHeight + 'px';
    
            if (currentScrollpos < prevScrollpos) {
              headerOneElement.classList.add('scroll-up');
            } else {
              headerOneElement.classList.remove('scroll-up');
            }
          } else {
            headerOneElement.classList.remove('fix');
            headerOneElement.classList.remove('scroll-up');
            document.querySelector('.page__header').style.marginBottom = '0';
          }
          prevScrollpos = currentScrollpos;
        }
    
        fixedHeader();
      });
    });

    В этом коде мы использовали getBoundingClientRect().bottom для определения расстояния от верха страницы до нижней границы header__section-info.

    Надеюсь, это поможет!
  • Как получить одно из значений ответа на запрос?

    ValeriuCutebov
    @ValeriuCutebov
    skands757, конечный код может выглядеть так:

    <?php
    session_start();
    
    // Получаем ответ на запрос
    $response = '{"status":"success","1":{"transaction":"8025400","email":"Не указана","amount":"21.38","currency":"RUB","currency_amount":"20.00","comission_percent":"6.90","comission_fixed":"0.00","amount_profit":"20.00","method":"Не выбран","payment_id":"1618399991","description":"Покупка доступа на 2 дня","date":"2023-03-13 19:40:46","pay_date":"2023-03-13 19:40:46","transaction_status":"0","custom_fields":"null","webhook_status":"0","webhook_amount":"0"}}';
    $data = json_decode($response, true);
    
    // Получаем значение transaction_status, установленное в сессии или равное 0
    $transaction_status = $_SESSION['transaction_status'] ?? 0;
    
    // Проверяем, равно ли значение transaction_status 0
    if ($transaction_status == 0) {
      // Если да, то выводим сообщение и завершаем скрипт
      echo 'Статус транзакции = 0';
      exit(0);
    } else {
      // Если нет, то выводим другое сообщение и продолжаем скрипт
      echo 'Статус транзакции не равен 0';
    }
    
    // Обновляем значение transaction_status в сессии
    $_SESSION['transaction_status'] = $data["1"]["transaction_status"];

    В этом коде мы сначала вызываем функцию session_start(), чтобы начать сессию. Затем мы получаем ответ на запрос и декодируем его в массив PHP. Затем мы получаем значение переменной transaction_status из сессии или устанавливаем ее значение по умолчанию равным 0, используя оператор условного объединения null. Далее мы проверяем, равно ли значение transaction_status 0, и выводим соответствующее сообщение. Затем мы обновляем значение transaction_status в сессии, чтобы оно было доступно на других страницах.

    Надеюсь, это поможет!
  • Как получить одно из значений ответа на запрос?

    ValeriuCutebov
    @ValeriuCutebov
    skands757, чтобы установить значение переменной по умолчанию, вы можете использовать оператор условного объединения null (null coalescing operator) ??, который проверяет, установлено ли значение переменной и возвращает его, если да, или возвращает значение по умолчанию, если нет. Например:

    $transaction_status = $_SESSION['transaction_status'] ?? 0;

    В этом примере, если значение переменной $_SESSION['transaction_status'] установлено, то переменная $transaction_status будет установлена равной этому значению, а если значение не установлено, то переменная будет установлена равной 0.

    Если вам нужно сохранять значение переменной между разными страницами, вы можете использовать сессии. Например, вы можете установить значение переменной в сессии следующим образом:

    session_start();
    $_SESSION['transaction_status'] = 0;

    После этого значение переменной будет сохранено в сессии и будет доступно на других страницах.
  • Как добавить/удалить class после прокрутки?

    ValeriuCutebov
    @ValeriuCutebov
    Максим, Рад, что мой ответ помог! Ваш исправленный код выглядит правильным и должен работать как надо. Удачи с вашим проектом!
  • Копирование одного диска на несколько, как ускорить?

    ValeriuCutebov
    @ValeriuCutebov
    Предложенное решение звучит разумно и может быть более эффективным, чем использование dd или cat для копирования данных с одного диска на несколько других. Разделение диска с помощью parted и форматирование нужных разделов позволяет более гибко управлять пространством на диске и избежать копирования ненужных данных.

    Затем заливание архива tar.gz на отдельные разделы дисков может ускорить процесс копирования данных, поскольку вместо копирования каждого файла отдельно данные передаются как единый архив.

    Наконец, установка загрузчика EFI позволяет создать загрузочный раздел на каждом диске, что может быть полезно для определения правильного загрузочного диска при установке операционной системы или при загрузке системы с внешнего диска.

    Таким образом, использование скрипта с командами parted, tar.gz, и установки загрузчика EFI может быть более эффективным и быстрым способом копирования данных на несколько дисков.

    Спасибо за Лучшее решение!
  • Почему сервер падает через AJAX запросы?

    ValeriuCutebov
    @ValeriuCutebov
    Дмитрий, Да, это верно. Открытые non-persistent соединения и наборы результатов автоматически закрываются, когда их объекты уничтожаются. Я бы рекомендовал использовать persistent соединения, если это возможно, так как они могут улучшить производительность, уменьшив количество времени, необходимого для создания и закрытия соединений с базой данных.

    Тем не менее, если возникают проблемы с падением сервера, то, вероятно, проблема не связана с закрытием соединений с базой данных. Рекомендуется провести более глубокую диагностику проблемы, используя инструменты мониторинга сервера и базы данных, чтобы выяснить, что именно вызывает падение сервера.

    Спасибо за уточнение!
  • Как получить одно из значений ответа на запрос?

    ValeriuCutebov
    @ValeriuCutebov
    skands757, Пожалуйста, рад был помочь! Если у вас есть другие вопросы, не стесняйтесь обращаться.
  • Почему не возвращаются данные валидации inertia js + vue?

    ValeriuCutebov
    @ValeriuCutebov
    Дмитрий, Да, вы правы, я понимаю вашу точку зрения теперь. При использовании try-catch вы сможете перехватывать исключение ValidationException, которое выбрасывается при неудачной валидации. Тогда вы можете передавать ошибки обратно в представление через withErrors() метод, как вы и показали в последнем коде.

    Спасибо за уточнение!
  • Почему не возвращаются данные валидации inertia js + vue?

    ValeriuCutebov
    @ValeriuCutebov
    iamdivine, Да, вы правы. После вызова метода errors() у объекта Validator, мы получаем массив ошибок валидации.

    Таким образом, правильнее будет использовать метод withErrors вместо with при возвращении редиректа, чтобы передать массив ошибок валидации в представление:

    return redirect()->back()->withErrors($valid->errors());

    В представлении, как я уже упоминал ранее, вы можете обращаться к ошибкам валидации через метод errors, например:
    <div v-if="errors.has('nickname')">{{ errors.first('nickname') }}</div>

    Я извиняюсь за возможное недопонимание в предыдущем ответе.
  • Почему сервер падает через AJAX запросы?

    ValeriuCutebov
    @ValeriuCutebov
    Если оптимизированный код и использование оптимизированных индексов в базе данных не помогают решить проблему, то возможно, проблема связана с серверной конфигурацией или сетевыми настройками.

    Однако, я могу предложить еще один вариант кода, который может уменьшить количество запросов к базе данных и, возможно, снизить нагрузку на сервер.

    PHP код:
    $startFrom = $_POST['startFrom'];
    $limit = 4;
    $sql = "SELECT * FROM articles ORDER BY id DESC LIMIT $startFrom, $limit";
    $res = mysqli_query($conn, $sql);
    $articles = array();
    while ($row = mysqli_fetch_assoc($res)) {
        $articles[] = $row;
    }
    mysqli_free_result($res);
    echo json_encode($articles);

    JavaScript код:
    var startFrom = 0;
    var inProgress = false;
    var limit = 4;
    var articles = [];
    $(window).scroll(function() {
        if ($(window).scrollTop() + $(window).height() >= $(document).height() - 100 && !inProgress) {
            inProgress = true;
            if (articles.length - startFrom <= limit) {
                limit = articles.length - startFrom;
            }
            var data = articles.slice(startFrom, startFrom + limit);
            startFrom += limit;
            if (data.length > 0) {
                $.each(data, function(index, value) {
                    $("#div").append('<div class="item">' + value.title + '</div>');
                });
                inProgress = false;
            } else {
                $.ajax({
                    url: 'ajaxappendindex.php',
                    method: 'POST',
                    data: { startFrom: startFrom },
                    beforeSend: function() {
                        $("#loader").show();
                    }
                }).done(function(data) {
                    data = JSON.parse(data);
                    if (data.length > 0) {
                        articles = articles.concat(data);
                        var newData = articles.slice(startFrom, startFrom + limit);
                        $.each(newData, function(index, value) {
                            $("#div").append('<div class="item">' + value.title + '</div>');
                        });
                    }
                    inProgress = false;
                    $("#loader").hide();
                });
            }
        }
    });

    Этот код загружает все статьи из базы данных один раз при загрузке страницы и хранит их в переменной articles. Затем при каждом скроллинге страницы код извлекает нужное количество статей из переменной articles, вместо того, чтобы отправлять новый запрос к базе данных каждый раз.

    Если статьи из переменной articles заканчиваются, то код отправляет новый запрос к базе данных и добавляет новые статьи в переменную articles.

    Надеюсь, этот код поможет решить проблему. Если нет, то рекомендую провести дополнительную диагностику проблемы с помощью инструментов мониторинга сервера. Для этого можно использовать инструменты мониторинга сервера, такие как top, htop, iostat, vmstat и др.
  • Почему сервер падает через AJAX запросы?

    ValeriuCutebov
    @ValeriuCutebov
    Ваш код может быть оптимизирован следующим образом:

    PHP код:
    $startFrom = $_POST['startFrom'];
    $limit = 4;
    $sql = "SELECT * FROM articles ORDER BY id DESC LIMIT $startFrom, $limit";
    $res = mysqli_query($conn, $sql);
    $articles = array();
    while ($row = mysqli_fetch_assoc($res)) {
        $articles[] = $row;
    }
    mysqli_free_result($res);
    echo json_encode($articles);

    JavaScript код:
    var startFrom = 0;
    var inProgress = false;
    var limit = 4;
    $(window).scroll(function() {
        if ($(window).scrollTop() + $(window).height() >= $(document).height() - 100 && !inProgress) {
            inProgress = true;
            startFrom += limit;
            $.ajax({
                url: 'ajaxappendindex.php',
                method: 'POST',
                data: { startFrom: startFrom },
                beforeSend: function() {
                    $("#loader").show();
                }
            }).done(function(data) {
                data = JSON.parse(data);
                if (data.length > 0) {
                    $.each(data, function(index, value) {
                        $("#div").append('<div class="item">' + value.title + '</div>');
                    });
                    inProgress = false;
                }
                $("#loader").hide();
            });
        }
    });

    Этот код объединяет все необходимые данные в один запрос, использует переменную $limit для указания максимального количества статей, возвращаемых за один запрос, и использует функцию mysqli_free_result() для освобождения ресурсов, выделенных для результата запроса.

    Также в JavaScript коде добавлен блок для отображения спиннера загрузки (#loader), который показывается перед отправкой запроса и скрывается после получения ответа.
  • Почему сервер падает через AJAX запросы?

    ValeriuCutebov
    @ValeriuCutebov
    Если добавление mysqli_close($conn) не решило проблему, то возможно, причина в другом.

    Причина может быть связана с тем, что каждый запрос создает новый процесс на сервере, который обрабатывает запрос и затем завершается. Если количество одновременно запущенных процессов превышает допустимые значения, то сервер может начать падать.

    Для решения этой проблемы можно использовать следующие подходы:

    1. Оптимизация запросов к базе данных. Чем меньше запросов к базе данных вы отправляете, тем меньше процессов будет создано на сервере, и тем меньше вероятность, что сервер начнет падать. Попробуйте объединить несколько запросов в один или использовать более эффективный код.

    2. Использование кэширования. Если данные, которые вы запрашиваете, не изменяются часто, то можно использовать кэширование для уменьшения количества запросов к базе данных. Вы можете кэшировать данные на стороне сервера или на стороне клиента.

    3. Использование более мощного сервера. Если ваш сервер не справляется с обработкой запросов, то может быть необходимо использовать более мощный сервер или увеличить количество доступной оперативной памяти.

    4. Увеличение лимитов соединений. Если проблема связана с тем, что лимиты соединений на вашем сервере или базе данных слишком низкие, то можно попробовать увеличить эти лимиты. Но не забывайте, что увеличение лимитов может привести к увеличению нагрузки на сервер и базу данных.