• Можно ли в запросе mysql сделать Group_concat в group concat?

    erge
    @erge
    Примус починяю
    Строчку 'valueDstidArr',r(CONCAT(`value_src`.id),`value_dst`.value) - concat заменить на group_concat не получается пишет что синтаксическая ошибка.


    и правильно пишет.
    почитайте внимательнее про group_concat
    что вы и как собрались конкатенировать??

    по данной строчке - r(CONCAT(`value_src`.id),`value_dst`.value)
    1 - что есть r?
    2- CONCAT(`value_src`.id) c чем кокатенируете??

    поэтому здесь не очень понятно что вы хотите загнать в GROUP_CONCAT

    И если вы хотите сделать допустим GROUP_CONCAT (`value_src`.id) непонятно зачем у вас GROUP_CONCAT охватывает гораздо шире...???

    GROUP_CONCAT(DISTINCT  JSON_OBJECT(
        'value', `value_dst`.value,
        'param_dst_id', `value_dst`.param_dst_id,
        'type',param_type_id(`value_dst`.param_dst_id),
        'ref_id',ref_id(`value_dst`.param_dst_id),
        'title',param_title(`value_dst`.param_dst_id),
        'valueDstidArr',r(CONCAT(`value_src`.id),`value_dst`.value)
          )) AS `realValuesArr2`


    Нужно делать GROUP_CONCAT того чего нужно... а не всего подряд и внутрь пытаться запихать еще один GROUP_CONCAT. GROUP_CONCAT объединяет несколько записей в одну, что он будет делать внутри другого GROUP_CONCAT, когда записи уже объединены?

    Так же, Имхо... все поля что находятся вне GROUP_CONCAT должны быть в GROUP BY !

    я думаю, что вместо вашего GROUP_CONCAT .. AS `realValuesArr2` должно быть как-то так:

    ...
    JSON_OBJECT(
        'value', `value_dst`.value,
        'param_dst_id', `value_dst`.param_dst_id,
        'type',param_type_id(`value_dst`.param_dst_id),
        'ref_id',ref_id(`value_dst`.param_dst_id),
        'title',param_title(`value_dst`.param_dst_id),
        'valueDstidArr', GROUP_CONCAT( r(`value_src`.id,`value_dst`.value) )
          ) AS `realValuesArr2`
    ...


    не знаю что За функция r() И CONCAT одного поля не нужен.

    а поля
    `value_dst`.value,
    `value_dst`.param_dst_id,
    должны быть в GROUP BY
    Ответ написан
    Комментировать
  • Как вывести данные на всех страницах кроме главной?

    erge
    @erge
    Примус починяю
    Страниц много, каждой добавлять параметр "isIndex:false" это вот интуитивно неверное решение.

    и почему же?

    а что мешает раздробить на несколько *.ejs ??
    и для корня - / рендерить index.ejs а для всех других рендерить all.ejs
    ??
    Ответ написан
    Комментировать
  • Кому отдать старые сервера и железо?

    erge
    @erge
    Примус починяю
    Если дарить и раздавать некому, то есть конторы по утилизации:
    утилизация компьютерного оборудования
    Ответ написан
    Комментировать
  • Как сделать импорт в js другой js в chrome extention?

    erge
    @erge
    Примус починяю
    Вы это читали?
    https://developer.chrome.com/extensions/content_sc...

    Declaratively injected scripts are registered in the manifest under the "content_scripts" field. They can include JavaScript files, CSS files or both. All auto-run content scripts must specify match patterns.

    {
    "name": "My extension",
    ...
    "content_scripts": [
    {
    "matches": ["http://*.nytimes.com/*"],
    "css": ["myStyles.css"],
    "js": ["contentScript.js"]
    }
    ],
    ...
    }


    js array of strings Optional. The list of JavaScript files to be injected into matching pages. These are injected in the order they appear in this array.

    тоже самое и с секцией background
    https://developer.chrome.com/extensions/background...

    {
    "name": "Awesome Test Extension",
    ...
    "background": {
    "scripts": [
    "backgroundContextMenus.js",
    "backgroundOmniBox.js",
    "backgroundOauth.js"
    ],
    "persistent": false
    },
    ...
    }

    PS: в popup они вставляются через тег script как в обычном HTML файле.
    Ответ написан
    Комментировать
  • Как запустить nodejs скрипт через PHP exec?

    erge
    @erge
    Примус починяю
    может лучше скрипт node.js оформить как микросервис?
    и из PHP общаться с ним по API (REST API)
    PS: закрыть извне доступ на порт микросервиса, либо прикрутить авторизацию.
    так же в таком случае основное приложение и микросервис можно разнести на разные сервера.
    Ответ написан
  • Готовые паззлы для сайта на html, css, js?

    erge
    @erge
    Примус починяю
    --> google --> скрипты пазлы на веб сайт и/или scripts puzzles website :

    jqPuzzle - в виде пятнашек на jQuery
    https://www.janko.at/Scripts/index.htm

    Поиск на codecanyon.net (ссылка почему-то блокируется, ну я думаю справитесь)

    и т.д.
    Ответ написан
  • Как вызывать функцию по времени которое указано в базе?

    erge
    @erge
    Примус починяю
    пользователь - пользователь программы?

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

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

    erge
    @erge
    Примус починяю
    Еще так можно:
    select 
      case
        when c1 = 0 then ''
        else rtrim(to_char (c1, 'FM9999999999999999D99'), '.')
      end result
    from newtable


    см. Data Type Formatting Functions
    Ответ написан
    Комментировать
  • Как по клику добавлять input и увеличивать id через jquery?

    erge
    @erge
    Примус починяю
    $(function(){
      $("button").click(function(){
        var lastInput = $('input[type="datetime-local"]:last');
        var type = lastInput.attr("type");
        var min = lastInput.attr("min") == undefined ? "" : lastInput.attr("min");
        var name = lastInput.attr("name");
        var num = parseInt(name.replace("date",""));
        if (num < 20) {
          $("#container").append('<input type="'+type+'" min="'+min+'" name="date'+(num+1)+'"/>');
        }
        if (num >= 19) {
        	$("button").hide();
        }
      })
    })


    Ответ написан
    2 комментария
  • Как считать данные из таблицы MySQL и внести их в массив с последующей записью?

    erge
    @erge
    Примус починяю
    Можно результат запроса обернуть в JSON форму, а в php к результату применить json_decode($result, true)

    SQL запрос:
    SELECT
        CONCAT(
          '{"',`session`,'":{',
          GROUP_CONCAT('"PRODUCT ', @i:=@i+1, '":{"PRODUCT ID":',product_id,',"PRICE":',price,',"QUANTITY":',quantity,'}' separator ','),
          '}}') AS value
      FROM carts, (SELECT @i:=0) X
      WHERE `session` = 222145
      GROUP BY `session`


    пример работы на sqlfiddle

    в PHP как-то так:
    $session_id = 222145;
    
    $sql = 'SELECT
        CONCAT(
          \'{"\',`session`,\'":{\',
          GROUP_CONCAT(\'"PRODUCT \', @i:=@i+1, \'":{"PRODUCT ID":\',product_id,\',"PRICE":\',price,\',"QUANTITY":\',quantity,\'}\' separator \',\'),
          \'}}\') AS value
      FROM carts, (SELECT @i:=0) X
      WHERE `session` = %s
      GROUP BY `session`';
    
    $arr = json_decode(mysql_result(mysql_query(sprintf($sql, $session_id)),0), true);
    
    var_dump( $arr );
    Ответ написан
    Комментировать
  • Как обработать и сравнить большой массив данных?

    erge
    @erge
    Примус починяю
    вариантов есть несколько....
    1) загружаете данные доступными вам способами во временную таблицу, далее UPDATE по этой таблице
    если из PHP, то собрать из массива запрос вида
    INSERT INTO tmp_goods (name, article, price)
      VALUES ('NAME_1', 'ARTICLE_1', PRICE 1),
    .......
             ('NAME_N', 'ARTICLE_N', PRICE_N)
    ;


    после чего выполнить UPDATE:
    UPDATE goods g
      INNER JOIN tmp_goods t ON t.article = g.article
      SET g.price = t.price
      WHERE g.price != t.price
    ;


    и очистить tmp_goods если она более не нужна.

    2) собрать из массива запрос вида:
    UPDATE goods
    SET price = CASE article
    WHEN ARTICLE_1 THEN PRICE_1
    WHEN ARTICLE_2 THEN PRICE_2
    ....
    ELSE price END


    так же есть операторы:
    REPLACE ,
    INSERT ON DUPLICATE KEY UPDATE
    и вообще погуглите - MySQL множественный апдейт

    и... еще вариант:
    можно обойтись без временной таблицы (как в варианте 1)...
    соберите из массива запрос вида:

    UPDATE goods g
      INNER JOIN (
        SELECT 'ARTICLE-1' AS article, PRICE_1 AS price UNION
        SELECT 'ARTICLE-2', PRICE_2 UNION
        SELECT 'ARTICLE-3', PRICE_3 UNION
    ...
        SELECT 'ARTICLE-N', PRICE_N
        ) t ON t.article = g.article
      SET g.price = t.price
      WHERE g.price != t.price
    ;


    смотрите пример на sqlfiddle (сосбтвенно update в левом поле описания схемы)
    Ответ написан
    Комментировать
  • Как изменять значение div по клику?

    erge
    @erge
    Примус починяю
    как-то так:

    document.querySelector("button").addEventListener("click", e => {
    	const items = document.querySelectorAll(".item");
      const first = items[0].textContent;
      [...items].map((el, i) => {
        el.textContent = (i < items.length - 1) ? items[i+1].textContent : first;
      });
    })


    допилите по вкусу, т.к. не понял
    Но когда показывается последний элемент, то смена контента должна прекратиться, аналогично и с первым.
    Ответ написан
    Комментировать
  • Как перенести часть строки в notepad ++?

    erge
    @erge
    Примус починяю
    Найти: ([A-ZА-ЯЁ][^A-ZА-ЯЁ]+)
    Заменить: $1\n
    включить - "Match case" и "Regular expression"
    см. рис. ниже:
    2VtED9xl.png

    PS: См. регулярный выражения notepad++
    Ответ написан
    Комментировать
  • Какой парсер использовать?

    erge
    @erge
    Примус починяю
    Все готовые решения в 99.(9)% платные.
    А такие:
    Нужно переносить контент, в идеале с автокоррекцией по заданному шаблону.

    Это скорее всего только заказные, т.е. пишутся под ваш сайт / магазин / движок.
    Тем более какой у вас движок, вы не объявили...

    готовых парсеров полно, ищутся через любой поисковик.
    например:
    Q-Parser
    ParserOK
    Datacol
    Сотбит: Парсер контента (вроде какую-то интеграцию умеет с 1C-Битрикс)

    на ютюбе полно роликов по настройке (поисковый запрос: настройка парсера)
    https://www.youtube.com/watch?v=IgkJNc-3Fxg&list=P...
    https://www.youtube.com/watch?v=AhTeWQzze_A
    https://www.youtube.com/watch?v=L_kw76nK27U

    и т.п. и т.д.

    большинство умеет парсить в csv / excel , открываете спарсенный файл в excel вводите формулу, растягиваете на все, сохраняете, импортируете (загружаете) на свой сайт.
    Ответ написан
    Комментировать
  • Вывод до первого совпадения SQL?

    erge
    @erge
    Примус починяю
    вроде как-то так, если правильно понимаю

    SELECT m.*, u.* FROM messages m
      INNER JOIN users u ON m.receiver = u.id
      INNER JOIN (
        SELECT receiver, sender, max(date) as date
          FROM messages
          GROUP BY receiver, sender
      ) m2 ON m.receiver = m2.receiver
          AND m.sender = m2.sender
          AND m.date = m2.date
      WHERE u.id = 1
      ORDER BY m.date DESC


    но не понятно зачем джойнится users на ресейвера, может все-таки на сендера? ведь в диалоге должны отображаться имена отправителей??

    SELECT m.*, u.* FROM messages m
      INNER JOIN users u ON m.sender = u.id
      INNER JOIN (
        SELECT receiver, sender, max(date) as date
          FROM messages
          GROUP BY receiver, sender
      ) m2 ON m.receiver = m2.receiver
          AND m.sender = m2.sender
          AND m.date = m2.date
      WHERE m.receiver = 1
      ORDER BY m.date DESC
    Ответ написан
  • Как на чистом js копировать html элемент со всеми его дочерними элементами?

    erge
    @erge
    Примус починяю
    такое мне кажется все делают по разному, что правильно выбираете сами.
    варианты:
    1. блок с работами имеет фиксированную высоту с overflow: hidden
    при нажатии на кнопку высота блока увеличивается, блок с кнопкой скрывается.
    можно это дело анимировать, ну чтоб плавно высота увеличивалась.
    2. блок с работами состоит из нескольких блоков, по умолчанию показывается первый, при нажатии на кнопку появляется второй блок (меняем ему display), блок с кнопкой скрывается.
    3. добавлять элементы скриптом, через .appendChild(childElement) например:
    document.querySelector(".works__more__btn").addEventListener("click", function() {
      var elem = document.createElement("div");
      elem.setAttribute("class", "works__content__smallRow");
      elem.innerHTML = `
                    <img src="https://www.placehold.it/375x327/25" class="works__content__smallRow__item">
                    <img src="https://www.placehold.it/375x327/50" class="works__content__smallRow__item">
                    <img src="https://www.placehold.it/375x327/75" class="works__content__smallRow__item">
                    <img src="https://www.placehold.it/375x327/100" class="works__content__smallRow__item">
    `;
      document.querySelector(".works__content").appendChild(elem);
      document.querySelector(".works__more").style.display = "none";
    });


    как-то так...

    UPD:
    собственно копирование:

    вы правильно сделали cloneNode, но!!!
    см. Метод Node.cloneNode()
    если вы хотите копировать с дочерними элементами, то необходимо передать параметр "deep" = true

    Т.е. вот так:
    document.querySelector(".works__more__btn").addEventListener("click", function() {
      document.querySelector(".works__content").appendChild(document.querySelector(".works__content").cloneNode(true));
      document.querySelector(".works__more").style.display = "none";
    });
    Ответ написан
    Комментировать
  • Почему не работает проверка при отправке формы?

    erge
    @erge
    Примус починяю
    Дело в том что у вас проверка email выполняется только в том случае если не выполняется условие по имени:
    if ($('#name').val().length >= 3) {
          $(this).find('#name').css("border", "1px solid rgb(169, 169, 169)");
      } else if ($('#email').val().length > 10 && $('#email').val().search(pattern) == 0) {
        $(this).find('#email').css("border", "1px solid rgb(169, 169, 169)");
      }


    else if

    надо без else, тогда оба условия будут проверяться независимо.
    if ($('#name').val().length >= 3) {
        $(this).find('#name').css("border", "1px solid rgb(169, 169, 169)");
    }
    if ($('#email').val().length > 10 && $('#email').val().search(pattern) == 0) {
        $(this).find('#email').css("border", "1px solid rgb(169, 169, 169)");
    }


    и т.д.
    Ответ написан
    5 комментариев
  • Как выводить в одном модальном окне данные из разных карточек товара по клику на кнопку?

    erge
    @erge
    Примус починяю
    Ну например переписывать содержимое карточки в модальное окно перед его отображением.
    как-то то так:
    btn.onclick = function() {
    modal.innerHTML = btn.innerHTML;
    modal.style.display = "flex";
    }
    Ответ написан
    Комментировать
  • Какую технологию выбрать для кроссплатформенной разработки мобильного приложения?

    erge
    @erge
    Примус починяю
    посмотрите:
    Стоит ли инвестировать во Flutter. Сравнение Flutt...
    Нативная разработка, React Native и Flutter: крите...
    Что такое Flutter? Почему все переходят с JavaScript

    и сделайте для себя выбор.

    кстати заметка на хабре полезна:
    для сложных приложений – рекомендуем нативную разработку;
    для простых приложений – гибридную.
    Ответ написан
    Комментировать
  • Как разделить настройки GITBash и CMDER?

    erge
    @erge
    Примус починяю
    либо определять среду запуска по какой-то переменной окружения если такие вообще есть.
    либо самостоятельно в CMDER (либо наоборот в PHPStorm) если есть такая возможность - перед запуском bash устанавливать переменную окружения.

    а в .bashrc проверять эту переменную по условию if и если есть переменная, то выполнять настройки для CMDER, если нет, то для PHPStorm

    как-то так...
    Ответ написан
    Комментировать