Задать вопрос
  • Как сосчитать повторяющиеся буквы?

    @alexalexes
    Вариант с минимальными изменениями
    function RST(str){
    let arr = str.split('');
    let num = 1;
    let result = '';
    for(let i = 1; i < arr.length; i++){
      if(arr[i] == arr[i-1]){
        num++;
      } else {
        result += arr[i-1] + num; // тут была ошибка
        num = 1;
      }
    }
    // Нужно допечатать последнее накопление num
    if(arr.length > 0)
     result += arr[arr.length-1] + num;
    return result;
    }
    Ответ написан
    Комментировать
  • Как мне с одной базы с таблицы скопировать в другую базу таблицы?

    @alexalexes
    1. Используете импорт/экспорт базы/таблиц в каком-нибудь инструменте, например, phpmyadmin.
    или
    2. Пишете скрипт с двумя коннектами. По первому коннекту делаете порционную выборку, по второму - вставляете результат выборки из первого коннекта.
    Ответ написан
    Комментировать
  • Как склеить много фотографий в одну картинку?

    @alexalexes
    Самый бюджетный вариант коллажа с использованием браузера.
    1. Копируете этот код и сохраняете в файле index.html;
    2. Создаете каталог photo рядом с файлом index.html и закидываете туда уже пронумерованные по порядку фото.
    3. Поправляете параметры:
    а) В селекторе "table tr td img" задаете width и height - размер одной миниатюры в коллаже.
    б) Указываете photo_count - кол-во фоток в каталоге photo.
    в) Указываете col_count - кол-во фоток в одном ряду коллажа.
    г) Указываете start_pic_number - с какого номера начинается нумерация фоток.
    д) Указываете filename_counter_size - размерность нумерации фоток, если идет 01, 02, 03 - то размерность 2,
    если, например 00001, 00002, 00003, то размерность 5.
    е) Задаете принцип формирования имени файла в filename.
    Если расширение у вас не jpg, а например png, то строка будет выглядеть так:
    var filename = filename_counter + '.png';
    Если в имени файла есть какие-то постоянные символы, кроме счетчика, например они именуются DSC_0001.JPG, то имя файла будет формироваться так:
    var filename = 'DSC_' + filename_counter + '.JPG';
    Имя файла чувствительно к регистру символов!
    ж) Корректируюете путь к файлу относительно страницы index.html, если требуется.
    var filepath = 'photo/' + filename;
    Фрагмент 'photo/' задает каталог с фотками.
    Следует избегать именования каталога и фоток кириллицей.
    4. Открываете index.html в браузере.
    5. Если файлов много, то ждете окончания открытия страницы. Зависит от производительности компа, свободной оперативной памяти.
    6. Если все в порядке, то миниатюры отобразятся. Это значит, что путь задан верно для фоток и фотки пронумерованы правильно и компу хватило ресурсов отобразить коллаж.
    7. Делаем скриншот всей страницы:
    Инструкция для браузера Google Chrome.
    Ctrl+Shift+I — войти в режим разработчика.
    Ctrl+Shift+M — нажать в нем на кнопку эмуляции просмотра в мобильных устройствах.
    Нажать на кнопку меню в окне эмулации (см. в правый верхний угол страницы) и выбрать пункт «Capture full size screenshot».
    После некоторого времени браузер "закачает" некий файл изображения.
    Это и будет конечный результат - коллаж.
    <html>
      <head>
        <style>
          html, body
          {
            margin: 0;
            padding: 0;
          }
          table
          {
            border: none;
          }
          table tr td img
          {
            width: 400px;
            height: 300px;
          }
          table tr td p
          {
            font-size: 10pt;
            text-align: center;
            margin-top: 0;
            margin-bottom: 0;
          }
        </style>
      </head>
      <body>
       <table id="container">
       </table>
       <script>
          function gen_collage()
          {
            var photo_count = 10; // кол-во фото в каталоге (нужно задать)
            var col_count = 5; // кол-во фото в одной строке коллажа (нужно задать)
            var row_count = photo_count / col_count + (photo_count % col_count > 0 ? 1 : 0); // вычисляем, сколько строк для генерации коллажа потребуется
            var start_pic_number = 1; // индекс первой фотки коллажа (если файлы начинаются, например, с 01.jpg, то нужно поставить 1)
            var filename_counter_size = 2; // размер счетчика с ведущими нулями, если поставить 2, то будет генерировать 01, 02, 03 и тд.
            var cur_pic_number = start_pic_number; // номер текущей фотки
            var table_inner = ''; // содержимое таблицы коллажа
            for(var i = 0; i < row_count; i++)
            {
              var row_pictures_inner = '<tr>'; // строка коллажа
              for(var j = 0; j < col_count; j++)
              {
                row_pictures_inner += '<td>'; // ячейка коллажа
                if(cur_pic_number - start_pic_number < photo_count)
                {
                  var filename_counter = ('000000000' + cur_pic_number).substr(-filename_counter_size); // счетчик с ведущими нулями
                  var filename = filename_counter + '.jpg'; // имя файла на основе счетчика (сейчас генерирует 01.jpg, 02.jpg и тд.)
                  var filepath = 'photo/' + filename; // путь к файлу (сейчас задан относительный путь, файлы нужно поместить в каталог photo, index.html должен лежать рядом с каталогом photo)
                  row_pictures_inner += '<div><img src="' + filepath + '"/><p>' + filename + '</p></div>'; // содержимое ячейки коллажа
                }
                row_pictures_inner += '</td>';
                cur_pic_number++;
              }
              row_pictures_inner += '</tr>';
              table_inner += row_pictures_inner;
            }
            document.getElementById('container').innerHTML = table_inner;
          }
          gen_collage();
       </script>
      </body>
    </html>
    Ответ написан
    Комментировать
  • Вытащить из json значение?

    @alexalexes
    Проблема обойти невалидное название свойства (так как используется дефис).
    Используем магию именования свойства класса через переменную.
    $recaptcha_property_name = 'error-codes';
    echo $recaptcha->$recaptcha_property_name[0];
    Ответ написан
    2 комментария
  • Как получить товары сразу из нескольких категорий?

    @alexalexes
    А в чем сложность?
    Берем таблицу товаров (goods), подключаем таблицу категорий (category), по parent_id получаем товары одной категории родителя.
    select distinct g.*
    from goods g
    join category c on c.id = g.category_id  
                            and c.parent_id = 34

    Если у вас товары входят в несколько категорий, то наверняка, есть промежуточная таблица связей "многие ко многим", то запрос будет примерно такой:
    select distinct g.*
    from goods g
    join good_category_hold gch on g.id = gch.good_id
    join category c on c.id = gch.category_id
                                    and c.parent_id = 34
    Ответ написан
    3 комментария
  • Где найти сетевые драйвера для windows xp?

    @alexalexes
    Скачиваете любой ZverDVD XP образ. Внутри образа есть каталог oemdrv с архивами драйверов по категориям устройств. Архив с именем LAN, как правило, содержит сетевые драйвера на самые распространенные устройства под XP. Распаковываете архив и натравливаете на него установщик драйверов, пусть ищет подходящий.
    Ответ написан
    Комментировать
  • Как составить sql запрос?

    @alexalexes
    Самый топорный вариант - "округляем" время до интересуемого интервала (кванта времени) функцией форматированного вывода времени и считаем кол-во записей с группировкой по форматированному значению времени, потом сортируем в нужную сторону.
    Данный пример использует функцию to_char СУБД Oracle и интервал квантования - 1 минута.
    select * from
    (
      select to_char(time, 'YYYY.MM.DD HH24:MI') time_round_minute, count(distinct userId) cnt
      from log_table
      group by to_char(time, 'YYYY.MM.DD HH24:MI') 
     )
    order by cnt desc

    Если отсортировать по форматированную времени, при условии, что формат времени записан в порядке убывания величин (год, месяц, день, час, минута, секунда), то выходные данные - практически готовая гистограмма нагрузки.
    Ответ написан
    3 комментария
  • Как вытащить данные из БД с определенными признаками избегая вхождения других?

    @alexalexes
    Пересеките таблицу сессий саму на себя по идентификатору сессии, и добавьте исключающее условие not in по подключенной таблице.
    select distinct t1.session_id, t1.action
    from table t1
    join table t2 on t1.session_id = t2.session_id
    where t1.action in ('вход', 'переход на страницу 1', 'переход на страницу 2', 'целевое действие')
    and t2.action not in (перечень того, что не должно быть точно)

    Вариант 2.
    select t1.session_id, t1.action
    from table t1
    where t1.action in ('вход', 'переход на страницу 1', 'переход на страницу 2', 'целевое действие')
    and not exists(select 1 from table t2 where t1.session_id = t2.session_id and t2.action in (перечень того, что не должно быть точно))
    Ответ написан
  • Как сделать выборку из 2 таблицы булевым значением?

    @alexalexes
    Вывод логического типа колонки должна поддерживать СУБД.
    А так, на практике, гарантировано можно работать с нулл/не нулл или 0/ не 0 флагами.
    а) Использовать left join и проверять не нулл значение, какого нибудь поля присоединенной таблицы (например, b.table1id).
    SELECT distinct a.id, a.rank, a.firstname, a.name, 
    a.secondname, b.table1id
    FROM table1 as a
    left JOIN table2 as b on b.table1id = a.id and b.dateto < ?

    б) Или считать количество строк подзапросом у порисоединенной таблицы. Можно оптимизировать, отрезав по первой записи rownum = 1, тогда cnt получите 0 или 1.
    SELECT a.id, a.rank, a.firstname, a.name, 
    a.secondname, (select count(*) from table2 as b on b.table1id = a.id and b.dateto < ? and rownum = 1) cnt
    FROM table1 as a

    в) Если поддерживается логика в выводе колонки:
    SELECT a.id, a.rank, a.firstname, a.name, 
    a.secondname, exists(select 1 from table2 as b on b.table1id = a.id and b.dateto < ?) as is_exists
    FROM table1 as a
    Ответ написан
    Комментировать
  • Как исправить ошибку при добавлении строки phpmyadmin?

    @alexalexes
    Ограничения по внешним ключам прямо говорят о том, чтобы по идентификаторам player_id и категории в справочниках players и categories существовали нужные записи, но и сами идентификаторы были того же типа данных, что и первичные ключи справочников.
    Ответ написан
  • Какой самый быстрый способ итерации массива в JS?

    @alexalexes
    Если заостряться в оптимизации скорости циклов, то я js/php придерживаюсь двух правил:
    1) Если количество элементов в массиве на протяжении всего цикла не предполагает изменения, то количество элементов лучше посчитать заранее. Так мы избежим обращения к length при каждой итерации, если интерпретатор совсем туп.
    2) Если к i-му элементу идет много обращений в течении одного хода цикла, то этот элемент лучше вытащить отдельным указателем на него.
    Все остальное - экономия на спичках.
    var item_count = array.length; // считаем заранее кол-во
    for(var i = 0; i < item_count; i++)
    {
      var item = array[i]; // вытаскиваем ссылку на элемент для простоты доступа
      ...
    }
    Ответ написан
    Комментировать
  • Как сделать валидацию формы на стороне клиента в реальном времени?

    @alexalexes
    Используйте событие input для вызова этого обработчика.
    Есть еще ряд событий, которые возникают в при разном характере воздействия на элемент управления. Пробуйте, экспериментируйте, выбирайте, что вам подходит (change и события нажатий клавиш уже используете, но видимо, не то).
    Ответ написан
    Комментировать
  • Выборка из массива по значению?

    @alexalexes
    Фильтруете массив:
    $selected_items = array_filter($inp_array, function($item){return $item['status'] == 0;});
    Ответ написан
    Комментировать
  • Как правильно сделать SQL запрос по нескольким значениям одного поля?

    @alexalexes
    Не знаю, как это правильно называется. "Межстрочный AND по значениям столбца" реализуется пересечением одной таблицы самой себя столько раз, сколько нужно членов and для сравнения.
    В общем, в выражении exists реализована такая конструкция.
    select ext.*
    from ext
    where 
    exists (select 1 from t as t1
                             join t as t2 on t1.field_id = t2.field_id
                              where t1.field_id = ext.f1
                                  and t1.value_id = v1 
                                  and t2.value_id = v2 )
    and exists (select 1 from t as t1
                             join t as t2 on t1.field_id = t2.field_id
                              where t1.field_id = ext.f2
                                  and t1.value_id = v3 
                                  and t2.value_id = v4 )
    Ответ написан
  • Как можно выводить результаты JS не через идентификатор, а классы?

    @alexalexes
    Возьмите элементы с помощью getElementsByClassName и переберите их в цикле, вставив нужные сведения.
    var elems = document.getElementsByClassName('your_class');
    var elem_count = elems.length;
    for(var i = 0; i < elem_count; i++)
    {
       elems[i].innerHTML = 'Какие-то данные';
    }
    Ответ написан
    Комментировать
  • Как правильно сформировать запрос sql?

    @alexalexes
    Пробовал через join, но получается множество дублей задач, так как призов к одной задаче множество.

    Не проблема, после выполнения запроса, собираете вложенный объект.
    Если боитесь все строки получать, то в цикле получайте по одной строке fetch-функцией, тоже не проблема.
    select task_id, ......, prize_id, .......
    from (сложный join)

    $out = [];
    foreach($rows as $row)
    {
      $task = &$out[row['task_id']];
      $task['id'] = row['task_id'];
      $task['name'] = row['name_task'];
      .... // другие свойства задачи
      if(!array_key_exists('prizes', $task))
      {   
        $task['prizes'] = [];
      }
     if(!is_null($row['prize_id']))
      {
       $prize = &$task['prizes'][$row['prize_id']];
       $prize['id'] =  $row['prize_id'];
        ..... // другие свойства приза
        unset($prize);
      }
      unset($task);
    }
    var_dump($out);
    Ответ написан
    Комментировать
  • Как генерировать и выдавать ссылку на скачивание по хешу?

    @alexalexes
    Ведете таблицу в базе данных site_files, в которых как минимум присутствуют поля:
    file_id - идентификатор файла (первичный ключ);
    file_path - путь к файлу на сервере;
    hash - хэш файла (от содержимого или случайная последовательность символов).
    При необходимости можете хранить оригинальное имя файла, расширение, размер, дату создания и т.д.
    Во время вставки файла на сервер, записываете сведения о нем в эту таблицу.
    Делаете скрипт отдачи, доступный по адресу: site.ru/file_download или по параметру action=get_file
    site.ru/?action=get_file&hash=18972198231
    В этом скрипте определяете, что сведения о файле нужно искать по хэшу.
    По хэшу находите file_path и отдаете по нему содержимое файла клиенту.
    Ответ написан
    Комментировать
  • Как получить общее количество не прочитанных сообщений для диалога?

    @alexalexes
    У вас в итоговой выборке есть dialogId. С помощью него делаете подзапрос в select-e, чтобы получить единственное значение.
    SELECT du.*, (
        SELECT COUNT(dm."receiverRead") "unreadMessages"
        FROM dialogs_messages dm
        WHERE 
            dm."dialogId" = du."dialogId" 
            AND dm."receiverRead" = false
            AND dm."senderUserId" NOT IN ('69e56a68-edbd-4f8b-8ccd-cb8031c5c865')
            AND dm.id NOT IN (
                SELECT dmd."messageId" FROM dialogs_messages_deleted dmd
                WHERE dmd."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            )
        GROUP BY dm."receiverRead"
    ) 
    FROM (
        SELECT
            DISTINCT ON (du."dialogId") du."dialogId", 
            SUBSTRING(dm."message", 1, 60), 
            du."joinedDateTime",
            users."avatarUrl",
            users.username
        FROM dialogs_users du
        LEFT JOIN dialogs_messages dm ON dm."dialogId" = du."dialogId"
        LEFT JOIN users on users.id = dm."senderUserId"
        WHERE 
            du."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            AND dm.id NOT IN (
                SELECT dmd."messageId" FROM dialogs_messages_deleted dmd
                WHERE dmd."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            )
        ORDER BY du."dialogId", dm."message" DESC
    ) du
    ORDER BY du."joinedDateTime" DESC;
    Ответ написан
    3 комментария
  • Какая разница между odbc и pdo подключением к базе?

    @alexalexes
    Вас устроят краткие выдержки из вики про две эти технологии?
    ODBC, PDO.
    В частности, в статье про PDO написано различие:
    PDO не использует абстрактные слои для подключения к БД, наподобие ODBC, а использует для разных БД их «родные» драйверы, что позволяет добиться высокой производительности. В настоящее время для PDO существуют драйверы практически ко всем общеизвестным СУБД и интерфейсам. Также PDO позволяет работать одновременно с несколькими базами данных.
    Ответ написан
    Комментировать
  • Как оплачивать русскую подписку будучи резидентом другой страны?

    @alexalexes
    Можно попробовать создать виртуальную карту в одной из платежных систем страны, например, Яндекс.Деньги.
    Но вам, скорее всего, понадобится симка оператора РФ и профиль пользователя, идентифицированный в РФ.
    Ответ написан
    Комментировать