Задать вопрос
  • Запись условия if в переменную?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Возможно Вам хватит этого

    $if = (0.5 < 0.6); //true
    if ($if) {
        echo 'YES';
    } else {
        echo 'NO';
    }


    Внимание, прежде чем использовать eval() в своём коде внимательно изучите документацию по этой функции https://www.php.net/manual/ru/function.eval.php

    Особенно обратите внимание на это предупреждение
    Предостережение
    Языковая конструкция eval() может быть очень опасной, поскольку позволяет выполнить произвольный код. Использование данной функции не рекомендуется. Если вы полностью убеждены, что нет другого способа, кроме использования этой конструкции, обратите особое внимание на то, чтобы не передавать какие-либо данные, предоставленые пользователем, без предварительной проверки.

    Автор данного ответа не несёт ответственности за простреленные ноги.

    Через eval()
    <?php
    $if = eval('return 0.5 < 0.6;');
    var_dump($if); //true
    
    eval('$if = 0.5 < 0.6;');
    var_dump($if); //true
    Ответ написан
    1 комментарий
  • Есть ли возможность у cURL на PHP кешировать запросы?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    В самом cURL такой функциональности нет, но можно без проблем добавить её самому.
    Кешировать результаты запроса можно в любое удобное хранилище: файлы, memcached, APCu, любая БД.
    Ответ написан
    1 комментарий
  • Почему столкновение работает неправильно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Проблема в этой строке:
    collision(enemy[i].x,enemy[i].y,player[j].x,player[j].y,32,32,32,32,player.splice(j,1),enemy.splice(i,1));
    В функцию передаётся не действие, которое надо выполнить в случае — а его результат. Вот эти
    player.splice(j,1)
    enemy.splice(i,1)
    выполняются сразу, при первом же обращении — и не останется ни игроков ни врагов. Ядерная зима.

    Чтобы не выполнять их сразу же, оберните эти действия в функцию и передавайте функцию в collision(), чтобы там её вызвали только после проверки условий.

    Ещё можно не передавать сотню параметров, а договориться, что у объектов игроков и врагов всегда будут свойства
    x, y, w, h. Так можно передавать сами объекты целиком:
    function collision(A, B, onCollision) {
      if (
        A.x + A.w >= B.x 
        && A.x <= B.x + B.w
        && A.y + A.h >= B.y
        && A.y <= B.y + B.h
      ) { 
        onCollision(); // <-- только тут выполнятся действия
      }
    }
    
    // ...
    player.push({x: 0, y: 0, w: 32, h: 32});
    enemy.push({x: 144, y: 104, w: 32, h: 32});
    // ...
    collision(
      enemy[i],
      player[j],
      function() {
        player.splice(j,1);
        enemy.splice(i,1);
      }
    );

    Рабочий jsFiddle
    Ответ написан
    9 комментариев
  • Отличия webpack и gulp?

    Обычно gulp используют для сборки верстки, а webpack для сборки js приложений.
    Иногда они нужны оба.
    Ответ написан
    1 комментарий
  • Как работает try/catch?

    @Karpion
    Универсального признака нет, там бывают разные ошибки. Например, "деление на ноль", "синус от слишком большого числа (когда шаг дискретности числа больше, чем период синуса)" и другие варианты; правда, отсутствуют многие ошибки, свойственные компилируемым языкам программирования, типа "выход за границу массива".

    А вот ошибки типа "программа попыталась открыть несуществующй или запретный для неё файл" - я так понимаю, catch не вызывают - такие операции просто возвращают код неудачного завершения, и их надо обрабатывать в основном потоке.

    В первом приближении можно сказать примерно так: переход к catch возникает в случае, когда без catch программа должна вывалиться с сообщением "программа совершила недопустимую операцию", как-то так.
    Это не точное соответствие, а пояснение для первичного понимания.
    Ответ написан
    Комментировать
  • Как сделать плавное движение танка?

    deepblack
    @deepblack
    jsfiddle.net/loktar/dMYvG

    spoiler
    var canvas = document.getElementById("canvas"),
        ctx = canvas.getContext("2d");
    
    canvas.width = canvas.height = 300;
    
    var x = 150,
        y = 150,
        velY = 0,
        velX = 0,
        speed = 2,
        friction = 0.98,
        keys = [];
    
    function update() {
        requestAnimationFrame(update);
        
        if (keys[38]) {
            if (velY > -speed) {
                velY--;
            }
        }
        
        if (keys[40]) {
            if (velY < speed) {
                velY++;
            }
        }
        if (keys[39]) {
            if (velX < speed) {
                velX++;
            }
        }
        if (keys[37]) {
            if (velX > -speed) {
                velX--;
            }
        }
    
        velY *= friction;
        y += velY;
        velX *= friction;
        x += velX;
    
        if (x >= 295) {
            x = 295;
        } else if (x <= 5) {
            x = 5;
        }
    
        if (y > 295) {
            y = 295;
        } else if (y <= 5) {
            y = 5;
        }
    
        ctx.clearRect(0, 0, 300, 300);
        ctx.beginPath();
        ctx.arc(x, y, 5, 0, Math.PI * 2);
        ctx.fill();
    }
    
    update();
    
    document.body.addEventListener("keydown", function (e) {
        keys[e.keyCode] = true;
    });
    document.body.addEventListener("keyup", function (e) {
        keys[e.keyCode] = false;
    });
    Ответ написан
    Комментировать
  • Как защитить форму обратной связи от атак?

    Adamos
    @Adamos
    Из здесь обсуждавшихся самый простой способ обломить ботов - скрытое поле, в которое скрипт на странице вводит длину сообщения перед отправкой. При заполнении ботами оно будет либо отсутствовать, либо пустовать.
    Капча - не помогает. Рекапча - здорово мешает пользователям, сидящим на загруженных каналах (мобильных, например). Угадывание витрин и лестниц на мутных фотках... так ли им нужен ваш сайт?
    Ответ написан
    1 комментарий
  • Как остановить setTimeout?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вам нужно четыре разных таймера, то есть их идентификаторы нужно записывать в разные переменные. А в секции after, соответственно, четыре раза подряд вызвать clearTimeout()
    //например
    var timerInSlider1, timerInSlider2, timerInSlider3, timerInSlider4;

    Вообще, по-хорошему, лучше сделать небольшой цикл, так будет красивее и правильнее с точки зрения повторного использования кода.
    Как-то так:
    //Минимальные изменения вашего кода
    var timerInSlider = [1,2,3,4]; //массив для четырёх таймеров
    
    $.scrollify({
        section: ".section",
        scrollbars: true,
        interstitialSection: ".non-full-height",
        overflowScroll: true,
        before: function(indexBigSlider, sections){
            if(indexBigSlider == 2) timerInSlider.forEach((e,i) => { //цикл
    
                timerInSlider[i] = setTimeout(function(){
                    $(".fullwidth-slider").trigger('owl.next');
                    console.log((i+1)+" итерация");
                }, 12000 * (i+1)); //время зависит от номера таймера
    
                //остальной код убрали
            });
        },
        after: function(indexBigSlider, sections){
            if(indexBigSlider == 3){
                console.log("След слайдер");
                //также в цикле убираем
                timerInSlider.forEach(e=>clearTimeout(e)); 
            }
        }
    });
    Ответ написан
    Комментировать
  • Как полностью написать сайт с нуля, если ты знаешь только frontend?

    Benderburg
    @Benderburg
    Веб-разработчик
    Достаточно купить виртуальный хостинг.
    Большинство популярных хостеров предлагают установку cms в один клик или вообще с предустановленной cms.

    Я бы предложил посмотреть в сторону Wordpress очень много документации на русском (на английском и подавно).
    После установки получите готовый рабочий сайт. Дальше можно играться с плагинами, а можно начинать выковыривать ему мозги:
    - тренироваться в дизайне: прописывать стили, менять имеющиеся
    - смотреть функции php в бэкенде, писать плагины, добавлять функционал

    Много вопросов гуглится в том числе на StackOverflow. Для начинания, как мне кажется, очень хорошая cms. Локально тоже разворачивается без проблем, если появится такая необходимость.
    Ответ написан
    1 комментарий
  • Как заменить все слова "Привет", "Ок" на "Hello", "Ok"?

    megafax
    @megafax
    web-программист
    preg_replace_callback("~\b(Привет|Ок)\b~ius", function($match) {
        return mb_strtolower($match[1]) == 'привет' ? 'Hello': 'Ok';
    }, $str);
    Ответ написан
    Комментировать
  • Как правильно хранить время в бд?

    usdglander
    @usdglander
    Yipee-ki-yay
    list($hours, $minutes) = explode(':', $time);
    $timeToDb = $hours * 60 * 60 + $minutes * 60;
    Ответ написан
    3 комментария
  • Нормально ли так проверять авторизацию?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Всё печально. Давай по-порядку:

    Одной из ключевых задач ООП является абстракция, что требует декомпозиции кода. Следовательно, первым шагом для причёсывания кода будет:
    class Worker extends User // <- Не стоит забывать о PSR
    {
        public function __construct(array $data)
        {
            if (empty($data)) {
                header(....);
                exit;
            }
    
            // В конструкторе нет ретурна, так что это ошибка
        }
    }


    Шаг 1 Результат: Мы отвязались от кукисов и можем эту же логику переиспользовать вообще с чем угодно.

    Теперь мы больше не связаны с окружением (ещё header надо убрать) и имеем код, позволяющий переиспользовать себя в различных ситуациях:
    $worker = new Worker($_COOKIE);

    Ну и так далее.

    При этом есть фатальные косяки (отвечая на твой вопрос "Нормально ли так проверять авторизацию"): Что если я возьму, открою консоль в браузере и заменю кукис id=1 на id=42?

    Решаем эту проблему:
    $worker = new Worker($_SESSION);

    Вот и пригодились все "улучшения", которые мы произвели ранее. Для решения проблемы нам понадобилось лишь заменить источник данных (т.е. массив) из кукисов на сессии. Этот процесс передачи данных извне называется "делегированием".

    Помимо этого - сам процесс входа в систему называется "аутентификацией", а не "авторизацией". Авторизация - это процесс проверки прав доступа к какому-то функционалу.

    Результат не идеален и содержит ещё кучку проблем, но с фатальными мы вроде разобрались.

    Твоя задача далее, разу уж ты поставил тег "ООП" - смотреть на код, который ты написал и попробовать его перенести в другие условия. Если он там уже работать не будет без изменений его внутренностей - значит в коде есть набор косяков. Пример:
    1) Можно ли использовать твой код, получая данные не из БД, а из файлов?
    2) Можно ли создать нового "рабочего" не передавая туда ID, чтобы он сгенерировался сам на основе, например, auto increment поля в БД?
    3) Можно ли добавить условия в запрос к БД (например, что "рабочий" не забанен)?
    4) и т.д.
    Ответ написан
    7 комментариев
  • Как сделать чтобы в input можно было вводить только цифры кратные 100?

    0xD34F
    @0xD34F Куратор тега JavaScript
    О каком input'е идёт речь, и чему должно быть кратно его значение:

    const input = document.querySelector('input');
    const num = 100;

    Можно исправлять вводимые значения:

    input.addEventListener('change', function() {
      this.value = (this.value / num | 0) * num;
    });

    Или не давать вводить неправильные - блокируем ввод в инпут (атрибут readonly), изменение значения осуществляем с помощью кнопок:

    <button data-step="-1">-</button>
    <button data-step="+1">+</button>

    document.querySelectorAll('[data-step]').forEach(function(n) {
      n.addEventListener('click', this);
    }, e => input.value = +input.value + e.target.dataset.step * num);
    Ответ написан
    Комментировать