• Как правильно сформировать запрос 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
    Можно попробовать создать виртуальную карту в одной из платежных систем страны, например, Яндекс.Деньги.
    Но вам, скорее всего, понадобится симка оператора РФ и профиль пользователя, идентифицированный в РФ.
    Ответ написан
    Комментировать
  • Parse error: syntax error, unexpected '[' in?

    @alexalexes
    какая версия php?
    Если выше 5.6, то синтаксис массива [] допустим, если ниже, то только array().
    Ответ написан
    1 комментарий
  • Как перехватить защищенный JS?

    @alexalexes
    Вам поможет среда PhantomJS.
    https://github.com/diggin/php-PhantomjsRunner
    В ней подожгете событие на нужной кнопке, подождете чуть-чуть и выцепите ссылку.
    Ответ написан
  • Множественное удаление строк в таблице?

    @alexalexes
    но может быть есть уже готовая библиотека которая позволяет с выбранных строк отправить данные на сервер для их удаления,

    Как правило, библиотеки визуализации предоставляют возможность отображать данные клиенту в определенной форме по модели данных, заключенной в окружении JS. Этим и ограничивается виджет.
    Вам нужно самим взять обработчики событий, наполнить модель данных виджета при инициализации или фиксации изменений.
    То есть, дополнительно самим выбрать, каким способом вы будете общаться с сервером в обработчиках событий: нативным XMLHttpRequest, JQuery ajax или какой-нибудь axios. В вашем случае, разработчики виджета не дают такую возможность в бесплатной версии.
    Также, вам нужно выбрать, каков будет формат сообщений для сервера.
    Безусловно, он будет обернут в json. Как будут определены полезные данные, передача кодов и сообщений об ошибках - вы сами определяете.
    Как будет устроен интерфейс запросов к функциям сервера?
    Сейчас популярна REST модель, TreeQL, GraphQL, хотя вы можете придумать свою систему параметров и команд для модификации данных.
    Как переводить запрос от клиента в запросы сервера базы данных?
    Выше упомянутые REST модель, TreeQL, GraphQL могут обеспечить роутинг по выполнению функций на стороне сервера и само выполнение функции, но, как правило, вам еще нужно будет сконструировать SQL-запрос с помощью ORM или сделать свой велосипед.
    Как видите, чтобы что-то вписать в таблицы вам нужно согласовать выбор еще некоторых компонентов стека системы. Не только выбрать один компонент, который работает на фронтенде.
    P.S. еще одна проблема заключается в том что все примеры Datatables используют на стороне сервера PHP, который я не использую да и к тому же не знаю.

    JS+PHP - типичная связка стека фронтенд+бэкенд, а так же выбранным вами компонент, рассчинан именно на массового пользователя, использующего именно эту связку. Если компонент имеет строго фронтэнд реализацию, реализация кода на бэкенде лишь пример для правильного взаимодействия с фронтендом, то вам ничего не стоит переписать логику на свой бэкенд, главное соблюсти формат сообщений между ними.
    Ответ написан
  • Вирусы в фильмах?

    @alexalexes
    Нужен ряд условий.
    1. Формат данных в контейнере видео должен позволять хранить макросы.
    2. Проигрыватель или видеокодек должны уметь читать и исполнять этот тип макросов.
    3. Среда выполнения макроса должна иметь доступ к ресурсам системы пользователя, не подразумевая изолированную "песочницу" (сравните JS и Adobe Flash по этому показателю).
    4. Проигрыватель не предупреждает пользователя, если макрос пытается получить доступ к ресурсам системы.
    5. Пользователь позволяет макросу получить доступ к ресурсам системы, если все же спрашивают об этом.

    PS: Честно говоря, не встречал видеофайлы с вшитыми макросами (кроме интерактивных менюшек), так что шаги 2-5 - маловероятны.
    Ответ написан
  • Как из столбца с пустыми и заполненными ячейками собрать столбец только с заполненными ячейками?

    @alexalexes
    На Листе1, в столбце A у вас начальные данные.
    Ставите курсор на B1, вставляете формулу.
    Нажимаете Ctrl+Shift+Enter - активируете формулу для массива.
    =ЕСЛИОШИБКА(ИНДЕКС(Лист1!A$1:A$99;НАИМЕНЬШИЙ(ЕСЛИ(Лист1!A$1:A$99<>"";СТРОКА(Лист1!A$1:A$99));СТРОКА(B1)));"")

    Протаскиваете выделенную ячейку B1 на необходимую длину по столбцу.
    Ответ написан
    3 комментария
  • Как из многомерного массива вывести не все элементы, а только, допустим, имена?

    @alexalexes
    Скорее всего $massiv - это индексный массив, и имена находятся по индексу 1 (вторые).
    foreach ($model as $massiv)
            {
                    echo  $massiv[1] . "<br>";              
            }

    Если в массиве индексы пропущены, то вам нужно переиндексровать этот массив, и тогда точно получите результат по индексу 1.
    foreach ($model as $massiv)
            {
            $massiv_new = array_values($massiv);               
        echo   $massiv_new [1] . "<br>";              
            }
    Ответ написан
    Комментировать
  • Как добавить v-bind:style к первому элементу, созданному в цикле v-for?

    @alexalexes
    У блока c v-for нужно объявить индекс:
    v-for="(item, index) in items"
    тогда:
    v-bind:style="index == 0 ? {стили для первого элемента} : {}"
    Ответ написан
    3 комментария
  • Как сгенерировать нечётное рандомное число?

    @alexalexes
    Нечетное число n можно выразить через параметр t:
    n = 2* t - 1
    Будем рандомизировать параметр t и переводить его в n, но нужны минимальное значение и максимальное.
    min = 2 * t - 1, отсюда:
    t_min = (min + 1) / 2
    max = 2 * t - 1, отсюда:
    t_max = (max + 1) / 2
    Деление, скорее всего целочисленное.
    Получается:
    var n_random = 2 * randomEvenInt((min + 1) / 2,  (max + 1) / 2) - 1;
    Ответ написан
    Комментировать
  • Как очистить корзину после заказа?

    @alexalexes
    Посмотрите функцию showCart. При каких условиях она рисует пустую корзину, такое состояние поставьте в cart.
    function delGoods()
    {
        cart = {}; // ... я поставил пустой объект, к примеру.
        saveCart();
        showCart();
    }
    Ответ написан
    Комментировать
  • Как в js div тянуть другому div?

    @alexalexes
    Копать в математику 7 класса или в алгебру 1 курса универа, раздел "линейные функции".
    Дано:
    1. координата курсора мыши в момент захвата блока: (x1, y1);
    2. координата курсора мыши после протягивания: (x2, y2);
    3. координата центра красного блока: (x3, y3);
    4. координата центра синего блока: (x4, y4);
    Проблема 1 - как определить, можно двигать блок или нет?
    Ответ 1.
    Замечаем, что точки (x1, y1) и (x2, y2) - образуют линию L1 - это прямая траектория движения мыши.
    А точки (x3, y3) и (x4, y4) - образуют линию L2 - это прямая траектория, по которой должен двигаться один из квадратов.
    L1 имеет коэф. линейной функции k1, который вычисляется как k1 = ((y2 - y1) - b1) / (x2 - x1);
    L2 имеет коэф. линейной функции k2, который вычисляется как k2 = ((y4 - y3) - b2) / (x4 - x3);
    Но на самом деле, нас интересуют не эти коэф-ты, а дифференциалы, поэтому b1, b2 - постоянные коэф. можно откинуть:
    d1 = (y2 - y1) / (x2 - x1);
    d2 = (y4 - y3) / (x4 - x3).
    Когда можно двигать блок?
    Когда d1 ~ d2 c некоторой погрешностью r, то есть:
    |d1 - d2| <= r1
    Коэф. ошибки r1 будет больше, чем меньше (y2 - y1), (y4 - y3), (x2 - x1), (x4 - x3).
    Коэф.-ты d1, d2 имеют невычисляемые случаи, когда x2 = x1, или когда x4 = x3, но строгости равенства трудно добиться, поэтому проверяем на коэф. ошибки малой величины r2.
    (x2 - x1) <= r2 или (x4 - x3) <= r2.
    Сначала проверяется возможность вычисляемости d1 и d2.
    если они вычисляемые и критерий |d1 - d2| <= r1 выполняется, то блок двигать можно.
    Если один из диф-лов не вычисляем, а другой - вычисляем, то блок двигать нельзя.
    Если оба диф-лов невычисляемы, то если у (y2 - y1) и (y4 - y3) знак результата одинаков, то блок двигать можно.
    Это только конец первого этапа, дальше вам пригодятся d1, d2 коэф.-ты, а также нужно вычислить интервал соприкосновения блоков, но эта уже другая история.
    Ответ написан
    Комментировать
  • Как отследить появление элемента на экране и получить его id?

    @alexalexes
    Самым ленивым способом эту функцию можно переписать так:
    var block_show = []; // начальный массив, можно не инициировать null-ами
     
    function scrollTracking(){
      var wt = $(window).scrollTop();
      var wh = $(window).height();
      var elems = $();  // тут пишем селектор для выбора коллекции элементов, позиции которых нужно отследить
      var elem_count = elems.length;
     // перебираем элементы, и выводим что появилось на экране, что нет.  
      var et = null, eh = null;
    for (var i = 0; i < elem_count; i++)
      {
     et = elems[i].offset().top;  // тут уже получаем параметр от i-ого элемента
       eh = elems[i].outerHeight(); // тут уже получаем параметр от i-ого элемента
     
      if (wt + wh >= et && wt + wh - eh * 2 <= et + (wh - eh)){
        if (block_show[i] === undefined || block_show[i] === null || block_show[i] === false) { // анализ block_show тоже от i-ого элемента
          console.log('Блок ' + i + ' в области видимости');
        }
        block_show[i] = true;  // установка block_show тоже от i-ого элемента
      } else {
        if (block_show[i] === undefined || block_show[i] === null || block_show[i] === true) { // анализ block_show тоже от i-ого элемента
          console.log('Блок ' + i + ' скрыт');
        }
        block_show[i] = false; // установка block_show тоже от i-ого элемента
      }
      } // конец цикла обхода отслеживаемых элементов
    }

    Обратите внимание, что в if-ах проявилось сравнение с undefined, это позволяет не создавать первоначальный массив, наполненный null-ами, но можно наполнить по числу отслеживаемых элементов. И все сравнение идут по === это позволяет учитывать типы переменных при сравнении, оно более строгое.
    Ответ написан
  • Как написать SQL запрос для данного случая?

    @alexalexes
    Сначала обновите записи в таблице checkanaliz:
    update  checkanaliz set id_napravlenie = 1 where id_napravlenie = 2

    Потом удалите из таблицы napravlenie записи:
    delete from napravlenie where id = 2
    Это же элементарные действия, которые вам доступны в SQL.
    Ответ написан
  • Валидация формы, как сохранить загруженные файлы?

    @alexalexes
    Делать отдельный файловый менеджер для загрузки не подходит - можно загрузить лишние файлы, появляются трудности в редактировании/обновлении записей. AJAX валидация формы решит проблему частично - если один из файлов не пройдет, то придется загружать все файлы заново.

    У вас как раз накопился технический долг в виде реализации полноценного файлового менеджера.
    Который должен сразу после выбора пользователем файлов отправлять каждый файл по ajax на сервер. Сервер в это время складывает файлы во временный каталог пользователя, отдавая в качестве ajax-ответа его временное хэш-имя. Во время отправки формы вы уже не отправляете содержимое input[type=file], а отправляете список хэш-имен удачно загруженных файлов, а на стороне сервера если все поля валидны и файлы валидны (их можно допроверить), то просто копируете файлы из временного каталога в постоянный (или в базу, или в облако, или другой каталог облака, смотря где основное хранилище). Если какая-та проверка неудачная, то вы легко можете вернуть обратно клиенту его заполненные поля, и список загруженных файлов, указав, в каком файле какая ошибка. На стороне клиента можно восстановить как поля, так и список файлов в менеджере.
    Если не хотите в полной мере решать технический долг, то можно поступить более простым путем.
    После выбора файлов пользователем, вычитываете их содержимое объектом FileReader и складываете в кодировке base64 в скрытые поля input[type=hidden] (при окончании зачищаете input[type=file], чтобы форма была нагружена только бинарными данными из скрытых полей), это позволит вам отправлять список файлов вместе с отправкой формы и восстанавливать input[type=hidden] поля при возникновении ошибки, при возврате данных формы обратно клиенту для корректировки.
    Такой подход увеличит время отправки и получения формы, не освободит от того, что вам нужно прорисовывать состояние списка файлов на форме, освободит только от использования ajax.
    Ответ написан
    Комментировать
  • Почему возвращается ошибка Fatal error: Function name must be a string in?

    @alexalexes
    Либо у вас сервер PHP ниже версии 5.3.0 (не позволяет использовать магический метод __invoke).
    Либо попробуйте $this добавить в замыкание (где use).
    return $current($context, function ($context) use ($this, $next) {
                return $this($context, $next);
    Ответ написан
  • Ошибка при направлении на другую страницу?

    @alexalexes
    Если хотите работать с заголовками, то размещать голый html с включениями php кода нельзя, будет засоряться лог предупреждениями.
    При исполнении php файла в начале он должен молчать как рыба, если логика работы предусматривает выбор - работать сначала с заголовками, а потом выводить контент, или просто выводить контент (через print, echo и т.д.).
    То есть, заголовки должны срабатывать первыми, любое echo между выполнением header() будет нарушать порядок.
    Ответ написан
    Комментировать