• Как обработать массивы?

    erge
    @erge
    Примус починяю
    const al   = "АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЫЬЭЮЯ "; // Алфавит
    let key1 = "ПЕРВЫЙ"; // первый ключ
    let key2 = "БУКВА"; // второй ключ
    let open_str = "ЭТО СТРОКА ОТКРЫТОГО ИСХОДНОГО ТЕКСТА"; // кодируемый текст
    
    // т.к. в алфавите нет букв Й и Ъ, то производим соответствующую замену:
    key1 = key1.replace("Й","И").replace("Ъ","Ь");
    key2 = key2.replace("Й","И").replace("Ъ","Ь");
    open_str = open_str.replace("Й","И").replace("Ъ","Ь");
    
    // кодируем текст
    let encoded_str = ([...open_str]).map( (e,i) => al[(al.indexOf(e) + al.indexOf(key1[i%key1.length]) + al.indexOf(key2[i%key2.length])) % 32] ).join("");
    
    console.log(encoded_str);


    PS:
    к строке по сути можно обращаться как к массиву - str[index]
    про .map смотрим здесь - https://developer.mozilla.org/en-US/docs/Web/JavaS...
    если вам надо прям вот на МАССИВАХ, то просто сделайте соответствующие переменные "массивами"
    строку в массив можно разбить так str.split("") или [...str]

    по скрипту
    al - строка / массив букв алфавита
    al.indexOf(char) - получаем индекс буквы в алфавите
    по выбору символа из ключа - т.к. ключ у нас заитерирован, то берем остаток от деления индекса кодируемого символа на длину ключа , это и будет символ из ключа - key1[i%key1.length], далее получаем его код по алфавиту - al.indexOf(key1[i%key1.length])

    и у вас много ошибок в таблице, например в третьей строке - конечный символ не И, а З
    и т.д.

    Ответ написан
    Комментировать
  • Какая нужна регулярка чтобы проверка проходила на номера одного оператора?

    erge
    @erge
    Примус починяю
    Вот еще вариант, проверяет номер написанный в любом формате со скобками вокруг кода и без с пробелами и с тире и с + в начале и без

    var str = '90553334849';
    alert(/^\+?9[ -]?\(?05[58]\)?[ -]?\d{3}[ -]?\d{2}[ -]?\d{2}$/.test(str));


    UPD:
    вот проверка (одной регуляркой в одну строку) по массиву кодов

    var str = '9(055)3334849';
    var allow = ['055','058'];
    alert((new RegExp('^\\+?9[ -]?\\(?('+allow.join('|')+')\\)?[ -]?\\d{3}[ -]?\\d{2}[ -]?\\d{2}$')).test(str));


    UPD3:
    Почитайте: https://developer.mozilla.org/en-US/docs/Web/JavaS...
    в разделе "Special characters in regular expressions." расписаны все спецсимволы, которые используются в регулярных выражениях.
    про конструктор new RegExp там тоже есть...

    кокретно в последнем примере:
    т.к. регулярку нам надо создавать "динамически", то используется конструктор new RegExp , который из строки создает и возвращает регулярку и уже у нее вызывается метод .test()
    про строку - в строке спецсимволы \ необходимо экранировать (предварять) символом \
    в строку регулярки мы вставляем все коды из массива allow склеенные через символ |
    регулярка вида (одно|второе|третье) читается как одно ИЛИ второе ИЛИ третье
    в данном случае массив склеивается и реглярка читается как 055 или 058

    ну, как-то так... )
    Ответ написан
    Комментировать
  • Как исправить ошибку при выводе из 2-х таблиц?

    erge
    @erge
    Примус починяю
    1. а если INNER JOIN ?

    SELECT `zadachi`.id AS id_zadacha,`zadachi`.*,`users`.* 
      FROM `zadachi`
      INNER JOIN `users` ON `users`.id_1c = `zadachi`.autor
      WHERE `zadachi`.komy = '$id' OR (`zadachi`.autor = '$id' AND `zadachi`.komy = '$id') 
      ORDER BY `zadachi`.id DESC


    2.
    а: Группа новых задач...
    б: Группа просроченных задач...
    в: Группа поставленных задач кому то...


    3 запроса, объединить через UNION ALL
    типа
    SELECT 'NEW' as group, .... FROM ... 
    UNION ALL
    SELECT 'EXPIRED' as group, ... FROM ...
    UNION ALL
    SELECT 'OTHER' as group, ... FROM ...
    Ответ написан
  • Как разрабатывать с docker на mac os?

    erge
    @erge
    Примус починяю
    браузеры и другие инструменты в ubuntu. Так как safari и chrome теперь не открываются по localhost.


    естественно, потому что они внутри виртаулки, внутри докера.
    и надо соединяться на IP виртуалки.

    я думаю, примерно, как-то так:
    • в виртуалке parallels desktop ставится Linux (можно без иксов, они не нужны) + Docker + LAMP
    • вся среда: бразуеры, PHPStorm и пр. ставится в маке
    • в виртуалке настраивается проброс необходимых портов в Linux (см. поиск parallels desktop port forward into guest system ), далее в docker
    • настраиваете удаленную отладку через XDebug (PHPStorm Xdebug remote debugging)
    • браузером ходите на IP виртуалки на настроенный выше порт
    • разделы из виртуалки/докера можно подключить в mac по sshfs например, вроде есть такое, гугли mac sshfs
    Ответ написан
    3 комментария
  • Как сделать динамический счетчик видимых элементов одного css класса jquery?

    erge
    @erge
    Примус починяю
    поиск: DOM change event -> https://en.wikipedia.org/wiki/DOM_events

    Mutation : DOMAttrModified

    так же найдено в поиске:
    jsfiddle.net/doktormolle/yQu8v

    модифицируем, смотрим:
    jsfiddle.net/tp2zxhn9

    событие DOMAttrModified отрабатывет при смене класса.

    далее...



    UPD:
    событие на вставку - DOMNodeInserted
    и почти на все изменения - DOMSubtreeModified

    посмотрите/измените jsfiddle.net/tp2zxhn9
    Ответ написан
    Комментировать
  • Как при INSERT задать значение поля на основе PRIMARY KEY?

    erge
    @erge
    Примус починяю
    повесить на таблицу триггер, который будет заполнять поле number

    либо...

    INSERT INTO `table` (`number`) values (CONCAT("10", (SELECT MAX(ID)+1 FROM `table`)));


    Но, это не точно, но вроде должно работать если ID автоинкремент.
    Ответ написан
    1 комментарий
  • Как вывести факт отсутствия данных?

    erge
    @erge
    Примус починяю
    Необходимо в приложении заложить правильную логику, либо обработку количества записей, либо с эксепшн.
    а по вопросу - FULL OUTER JOIN
    -- выбираем несуществующую запись
    SELECT pt.pid, t.id, t.text FROM (SELECT 1 AS pid) pt
      FULL OUTER JOIN (
        SELECT 1 AS pid, tt.*
          FROM tbl tt
          -- условие запроса:
          WHERE tt.id = 10
      ) AS t ON pt.pid = t.pid
    ;

    см. пример на dbfiddle

    так же и LEFT OUTER JOIN, но условие по запросу ставить внутрь скобок ( ) в подзапрос, см dbfiddle:
    -- выбираем несуществующую запись
    SELECT pt.pid, t.id, t.text FROM (SELECT 1 AS pid) pt
      LEFT OUTER JOIN (
        SELECT 1 AS pid, tt.*
          FROM tbl tt
          -- условие запроса:
          WHERE tt.id = 10
      ) AS t ON pt.pid = t.pid
    ;


    можно еще UNION подзапроса с NULL , но он всегда будет вставляться.
    SELECT id, text FROM tbl
    WHERE id = 10
    UNION
    SELECT NULL, NULL
    ;


    пример там же, выше.
    Ответ написан
    Комментировать
  • Хочу выйти на фрилас c WordPress, что учить?

    erge
    @erge
    Примус починяю
    Ну и сколько по времени учится WordPress

    нам не известен ваш уровень знаний и навыков.

    сайты на WordPress что посоветуете изучать.

    при таком вопросе уровень навыков по ходу никакой??

    Дайте пожалуйста план новичку.

    HTML, CSS, JavaScript, PHP, MySQL, Wordpress

    Либо крутые курсы и так далее.

    открываешь гугл и вперед. ютюб и ...
    wordpress с нуля
    вот например Создание сайта на WordPress

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

    erge
    @erge
    Примус починяю
    см. ROW_NUMBER() и MySQL ROW_NUMBER, This is How You Emulate It

    как-то так:

    SELECT * FROM (
    SELECT ....... ROW_NUMBER() OVER (PARTITION BY posts.idRecordPost ORDER posts.datePost DESC) row_num
      FROM .....
      ....
      WHERE posts.idRecordPost IN (83, 91)
    ) t
    WHERE t.row_num = 1
    Ответ написан
    Комментировать
  • Где ошибка в функции запроса в бд?

    erge
    @erge
    Примус починяю
    Catchable fatal error: Object of class waDbResultSelect could not be converted to string in

    вы хотя бы пробовали перевести данную строку??
    объект класса waDbResultSelect не может быть преобразован в строку

    ни о чем не говорит??

    Ну вы посмотрите внимательно, что вы делаете-то??
    $n = $model -> query("SELECT * FROM `w3m_404urls` WHERE `url`= '$rqul'")


    у вас в $n находится waDbResultSelect, т.е. резалтсет (целая строка(и) таблицы)
    к тому же и в запросе у вас * (т.е. в результате как минимум не одно поле)

    может быть вы все-таки из резалтсета возьмете одно поле url и будете его сравнивать с $rqul , а не весь резалтсет?

    см. waModel и waDbResultSelect

    Ну, и, не вижу никакого смысла сравнивать кислое с пресным, в смысле одно и тоже.
    вы выбираете по url и потом выбранное опять с ним же сравниваете ??
    надо считать кол-во выбранного - если > 0 , то запись есть. соответственно далее ...

    $n = $model -> query("SELECT * FROM `w3m_404urls` WHERE `url`= '$rqul'")->count();
    if ($n > 0 ) {
    // UPDATE
    } else {
    // INSERT
    }


    PS: ну и почему бы не упомянуть что вы используете Webasyst , здесь экстрасенсы??
    Ответ написан
    1 комментарий
  • Как правильно составить SQL запрос? Работа с Like?

    erge
    @erge
    Примус починяю
    select
         (char_length(authorId) - char_length(replace(authorId,',','')) + 1) as author_cnt
        ,b.*
      from books b
      where (char_length(authorId) - char_length(replace(authorId,',','')) + 1) >= 3
    Ответ написан
    2 комментария
  • Как правильно вывести объект в html?

    erge
    @erge
    Примус починяю
    Во-первых, вы непонятно излагаете свои мысли:
    и как сравнить значение, если например 0 - соотв. этому .item добавляем класс

    значит ли это что класс необходимо выставлять элементу в котором значение равно искомому, в данном случае 0 ?

    Во-вторых, вы неправильно берете количество/значение из str
    посмотрите как вы ее заполняете... в ней будет
    0: 1,
    1: 4,
    2: 2,
    3: 4,
    4: 4,
    5: 2,


    после разбивки split'ом
    str.split(', ')[i]
    в count вы присваете ПАРУ значение: количество !
    и это сравниваете с 0 ???
    эту пару необходимо еще раз разбить и взять либо ЗНАЧЕНИЕ, либо КОЛИЧЕСТВО, смотря что вам надо??

    ну и
    если например 0
    то почему у вас стоит условие < 0 ???

    for (let i = 0; i < item.length; i++) {
    	let pair = str.split(', ')[i];
      if (pair.split(': ')[0] == 0) {
        item[i].classList.add('zero');
      }
      item[i].textContent = pair;
    }


    PS: а если количество элементов в массиве изменится??
    может стоит добавлять элементы динамически?
    см. Node.appendChild()

    UPDATE:


    UPDATE 2:
    с добавлением класса:
    Ответ написан
    5 комментариев
  • Как добавить одинаковые обработчики событий на разные элементы?

    erge
    @erge
    Примус починяю
    [prewColor, redColor, blueColor].forEach(el => el.addEventListener('click', e => {
      // код обработчика
    }));
    Ответ написан
    Комментировать
  • Как обновлять таймер по клику?

    erge
    @erge
    Примус починяю
    странная логика заложена у вас.

    1. контейнер для таймер можно/нужно добавить в нужное место в HTML, а не добавлять каждый раз по клику, либо добавлять его по условию (что он еще не создан).

    2. вы безусловно добавляете элементы, а потом лишнее удаляете, зачем?

    3. зачем-то создали специально объект, хотя можно просто работать с массивом и удалять его элементы, массив это тот же объект.
    const items = [];
    items["one"]=1;
    items["two"]=1;
    if(items["one"]) console.log("Есть"); else console.log("Нет");
    delete items["one"];
    if(items["one"]) console.log("Есть"); else console.log("Нет");
    
    // либо
    items["one"]=0;
    if(items["one"]) console.log("Есть"); else console.log("Нет");


    4.
    Мне нужно сделать так, что если человек постоянно кликает по кнопке, то обновлять таймер

    у вас собственно вообще нет обработки повторного клика на туже кнопку, вместо этого у вас
    удаление излишне созданного контейнера, т.к. он выше добавляется безусловно:
    if (index > 0) {
              $(this).remove();
           }

    и возврат из обработчика если есть элемент (т.е. ранее был клик):
    if (items[name]) return;

    5. для возобновления таймера, вам надо написать обработчик повторного нажатия а не выходить из обработчика по условию
    if (items[name]) return;

    т.е. так:
    if (items[name]) {
    // остановка анимации таймера и запуск заново
    } else {
    // код первого запуска таймера.
    }


    остановка анимации, см. метод .stop

    вообще код запуска таймера можно вынести в отдельную функцию, т.к. он скорее всего будет одинаков как для первичного запуска, так и для повторного запуска.

    как-то так.

    UPDATE:

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

    erge
    @erge
    Примус починяю
    SELECT *
      FROM `number_1`
      WHERE `field_1` LIKE '%13%'
         OR `field_2` LIKE '%13%'
    --  ...
         OR `field_n` LIKE '%13%'


    либо

    SELECT *
      FROM `number_1`
      WHERE concat(`field_1`,'#', `field_2`,'#', ...,'#', `field_n`) LIKE '%13%'
    Ответ написан
    Комментировать
  • Как подключить WinSCP к sftp используя командную строку?

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


    Ну что же непонятного? синтаксис команды open описан:
    https://winscp.net/eng/docs/scriptcommand_open

    ссш ключ вставляется через опцию
    -privatekey= - путь к файлу ключу
    Ответ написан
    Комментировать
  • Максимальной количество WHEN THEN в операторе CASE SQL?

    erge
    @erge
    Примус починяю
    А почему бы не использовать update inner join ?

    update tbl as t
      inner join (
    select 1 id, 'Один' text union
    select 2   , 'Два' union
    select 3   , 'Три' union
    select 4   , 'Четыре'
      ) as tt on t.id = tt.id
      set t.text = tt.text
    ;


    пример на dbfiddle

    UPD:

    реализовать логику ELSE можно используя LEFT JOIN и COALESCE ( IFNULL )

    update tbl as t
      left join (
    select 1 id, 'Один' text union
    select 2   , 'Два' union
    select 3   , 'Три' union
    select 4   , 'Четыре'
      ) as tt on t.id = tt.id
      set t.text = coalesce(tt.text, 'Другое значение')
    ;


    см. пример на dbfiddle
    Ответ написан
  • Как объединить подзапросы?

    erge
    @erge Автор вопроса
    Примус починяю
    PS: извиняюсь, поспешил, таки пропустил... по параметрам что выбрал, оба запроса были пустые.

    Все работает:

    SELECT
        DECODE(NVL(an.id,0), 0,ao.id, an.id) AS id,
        DECODE(NVL(an.id,0), 0,ao.dt_beg, an.dt_beg) AS dt_beg,
        DECODE(NVL(an.id,0), 0,ao.dt_end, an.dt_end) AS dt_end
      FROM
      (.....) ao
      FULL OUTER JOIN (.....) an ON ao.id = an.id
      WHERE (an.id is null OR ao.id is null)
        AND (ao.id = _NUMBER_ OR an.id = _NUMBER_)
    ;
    Ответ написан
    Комментировать
  • Какой локальный сервер выбрать новичку в Linux?

    erge
    @erge
    Примус починяю
    под Linux это LAMP
    уткопоиск выдает множество результатов по установка и настройка LAMP

    статья на хабре - Установка и настройка веб-сервера LAMP для разрабо...
    и пр. пр.

    из дистрибутивов:
    Ubuntu, Linux Mint, CentOS (Oracle Linux тоже самое), и в принципе даже ROSA Linux
    во всех есть удобные пакетные менеджеры.
    под любой из перечисленных можно легко поставить LAMP из пакетов.
    Ответ написан
    Комментировать
  • Sql и субд для начинающего?

    erge
    @erge
    Примус починяю
    какой нибудь ORACLE

    скажите это ораклистам )))
    в ORACLE совсем не чистый SQL, а свой специфичный и потом особенно новичку трудно привыкнуть к "чистому" SQL

    собственно без СУБД, как? как системы, в смысле дома чтоб не ставить?
    есть онлайн песочницы, в принципе, и там можно любую СУБД на вкус и цвет выбрать, без установки.

    sqlfiddle.com
    https://dbfiddle.uk/

    PS: единственно что, вам придется постоянно схемы создавать.

    так же есть упражнения по SQL
    www.sql-ex.ru

    но теорию БД изучать необходимо.
    Ответ написан
    Комментировать