Задать вопрос
  • Может ли браузер дублировать POST запрос?

    Такое обычно происходит, когда запрос кидается в lifecycle-хуках, которые могут сработать много раз (например, updated), либо в watch. И когда у вас что-то ошибочно повторно перерендерится, то может бахнуть второй запрос. Дабл-клик по кнопке, которую вы не выключаете сразу после первого клика также не исключается.

    Насчёт идентификатора вашего ничего не могу сказать, потому что не вижу, где и как вы его генерируете.

    Дебажить, дебажить, и ещё раз дебажить VUE.

    1. Если есть возможность запустить фронтенд на локалке в development environment, установите в браузер плагин Vuejs devtools, и посмотрите поведение компонента, кидающего запросы, может быть там что-то увидите.

    2. Откройте devtools браузера и на вкладке Network и кликните ссылку в колонке Initiator (не знаю, как по-русски, не пользуюсь русским в браузере) у этих повторяющихся запросов. Если будут показаны разные участки кода, значит, где-то еще в коде затерялся такой же запрос.

    3. Самое простое: прямо перед строчкой с вызовом запроса axios (прямо перед запросом, в этой же функции, не где-то вне её, а прямо в предыдущей строчке) напишите банальный console.log("Gotcha!!!!"). Если сообщение в консоли браузера появится дважды, значит, проблема исключительно в логике вашей программы.

    4. Если ваш ID действительно генерируется прямо рядом с вызовом запроса, прямо в той же самой функции (что исключает баг с тем, что в запрос подставляется где-то сохранённый и кэшированный фреймворком ID), и это действительно подлый Chromium повторяет запросы из-за крайне нестабильного коннекта у пользователя, то тогда генерируйте ID не просто рандомом, который всё же может повториться, а сгенерируйте нормальный UUID, вероятность повторения которого ЗНАЧИТЕЛЬНО ниже. При приходе запроса сохраняете этот UUID на короткое время где вам удобнее, и если придёт такой же запрос с таким же UUID, то не обрабатываете его. Этот же UUID вам может помочь и в других аспектах: например, вы можете его использовать как "Correlation ID" данного конкретного запроса. Его можно отражать в логах, передавать в другие сервисы, если у вас их несколько. И тогда вы сможете без проблем отслеживать жизненный цикл каждого конкретного запроса.
    Ответ написан
    6 комментариев
  • PHP. Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    В приведённом коде вообще нет вызова trim(...).
    Ну а по тексту ошибки: в вызове trim($variable) (в файле /var/www/u2340392/data/www/test.kaikova.ru/modules/mod_bt_contentslider/tmpl/default.php) указана переменная, хранящая значение null, вместо ожидаемой строки. Из-за этого и ошибка...
    Ответ написан
    Комментировать
  • Как могли узнать код для входа в Телеграм?

    15432
    @15432
    Системный программист ^_^
    Современные недорогие кнопочные телефоны зачастую имеют в системе закладки, которые сливают смс и ваши данные кому попало. Поэтому прежде всего напишите модель вашего телефона
    Ответ написан
    9 комментариев
  • Как могли узнать код для входа в Телеграм?

    1. Посмотрите, какие ещё сессии активны в настройках безопасности и завершите все, в каких вы сомневаетесь
    2. Про кнопочные телефоны тут уже сказали
    3. Всё равно нельзя исключать вариант с утечкой с ПК. Проверьте хорошо комп антивирусом.
    Ответ написан
    1 комментарий
  • Как могли узнать код для входа в Телеграм?

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ и пр.
    Скорее всего с ПК и был уведён.
    Вирусы, левый клиент и и тп.
    Ответ написан
  • Как сделать обмен музыки из канала в телеграмме с сайтом?

    @q2digger
    никого не трогаю, починяю примус
    берем Telegram Bot API (https://core.telegram.org/bots/api), в другую руку берем какой нибудь знакомый язык программирования, например Python и пишем бота, который следит за постами с музыкой в вашем канале и при появлении новой делает какие-то запланированные действия, например выкладывает музыку на вашу страницу. У таких платформ как Wordpress или Django есть API, и все это отлично автоматизируется.
    Ответ написан
    Комментировать
  • Как разместить сам flex-контейнер (котором есть перенос по рядам) по центру?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы бы лучше вместо картинок сделали пример на том же JSFiddle или CodePen.
    А так, в общем случае
    div.operation-selector {
      width: 860px;
      margin: auto;
    }
    Ответ написан
    Комментировать
  • Как убрать слеш в конце главной страницы?

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} /(.+)/$
    RewriteRule ^(.+)/$ /$1 [L,R=301]

    Или:

    DirectorySlash Off

    https://www.slingacademy.com/article/apache-htacce...
    Ответ написан
    Комментировать
  • Как передать значение из Select2 в другую функцию?

    @catch-a-chalk
    Привет!
    $(document).ready(function() {
        // инициализация Select2
        $(".city").select2({
            ajax: {
                url: "/ajax.php?action=main&type=get_city",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function(params) {
                    return {
                        searchTerm: params.term
                    };
                },
                processResults: function(response) {
                    return {
                        results: response
                    };
                },
                cache: true
            }
        });
    
        // глобальная переменная для хранения выбранного города
        let selectedCity = null;
    
        // обработчик выбора города
        $('.city').on('select2:select', function(e) {
            selectedCity = e.params.data.id; // или e.params.data.text в зависимости от того, что нужно
            console.log("Выбран город:", selectedCity);
        });
    
        // основная функция фильтрации
        function getFilter() {
            let action = 'get_data';
            let category = filterCategory('category');
            let city = selectedCity; // используем сохраненное значение города
            
            $.ajax({
                url: '/ajax.php?action=main&type=get_data',
                method: 'POST',
                data: { 
                    action: action, 
                    category: category, 
                    city: city 
                },
                success: function(response) {
                    $('#filterResults').html(response);
                }
            });
        }
    
        function filterCategory(classname) {
            let filter = [];
            $('.' + classname + ':checked').each(function() {
                filter.push($(this).val());
            });
            return filter;
        }
    
        $('.filter_click').click(function() {
            getFilter();
        });
    });
    Ответ написан
  • Как лучше обновлять счётчик записей?

    @rPman
    триггером на insert/delete, быстрее и удобнее некуда
    Ответ написан
    6 комментариев
  • Как сделать пагинацию на js для нескольких независимых секций на странице?

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

    <div class="wrap_item" data-section="1">
      <h3 class="title_heading">Секция №1</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент 1</div>
        <div class="class_element">Элемент 2</div>
        <div class="class_element">Элемент 3</div>
        <div class="class_element">Элемент 4</div>
        <div class="class_element">Элемент 5</div>
      </div>
      <div class="pagination"></div>
    </div>
    
    <div class="wrap_item" data-section="2">
      <h3 class="title_heading">Секция №2</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент A</div>
        <div class="class_element">Элемент B</div>
        <div class="class_element">Элемент C</div>
        <div class="class_element">Элемент D</div>
        <div class="class_element">Элемент E</div>
      </div>
      <div class="pagination"></div>
    </div>
    
    <div class="wrap_item" data-section="3">
      <h3 class="title_heading">Секция №3</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент α</div>
        <div class="class_element">Элемент β</div>
        <div class="class_element">Элемент γ</div>
        <div class="class_element">Элемент δ</div>
        <div class="class_element">Элемент ε</div>
      </div>
      <div class="pagination"></div>
    </div>


    document.addEventListener('DOMContentLoaded', () => {
    
        const itemsPerPage = 2;
    
        document.querySelectorAll('.wrap_item').forEach((section) => {
          const wrapElements = section.querySelector('.wrap_elements');
          const elements = Array.from(wrapElements.children);
          const paginationContainer = section.querySelector('.pagination');
          const totalPages = Math.ceil(elements.length / itemsPerPage);
    
          function showPage(page) {
            elements.forEach((el, index) => {
              el.style.display =
                index >= (page - 1) * itemsPerPage && index < page * itemsPerPage
                  ? ''
                  : 'none';
            });
          }
    
          function createPagination() {
            paginationContainer.innerHTML = ''; // очистили контейнер пагинации
            for (let i = 1; i <= totalPages; i++) {
              const button = document.createElement('button');
              button.textContent = i;
              button.addEventListener('click', () => {
                showPage(i);
                updateActiveButton(i);
              });
              paginationContainer.appendChild(button);
            }
            updateActiveButton(1); 
          }
    
          function updateActiveButton(activePage) {
            paginationContainer.querySelectorAll('button').forEach((btn, index) => {
              btn.classList.toggle('active', index + 1 === activePage);
            });
          }
    
          showPage(1);
          createPagination();
        });
      });


    .wrap_elements {
        display: flex;
        flex-wrap: wrap;
        gap: 10px;
      }
    
      .class_element {
        padding: 10px;
        border: 1px solid #ccc;
        background: #f5f5f5;
      }
    
      .pagination button {
        margin: 0 5px;
        padding: 5px 10px;
        border: none;
        background: #ddd;
        cursor: pointer;
      }
    
      .pagination button.active {
        background: #ff6f61;
        color: #fff;
      }


    Теперь имеем что? Каждый .wrap_item обрабатывается отдельно, кайф. Все дочерние элементы .class_element собираются в массив, ну красота. Style.display для скрытия/показа элементов в зависимости от текущей страницы.
    Количество кнопок определяется totalPages.
    При клике на кнопку отображаются элементы, соответствующие выбранной странице. Вроде ничего не упустил.
    Ответ написан
    1 комментарий
  • Как запретить на сайте нажатие CTRL+SHIFT+I и F12?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вместо того чтоб страдать подобной <тут должно быть нецензурное слово> лучше сначала напишите что-то реально полезное, а так только сами себе грабли стелите
    Тот же авито сажает вирус в расширения хрома при открытии инструментов разработчика, наверно как и Вы боятся спалить свой говнокод (а у них там действительно беда)
    А еще подумайте вот о чем: что если инструменты разработчика уже открыты к моменту загрузки Вашей страницы? А что если я сижу на маке, где эти сочетания другие (CMD+I)? А что Вы будете делать с расширением которое позволяет блокировать обработку события контекстного меню скриптами в любое время? (У меня такое стоит)
    Ну и напоследок: когда в Вашем коде появится реально что-то полезное, у Вас будут мысли не "каким еще костылем защитить мой код", а "как бы это написать так, чтоб потом выложить в опенсорс не стыдно было, да еще звездочек за это на гитхабе нахватать"
    Ответ написан
    2 комментария
  • Как реализовать подписание оферты на сайте простой электронной подписью?

    hint000
    @hint000
    у админа три руки
    https://ru.wikipedia.org/wiki/Оферта
    Статья 158 Гражданского кодекса Российской Федерации допускает, что согласие на сделку может следовать из поступков стороны, направленных на реализацию сделки (конклюдентные действия), даже если не было явных заявлений о воле принять условия оферты. Например, факт посадки в общественный транспорт свидетельствует о желании ехать и приемлемости описанных условий оказания транспортных услуг (маршрут, цена), что автоматически обязывает пассажира оплатить проезд.


    Но юрист сказал клиенту, что нужно что бы были доказательства о том, что согласились клиенты с офертой.
    Делаем вывод: клиенту уволить юриста погаными тряпками, но мы-то знаем, что другим клиентам другие юристы сказали то же самое, законы не читают даже юристы.
    И посоветовал сделать подпись простой электронной подписью.
    Нажатием кнопки "согласен с условиями" или чекбоксом "согласен с условиями". Без этого нажатия не пускать к оформлению заказа. Это типовая схема.
    Ответ написан
    2 комментария
  • Есть ли в PHP готовый инструмент для получения элемента массива вложенность которого хранится в другом массиве?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Штатных средств нет.
    Неким "стандартом" стал доступ в dot-нотации. Вот одна из реализаций:
    https://github.com/adbario/php-dot-notation
    Ответ написан
    9 комментариев
  • Раздражает ли авторизация тех, кто следит заходит на мой Pet-проект?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    В таких случаях обычно регистрация и авторизация делаются, но где-нибудь пишется, что можно воспользоваться демонстрационным пользователем с логином demo и паролем demo.
    Ответ написан
    Комментировать
  • Почему в FIrefox и Safari файлы стилей переименовываются?

    Lynn
    @Lynn
    nginx, js, css
    У вас в vendor.js скрипт который зачем-то заменяет файлы стилей на блобы.

    document.querySelectorAll('link').forEach((e => t(e)))
    
    function t(e){"text/css"!=e.type&&"stylesheet"!=e.rel||!e.href||new URL(e.href,document.baseURI).origin==location.origin&&fetch(e.getAttribute("href")).then((async t=>{const i=await t.text();let n=Pt.transpileStyleSheet(i,!0);if(n=Pt.transpileStyleSheet(i,!1),n!=i){const t=new Blob([n],{type:"text/css"}),i=URL.createObjectURL(t);e.setAttribute("href",i)}}))}
    Ответ написан
    4 комментария
  • Как организовать пополнение бонусов в пользовательское свойство?

    @koder_1
    Битрикс программист
    Циклом по файлу bonus.csv (обычные функции php работы с файлами)
    берём в очередной строке телефон, по нему берём пользователя (апи Битрикс CUser::GetList)
    и его бонусы (апи Битрикс CSaleUserAccount::GetByID).
    Обновляем бонусы как Вам нужно CSaleUserAccount::UpdateAccount
    Ответ написан
    Комментировать
  • Wordpress выдает такую ошибку, как её решить?

    @maksam07
    А вопрос то в чем?
    PHP сообщает об отсутствии модуля mysqli. Дальше уже обращайтесь за документацией к вашему ПО, чтобы узнать, как его включить/установить

    Некоторые решения:
    https://stackoverflow.com/questions/51624555/mysql...
    https://stackoverflow.com/questions/71702104/how-t...
    https://www.reddit.com/r/PHPhelp/comments/16mtjan/...
    Ответ написан
    Комментировать
  • Как "просканировать" сайт на картинки в директории?

    @alexalexes
    В самом примитивном случае задача будет решаться так (это псевдокод, он пародирует язык программирования, передает лишь идею):
    a = [алфавит 0-9a-zA-Z]
    foreach(i => index_a_0 ... index_a_last )
       foreach( j => index_a_0 ... index_a_last )
          foreach( k => index_a_0 ... index_a_last)
          ...
         {
              filename = a[i] + a[j] + ... a[m] + '.jpg'
              result = [функция получения HTTP заголовков по url, метод HEAD](filename)
              if(result.responseCode = 200) // Если HTTP код 200, то файл существует
              {
                // загружаем файл
              }
              // пишем в лог файл, какие i,j,k...m прошли
         }

    Если у вас пинг будет в пределах 100 мс, то все комбинации процесс в одном потоке обойдет за 2 месяца.
    Ответ написан
    Комментировать