Задать вопрос
  • Как выровнять текст и картинку внутри ссылки?

    coubwebdev
    @coubwebdev
    .header__link a{
    display: flex;
    align-items: center;
    gap: 10px;
    }

    .header__link img {
    width: 100px;
    height: 100px;
    }

    .header__link span {
    font-family: 'Poppins', serif;
    font-size: 17px;
    color: rgb(104, 109, 119);
    font-weight: 500;
    }

    у вас флекс был на header__link, а не на кнопку
    Ответ написан
    Комментировать
  • Могу ли я прогнать через password_hash пароли в бд, которые md5, чтобы не сломалась авторизация?

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

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

    2 этап
    Когда число поменянных хешей примерно будет равно числу активных пользователей за определенный период, то в патче запрещаете пользоваться старым хешем для проверки паролей, отправляете пользователя принудительно восстанавливать пароль по другим учетным данным, например, по эл. почте.
    При восстановлении доступа пароль хешировать новой функцией.
    Все, с этого момента можно избавиться от логики использования старого хеша.
    Ответ написан
    Комментировать
  • Как сохранить данные на сайте html+css в файл txt?

    @rPman
    Без скриптов никак, потому что html+css это только способ описания внешнего вида (и очень немного анимации), при этом это только браузерный фронтэнд - то что работает у пользователя. На этой стороне даже со скриптами файл не сохранить (можно сформировать сам файл и выдать запрос на загрузку файла, но не контролировать куда)

    С другой стороны html forms (теги form и input/textarea) и простейший скрипт из пары строчек на сервере, позволят решить эту задачу
    <!DOCTYPE html>
    <html>
    <head>
        <title>Форма</title>
    </head>
    <body>
        <form action="save.php" method="post">
            <input type="text" name="data" placeholder="Введите данные" required>
            <button type="submit">Отправить</button>
        </form>
    </body>
    </html>

    <?php
    file_put_contents('data.txt', $_POST['data']);
    echo "Данные сохранены!";
    ?>

    Само собой тут никаких защит, атворизаций и прочего
    Ответ написан
    Комментировать
  • Как сохранить данные на сайте html+css в файл txt?

    @RafGal
    подаешь на вход имя файла и текст
    let export_text_file = function(имя_файла, текстовое_содержимое){ var blob = new Blob([текстовое_содержимое], { type: "text/plain" }); function download(blob,filename){ if(typeof blob == "object"){ if(window.navigator.msSaveBlob) {return window.navigator.msSaveBlob(blob,filename);} blob=window.URL.createObjectURL(blob); } var s=document.createElement("a");  s.href=blob; s.download=filename; document.body.appendChild(s); s.click(); setTimeout(function(){ window.URL.revokeObjectURL(blob); document.body.removeChild(s); s.remove(); }, 300); } download(blob, имя_файла); }
    Ответ написан
    Комментировать
  • Как сохранить данные на сайте html+css в файл txt?

    Если ваша задача - просто и относительно безопасно сохранить данные, которые пользователи вводят на вашем сайте, не поднимая самостоятельно никакого сервера, то рассмотрите какой-то сервис, который может принимать формы. Например:

    - Яндекс Формы. Вы там в конструкторе создаёте форму, получаете код для вставки на сайт, и ваш сайт теперь магически умеет принимать данные от посетителей. По-моенму, просто, быстро, и неплохо. Вы можете сохранить данные в виде эксель-таблички, сохранить в яндекс-облако и т.д.

    - Formspree или Formcarry Тут еще проще, но больше 50 заполнений в месяц платно.

    - Ну а можно сильно заморочиться и сделать заполнение гугл-таблиц в гугл-докс результатами своей формы. Но тут надо написать обработчик формы на их языке Google Apps Script, опубликовать у них это в виде веб-приложения, и настроить свою форму на адрес этого веб-приложения. Данные будут сохраняться в ту гугл-таблицу, которую вы выбрали в этом скрипте.
    Ответ написан
    Комментировать
  • Может ли браузер дублировать 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.
    Ответ написан
    Комментировать