• Как получить отрендеренную HTML-страницу при помощи Selenium или PhantomJS?

    erge
    @erge
    Примус починяю
    c Selemium не работал, но имхо, брать надо не getPageSource, а после загрузки всей страницы, найти элемент, например body, и получить у него innerHTML, если вы парсите регэкспами. Либо работать с DOM страницы, что как бы наверно удобнее.

    примерно как-то так (возможно ошибаюсь с синтаксисом):

    $element = $driver->findElement(WebDriverBy::cssSelector('body'));
    
    $src = $element->getAttribute('innerHTML');
    
    # или так
    
    $src = $driver->executeScript("return document.body.innerHTML");
    Ответ написан
    1 комментарий
  • Как получить LastInsertRowId?

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

    select last_insert_rowid();

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

    erge
    @erge
    Примус починяю
    получаете rowid нужной записи
    select rowid from numbers where num = 10;

    удаляете запись
    delete from numbers where num = 10;

    выбираем следующую запись по полученному rowid + 1

    конкретно в данном случае rowid записи 10 был равен 4 и + 1, следующая запись с rowid >=5 :
    -- выбираем слудющую запись по rowid(10) + 1 -> 4+1
    select num
      from numbers
      where rowid >= 5 -- 4+1
      order by rowid
      limit 1;


    см. пример на dbfiddle
    Ответ написан
    Комментировать
  • Я хочу автоматизировать процесс создания дампа одной таблицы из MySQL и заливки его на GitHub - какие шаги нужны?

    erge
    @erge
    Примус починяю
    MySQL 5.7 и выше уже умеет JSON (google)

    как пример:

    CREATE TABLE employees(id INT PRIMARY KEY, name VARCHAR(45), age INT);
    INSERT INTO employees(id, name, age) VALUES (1,'John', 34);
    INSERT INTO employees(id, name, age) VALUES (2,'Mary', 40);
    INSERT INTO employees(id, name, age) VALUES (3,'Mike', 44);


    на SQL Запрос такой будет:
    SELECT JSON_PRETTY(JSON_ARRAYAGG(
     JSON_OBJECT("id", id, "name", name, "age", age)
     )) json
     FROM employees


    результат:
    [
      {
        "id": 1,
        "age": 34,
        "name": "John"
      },
      {
        "id": 2,
        "age": 40,
        "name": "Mary"
      },
      {
        "id": 3,
        "age": 44,
        "name": "Mike"
      }
    ]


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

    на PHP фетчите запрос, сохраняете в файл в репозиторий.

    затем через shell_exec
    выполняете
    git add ...
    git commit
    git push

    PS: но имхо проще на bash'e написать.
    Ответ написан
    2 комментария
  • Как объединить JSON в строку в выборке MySQL?

    erge
    @erge
    Примус починяю
    Просто произвести замену ", []
    json как строка
    select
        replace(replace(replace(replace(phones,', ',' '),'"',''),'[',''),']','') phones
      from clients;

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

    erge
    @erge
    Примус починяю
    Имхо, желательно делать проверку полнее, т.к. ну чисто теоретически такие слова могут быть в имени пользователя например, так же не делать инверсию результата, т.к. метод все же называется isInvalid

    isInvalid: function(input) {
      return /@(gmail|yahoo)\.[a-z]+$/.test(input.value.trim().toLowerCase());
    }


    PS: если проверка НА валидность, то поставить !
    Ответ написан
    2 комментария
  • Как перемещать файлы между сайтами, которые находятся на одном сервере?

    erge
    @erge
    Примус починяю
    move_uploaded_file

    поправка, т.к. изначально не уловил сути:

    sudo chmod go+x /var
    sudo chmod go+x /var/www
    sudo chmod go+x /var/www/vhost
    sudo chmod go+x /var/www/vhost/site2
    sudo chmod go+x /var/www/vhost/site2/www
    sudo chmod go+rwx /var/www/vhost/site2/www/file
    Ответ написан
  • Можно ли вложить уже полученную высоту в css переменную?

    erge
    @erge
    Примус починяю
    document.querySelector("div").style="--bg-color:blue; --width:300px; --align:center"


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

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

    см. на sqlfiddle
    select e.id, e.name
      from employee e
      join (
        select employee_id
          from empl_services es
          join services s on s.id = es.service_id
          where s.title in ('Крутит гайки','Носит ящики')
          group by employee_id
          having count(1) = 2
      ) t on t.employee_id = e.id
    ;
    
    -- если id услуг известны то так:
    
    select e.id, e.name
      from employee e
      join (
        select employee_id
          from empl_services es
          where service_id in (1,3)
          group by employee_id
          having count(1) = 2
      ) t on t.employee_id = e.id
    ;


    PS: тут обязательно надо в выражении having count(1) = ?? подставлять количество услуг перечисляемых в IN(...)
    на 8ке можно по другому через WITH, а в having count(1) подставлять count по подзапросу услуг...

    UPD:
    на 8ке так:

    with 
    s as (
      select id from services where title in ('Крутит гайки','Носит ящики')
    ),
    r as (
      select employee_id from empl_services es
        join s on s.id = es.service_id
        group by employee_id
        having count(employee_id) = (select count(1) from s)
    )
    select *
      from employee e
      join r on r.employee_id = e.id
    ;


    см. на dbfiddle
    Ответ написан
  • Ошибка преобразования массовой загрузки данных?

    erge
    @erge
    Примус починяю
    Importing data from a CSV file

    BULK INSERT LR1.dbo.Company
    FROM '\\Mac\Home\Descktop\DB\data\Company.txt'
    WITH (FORMAT = 'CSV'
          , FIRSTROW=1
          , FIELDTERMINATOR = ';'
          , ROWTERMINATOR = '0x0a');


    PS: так же попробуйте с , FIELDQUOTE = '\''
    хотя в этом случае кажется каждое значение должно быть в апострофах, а не только строки.

    Так же попробуйте указать CODEPAGE
    Ответ написан
    Комментировать
  • Почему php выводит из базы что то одно?

    erge
    @erge
    Примус починяю
    Подозреваю что на выходе , после цикла
    while($row = mysqli_fetch_array($res))
    Result set - $res становится ПУСТЫМ! поэтому второй while его не отрабывает.
    и либо
    - его необходимо наполнить заново, повторно выполнив запрос
    $res = mysqli_query($dbc, $query);

    либо, что более корректно:

    1) заполнить из result set некий массив, далее по коду уже работать с массивом.

    2) на каждом номере класса выполнять запрос
    SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class

    и далее делать вывод анологично.

    3) что еще более правильное:
    получить из базы список классов, например
    SELECT DISTINCT class FROM `pupils` -- я допустил что колонка у вас называется class


    далее цикл по резалтсету
    выводим
    <div class="cl">
          <h3>НОМЕРКЛАССА</h3>


    делаем запрос вида
    SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class


    далее цикл по резалтсету
    выводим
    <h4>ФИО</h4>
    конец вложенного цикла

    выводим закрывающий тэг </div>

    конец первого цикла.

    как-то так... ну код сами напишете ;)
    Ответ написан
    4 комментария
  • Можно ли это как то упростить?

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

    function recountItem(el_summ, el_quantity, n_price, e) {
      action = e ? e.target.className.match(/\w+_+(\w+)/)[1] : '';
      n_quantity = parseInt(el_quantity.text());
      switch(action){
        case 'plus':
        case 'increment':
          n_quantity ++;
          break;
        case 'minus':
        case 'decrement':
          n_quantity = n_quantity > 1 ? n_quantity - 1 : n_quantity;
          break;
      }
      el_quantity.text(n_quantity);
      el_summ.text(n_quantity * n_price + ' грн.');
    };
    
    //order
    
    $('.order__block').each(function() {
      var $e = $(this),
          el_quantity = $e.find('.order__value'),
          el_summ = $e.find('.order__sum'),
          n_price = $e.find('.order__value').attr('data-number');
    
      $e.find('.order__plus').click(function(e) {
        recountItem(el_summ, el_quantity, n_price, e)
      });
    
      $e.find('.order__minus').click(function(e) {
        recountItem(el_summ, el_quantity, n_price, e)
      });
    
      recountItem(el_summ, el_quantity, n_price);
    });
    
    //single
    
    $('.single__row').each(function() {
      var $e = $(this),
          el_quantity = $e.find('.single__count'),
          el_summ = $e.find('.single__price'),
          n_price = $e.find('.single__count').attr('data-price');
    
      $e.find('.single__increment').click(function(e) {
        recountItem(el_summ, el_quantity, n_price, e)
      });
    
      $e.find('.single__decrement').click(function(e) {
        recountItem(el_summ, el_quantity, n_price, e)
      });
    
      recountItem(el_summ, el_quantity, n_price);
    });
    
    //basket
    
    $('.basket__item').each(function() {
      var $e = $(this),
          el_quantity = $e.find('.basket__value> span'),
          el_summ = $e.find('.basket__sum'),
          n_price = $e.find('.basket__single').text();
    
      $e.find('.single__increment').click(function(e) {
        recountItem(el_summ, el_quantity, n_price, e);
        updateBasketTotalSum();
      });
    
      $e.find('.single__decrement').click(function(e) {
        recountItem(el_summ, el_quantity, n_price, e);
        updateBasketTotalSum();
      });
    
      recountItem(el_summ, el_quantity, n_price);
      updateBasketTotalSum();
    });
    
    function updateBasketTotalSum() {
      var sum = 0;
      $('.basket__sum').each(function() {
         sum += parseInt($(this).text());
       });
      $('.basket__count').text(sum + ' грн.');
    }
    
    $('.basket__close').on('click', function() {
      $(this).parent().parent().remove();
    });


    если нигде в синтаксисе не ошибся, то должно работать вроде как.

    PS: все повторяющиеся действия вынесены в ОДНУ функцию, тем более что у вас во все функции передавались ссылки на html элементы и действия абсолютно одинаковые. А action определяется по className элемента, который берется из event'а

    PPS: только какой профит с готового решения??
    Ответ написан
    3 комментария
  • Как сделать функцию на чистом JS, срабатывающую при наведении на HTML блок?

    erge
    @erge
    Примус починяю
    почитай про события в Javascript
    Введение в браузерные события
    Выразительный JavaScript: Обработка событий
    и т.п.

    document.querySelectorAll("button").forEach(el => el.addEventListener("mouseover", e => alert("Вы навели на кнопку: "+e.target.textContent)))


    Ответ написан
    Комментировать
  • Как сделать дамп большой базы в Mysql на Windows?

    erge
    @erge
    Примус починяю
    Не 7zFM.exe а 7z.exe

    Первый это оконный файловый менеджер, второй работает из командной строки

    см. опции и ключи запуска:

    7-Zip 19.00 (x86) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

    Usage: 7z [...] [...] [@listfile]


    a : Add files to archive
    b : Benchmark
    d : Delete files from archive
    e : Extract files from archive (without using directory names)
    h : Calculate hash values for files
    i : Show information about supported formats
    l : List contents of archive
    rn : Rename files in archive
    t : Test integrity of archive
    u : Update files to archive
    x : eXtract files with full paths


    -- : Stop switches and @listfile parsing
    -ai[r[-|0]]{@listfile|!wildcard} : Include archives
    -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
    -ao{a|s|t|u} : set Overwrite mode
    -an : disable archive_name field
    -bb[0-3] : set output log level
    -bd : disable progress indicator
    -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
    -bt : show execution time statistics
    -i[r[-|0]]{@listfile|!wildcard} : Include filenames
    -m{Parameters} : set compression Method
    -mmt[N] : set number of CPU threads
    -mx[N] : set compression level: -mx1 (fastest) ... -mx9 (ultra)
    -o{Directory} : set Output directory
    -p{Password} : set Password
    -r[-|0] : Recurse subdirectories
    -sa{a|e|s} : set Archive name mode
    -scc{UTF-8|WIN|DOS} : set charset for for console input/output
    -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
    -scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
    -sdel : delete files after compression
    -seml[.] : send archive by email
    -sfx[{name}] : Create SFX archive
    -si[{name}] : read data from stdin
    -slp : set Large Pages mode
    -slt : show technical information for l (List) command
    -snh : store hard links as links
    -snl : store symbolic links as links
    -sni : store NT security information
    -sns[-] : store NTFS alternate streams
    -so : write data to stdout
    -spd : disable wildcard matching for file names
    -spe : eliminate duplication of root folder for extract command
    -spf : use fully qualified file paths
    -ssc[-] : set sensitive case mode
    -sse : stop archive creating, if it can't open some input file
    -ssw : compress shared files
    -stl : set archive timestamp from the most recently modified file
    -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
    -stx{Type} : exclude archive type
    -t{Type} : Set type of archive
    -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
    -v{Size}[b|k|m|g] : Create volumes
    -w[{path}] : assign Work directory. Empty path means a temporary directory
    -x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
    -y : assume Yes on all queries


    так же смотрите - mysql, Утилита командной строки

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

    как-то так наверно:
    "C:\Program Files (x86)\7-Zip\7z.exe" x -so G:\FIAS\fias_07.10.19.zip sql_file1.sql | G:\MySqlWork\mysql.exe -uroot -p 4830 newBase
    "C:\Program Files (x86)\7-Zip\7z.exe" x -so G:\FIAS\fias_07.10.19.zip sql_file2.sql | G:\MySqlWork\mysql.exe -uroot -p 4830 newBase


    и так перебрать все по порядку.
    Ответ написан
  • Как преобразовать select в ul?

    erge
    @erge
    Примус починяю
    На JQuery как-то так:
    $(".shop-options-s > option[class='0']").each(function(){
      $(".container").append(
        $("<span/>").attr({"value":$(this).attr("value")})
                    .css("cursor","pointer")
                    .text($(this).text())
                    .click(function(){
                      $(".shop-options-s").val($(this).attr("value"));
                    })
      )
    })


    Ответ написан
    1 комментарий
  • Рисование графиков в JS?

    erge
    @erge
    Примус починяю
    Комментировать
  • Можно ли в запросе 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
    ??
    Ответ написан
    Комментировать