Задать вопрос
  • Как построить SQL запрос, чтобы вывести один результат из прошедших дат, и несколько из будущих?

    0xD34F
    @0xD34F
    SELECT `date`
    FROM `foo`
    WHERE `id` >= (
      SELECT `id`
      FROM `foo`
      WHERE `date` < now()
      ORDER BY `id` DESC
      LIMIT 1
    )

    Это конечно в предположении, что даты расположены последовательно. Если нет - то можно, например, отдельно выбрать последнюю прошедшую и отдельно все будущие и объединить их union'ом.
    Ответ написан
    1 комментарий
  • Как сделать выборку в MySQL фильтрации значений, идущих подряд?

    0xD34F
    @0xD34F
    Можно так:

    SELECT t2.s1
    FROM (
      SELECT
        t1.id,
        t1.s1,
        IF (@max = 1, @max := t1.seq, @max := @max) AS "max1",
        IF (t1.seq = 1, @max := 1, @max := @max) AS "max2"
      FROM (
        SELECT
          (SELECT @id := @id + 1) AS "id",
          s1,
          IF (s1 = @prev + 1, @seq := @seq + 1, @seq := 1) AS "seq",
          (SELECT @prev := s1) AS "prev"
        FROM `table`,
        (SELECT @id := 0, @seq := 0, @prev := null) AS init
      ) AS t1,
      (SELECT @max := 1) AS init
      ORDER BY t1.id DESC
    ) AS t2
    WHERE t2.max1 >= 3
    ORDER BY t2.id

    Ещё можно добавить в таблицу дополнительный столбец, в котором будет храниться количество записей, принадлежащих к текущей серии последовательных значений и заполнять/обновлять его в триггере, при вставке новых записей в таблицу. Тогда таблица будет выглядеть как-то так:

    s1 | n
     1   3
     2   3
     3   3
     7   1
    12   1
    22   2
    23   2
     5   4
     6   4
     7   4
     8   4

    А получение нужных записей будет совсем тривиальным:

    SELECT s1 FROM `table` WHERE n > 2
    Ответ написан
    Комментировать
  • Как ускорить анимацию чисел в зависимости от числа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Можно задавать шаг отдельно для каждого счётчика, так же, как и максимальное значение - в атрибуте:

    <div data-num="2350" data-step="5" class="number">0</div>

    $(window).scroll(function() {
      var $win = $(window);
    
      if ($('#counter').offset().top < $win.scrollTop() + 200) {
        $win.off('scroll');
    
        $('.number').addClass('viz').each(function() {
          var
            i = 0,
            num = +this.dataset.num,
            timeStep = 1000 / num,
            valStep = +this.dataset.step || 1,
            interval = setInterval(function($el) {
              if ((i += valStep) >= num) {
                clearInterval(interval);
              }
    
              $el.html(Math.min(i, num));
            }, timeStep, $(this));
        });
      }
    });

    Или вычислять шаг:

    var steps = 100;
    
    $(window).scroll(function() {
      var $win = $(window);
    
      if ($('#counter').offset().top < $win.scrollTop() + 200) {
        $win.off('scroll');
    
        $('.number').addClass('viz').each(function() {
          var
            i = 0,
            num = +this.dataset.num,
            valStep = num / steps,
            interval = setInterval(function($el) {
              if ((i += valStep) >= num) {
                clearInterval(interval);
              }
    
              $el.html(Math.floor(Math.min(i, num)));
            }, 20, $(this));
        });
      }
    });
    Ответ написан
    1 комментарий
  • JavaScript: почему не срабатывает скрипт?

    0xD34F
    @0xD34F Куратор тега JavaScript
    • Метод querySelectorAll возвращает коллекцию элементов, никакого addEventListener у неё нет - его надо вызывать отдельно у каждого элемента.
    • Что ещё за e.classList? e - это объект события, а не элемент DOM-дерева.
    • Класс добавляете, OK - а где же удаление? Вряд ли вам нужно, чтобы элементы могли иметь оба класса одновременно.

    Насколько я понял, вам нужно нечто такое:

    const elems = document.querySelectorAll('nav#menu_3 > ul > li');
    
    elems.forEach(n => n.addEventListener('mouseover', onMouseover));
    
    function onMouseover() {
      elems.forEach(n => {
        n.classList.toggle('zoomed', this === n);
        n.classList.toggle('nozoomed', this !== n);
      });
    }
    Ответ написан
  • Сложный запрос mysql в node.js?

    0xD34F
    @0xD34F
    Ваш запрос после подстановки значений выглядит как-то так:

    INSERT INTO Items SET `itemid` = 'SELECT MAX(`itemid`) FROM `Items`', ...

    То есть, код запроса для получения значения itemid оказывается взят в кавычки - никакого запроса не происходит, в itemid пишется строка. Что, по-видимому, является причиной ошибки - itemid, это ведь число, да? Как сделать вставку sql кода в запрос из переменной я сам без понятия, и вообще не уверен, что такое можно сделать.

    Кроме того, есть и другая проблема. Если вы попробуете вручную выполнить ваш запрос (через phpmyadmin или ещё как), то получите сообщение о синтаксической ошибке - получение значения itemid следует окружить круглыми скобками:

    (SELECT MAX(`itemid`) FROM `Items`)

    Ладно, поставили скобки. Теперь-то всё хорошо? Никак нет - получаем ошибку "You can't specify target table 'Items' for update in FROM clause". Корректная вставка в таблицу с получением данных из этой же таблицы будет выглядеть примерно так:

    INSERT INTO Items(itemid, title, type)
    SELECT MAX(itemid), <значение для title>, <значение для type> FROM Items

    В общем, попробуйте что-нибудь вроде этого:

    connection.query('INSERT INTO Items(itemid, title, type) SELECT MAX(itemid), ?, ? FROM Items', [ data.title, data.group ])
    Ответ написан
  • Открытие блоков независимо друг от друга??

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кнопкам дать общий класс, а для понимания, какая кого должна открывать, добавить data-атрибут, содержащий соответствующий селектор; Спискам, видимость которых надо переключать, тоже дать общий класс:

    <a href="#" class="menu-trigger" data-list="#menu">Menu</a>
    <a href="#" class="menu-trigger" data-list="#contacts">Contacts</a>
    <ul id="menu" class="list">...</ul>
    <ul id="contacts" class="list">...</ul>

    При нажатии на кнопку прячете все списки, кроме связанного с нажатой кнопкой - его состояние изменяете на противоположное:

    $('.menu-trigger').click(function() {
      var list = this.dataset.list;
    
      $(this).parent().find('.list').not(list).slideUp(0);
      $(list).slideToggle(500);
    });
    
    $(window).resize(function() {
      if ($(window).width() > 500) {
        $('.list').removeAttr('style');
      }
    });

    https://jsfiddle.net/nvgpfm7j/
    Ответ написан
    Комментировать
  • Как достать ключи и значения из многомерного массива?

    0xD34F
    @0xD34F
    думал через Foreach в foreach, но не пашет

    Это как? Отлично всё пашет:

    foreach ($arr as $val) {
      foreach ($val['items'] as $item) {
        // хватаем item_code, например: $item['item_code']
      }
    }
    Ответ написан
    1 комментарий
  • Как по клику добавлять класс следующим 4 элементам??

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('селектор кнопки').click(function() {
      $('селектор-элементов')
        .not('.класс')
        .slice(0, количествоЭлементовКоторымНадоДобавитьКласс)
        .addClass('класс');
    });

    или

    const items = [...document.querySelectorAll('селектор элементов')];
    
    document.querySelector('селектор кнопки').addEventListener('click', () => {
      items
        .splice(0, количествоЭлементовКоторымНадоДобавитьКласс)
        .forEach(n => n.classList.add('класс'));
    });
    Ответ написан
    Комментировать
  • Как получить элемент innerText внутри дочернего объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    пытался получить так:
    console.log($('.wall_post_text', this)).innerText;
    Но пишет undefined

    Во-первых, опечатка - .innerText надо внутри внешних скобок было разместить, а так вы у результата вызова console.log хотите свойство прочитать (и получаете вы никакой не undefined, а ошибку "cannot read properties of undefined").

    Во-вторых, значение свойства innerText надо получать у DOM-элемента, а не jquery объекта. Ну или замените обращение к свойству на вызов метода.

    Исправляем:

    $('.wall_post_text', this)[0].innerText
    // или
    $('.wall_post_text', this).get(0).innerText
    // или
    $('.wall_post_text', this).prop('innerText')
    // или
    $('.wall_post_text', this).eq(0).text()
    // или
    $('.wall_post_text:eq(0)', this).text()
    // или, если элемент .wall_post_text внутри this один
    $('.wall_post_text', this).text()
    Ответ написан
    1 комментарий
  • JQuery и post запрос?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вместо return json_encode($result) наверное должно быть что-то вроде echo json_encode($result). Также непонятно, почему никак не обрабатывается ситуация, когда name и email отсутствуют.

    Ещё неплохо бы добавить header('Content-Type: application/json');. Всё-таки json возвращаете.

    Удалить ?> тоже не помешает - чтобы случайно не добавлять пробелы/пустые строки в ответ.

    В ajax.js dataType: "html" было бы неплохо заменить на dataType: "json" - по получении ответа не придётся вызывать parseJSON, response будет объектом.
    Ответ написан
    6 комментариев
  • Почему возвращает window?

    0xD34F
    @0xD34F Куратор тега JavaScript
    в чем тут логика?

    Да ни в чём. Один из подводных камней языка. Типа, значение this должно всегда быть объектом, а для null/undefined, в отличие от строк/чисел/bool нет объектных обёрток, поэтому вот такой костыль. В строгом режиме работает как надо:

    (function() {
      'use strict';
      var func = function() { console.log(this); };
      func.call(null); // выведет null
    })();
    Ответ написан
    Комментировать
  • Как достать значение объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    var
      path = 'aaa.bbb.ccc.ddd',
      data = {
        aaa: {
          bbb: {
            ccc: {
              ddd: 'Hello!!'
            }
          }
        }
      };
    
    console.log(path.split('.').reduce((p, c) => p[c], data)); // Hello!!
    Ответ написан
    2 комментария
  • Как сделать регулярное выражение для валидации номера дома?

    0xD34F
    @0xD34F Куратор тега Регулярные выражения
    Как-нибудь так, например: /^[1-9][0-9]*([a-z]|[а-я]|(\/[1-9][0-9]*))?$/i
    Ответ написан
    Комментировать
  • Как правильно настроить Legend для chart.js?

    0xD34F
    @0xD34F
    У labels нет свойства position, оно относится к legend. То есть, должно быть так:

    legend: {
      position: 'bottom',
      labels: {
        fontColor: 'black',
        fontFamily: 'Calibri Light',
        fontStyle: 'italic'
      }
    }

    То же касается и свойства display.
    Ответ написан
    Комментировать
  • Как сделать плавно переходящий полу-прозрачный фон?

    0xD34F
    @0xD34F Куратор тега CSS
    Градиент от прозрачного к < имя цвета > и обратно к прозрачному, например:

    background: linear-gradient(to right, transparent 10%, red 30%, red 70%, transparent 90%);
    Ответ написан
    3 комментария
  • Как правильно работать с графиками?

    0xD34F
    @0xD34F
    Добавьте данные за август - labels у вас 8 штук, а в data всего лишь семь элементов.
    Ответ написан
    Комментировать
  • Метод .splice() портит оригинальный массив. Как этого избежать?

    0xD34F
    @0xD34F Куратор тега JavaScript
    При присваивании копируется ссылка на массив, а не сам массив. Чтобы скопировать массив, есть варианты:

    var copy = arr.slice();

    var copy = arr.concat();

    var copy = [...arr];

    var copy = Array.from(arr);
    Ответ написан
    Комментировать
  • Что пошло не так(простая задача)?

    0xD34F
    @0xD34F Куратор тега JavaScript
    При первом вычислении newFib принимает значение 3 (2 + 1, ага), затем проверка остатка от деления на 2 на равенство единице оказывается истинной и происходит переход к следующей итерации цикла. Снова вычисляется newFib - на основе тех же значений, 2 + 1, снова остаток от деления равен единице - идём на следующий круг и так далее.

    Это к вопросу о том, почему цикл не останавливается. А вообще - "пошло не так" у вас в тот момент, когда появилась вот эта безумная конструкция из while(true), break'а в конце тела цикла и continue-костыля, заставляющего цикл работать как цикл.
    Ответ написан
    Комментировать
  • Странное поведение mysql при update для нескольких условиях в set. Так и должно быть?

    0xD34F
    @0xD34F
    Говорят, что так и должно быть. В MySQL. Что вообще говоря, является нестандартным поведением.

    The second assignment in the following statement sets col2 to the current (updated) col1 value, not the original col1 value. The result is that col1 and col2 have the same value. This behavior differs from standard SQL.

    UPDATE t1 SET col1 = col1 + 1, col2 = col1;
    Ответ написан
    Комментировать