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

    nokimaro
    @nokimaro Куратор тега PHP
    Возможно Вам хватит этого

    $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
    Ответ написан
  • Есть ли возможность у cURL на PHP кешировать запросы?

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

    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
    Ответ написан
  • Как отсортировать свойства в объекте в порядке убывания?

    locky_yotun
    @locky_yotun Куратор тега JavaScript
    Я видел некоторый джаваскрипт
    Это объект, его нельзя отсортировать. Можно получить массив пар ключ-значение этого объекта — и отсортировать его. Ну и полученный массив можно преобразовать в Map, если нужно:
    Object.entries(obj).sort((_a, _b) => {
      const a = _a[1] + _a[0];
      const b = _b[1] + _b[0];
      return a > b ? -1 : (a < b ? 1 : 0);
    }).reduce((acc, el) => acc.set(...el), new Map);
    Ответ написан
  • Как переписать данный jquery код на чистый js?

    @lloydbanks
    Я не прошу никого полностью переписывать плагин с нуля

    Да тут особо нечего переписывать
    https://jsfiddle.net/lloydbanks/k47reuw8/
    Ответ написан
  • Отличия webpack и gulp?

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

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

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

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

    Andrew_Pinkerton
    @Andrew_Pinkerton
    Backend-разработчик
    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
    Из здесь обсуждавшихся самый простой способ обломить ботов - скрытое поле, в которое скрипт на странице вводит длину сообщения перед отправкой. При заполнении ботами оно будет либо отсутствовать, либо пустовать.
    Капча - не помогает. Рекапча - здорово мешает пользователям, сидящим на загруженных каналах (мобильных, например). Угадывание витрин и лестниц на мутных фотках... так ли им нужен ваш сайт?
    Ответ написан
  • Как передать значения цикла в базу?

    @FODD
    Вопрос в стиле "сделайте тестовое задание за меня, а то я провалю испытательный срок".
    JS код будет выглядеть примерно так:
    https://codepen.io/anon/pen/vwavKb
    PHP обработчик:
    https://pastebin.com/VyREaXec
    P.S. Это пример, не вставляйте в SQL данные от пользователей без обработки
    Ответ написан
  • Как остановить 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)); 
            }
        }
    });
    Ответ написан
  • Как правильно генерировать разметку?

    john36allTa
    @john36allTa
    That`s calling Walker
    Что плохого писать в native?
    let title = document.createElement('div');
    title.id  = "title";
    title.innerHTML = 'Lorem ipsum dollar sit amet.';
    Object.assign(title.style, {
              backgroundColor: 'black',
              color: 'white',
              display: 'none'
         });
    let link = document.createElement('a');
    link.href = '#';
    link.innerHTML = "Показать/скрыть элемент";
    document.appendChild(title);
    document.appendChild(link);
    link.onclick = function(){ title.style.display = title.style.display == 'none' ? 'block' : 'none'}

    Преимущества в том, что Вы динамически генерите контент с клиентской стороны при этом можете не делать геттеров к DOM (если элемент создан в скрипте). Например для UI можно определить в html части только контейнер, а кнопки и прочее создавать динамически.
    Библиотеки построены на том же native, но в ней много не нужного хлама. Зато оптимизировано и пишется на лету.
    Ответ написан
  • Как полностью написать сайт с нуля, если ты знаешь только frontend?

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

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

    Много вопросов гуглится в том числе на StackOverflow. Для начинания, как мне кажется, очень хорошая cms. Локально тоже разворачивается без проблем, если появится такая необходимость.
    Ответ написан
  • Как заменить все слова "Привет", "Ок" на "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;
    Ответ написан
  • Нормально ли так проверять авторизацию?

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

    Одной из ключевых задач ООП является абстракция, что требует декомпозиции кода. Следовательно, первым шагом для причёсывания кода будет:
    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) и т.д.
    Ответ написан
  • Как сделать чтобы в input можно было вводить только цифры кратные 100?

    0xD34F
    @0xD34F Куратор тега JavaScript
    document.querySelector('input').oninput = function() {
      let val = parseInt(this.value) || 0;
      while (val % 100) {
        val *= 10;
      }
      this.value = val;
    };
    Ответ написан