• Как поправить mysql запрос?

    @alexalexes
    Классика жанра - подставить что-то в секцию запроса where из данных фильтра.
    Вы можете изменить запрос в зависимости от входных параметров, но есть один подводный камень.
    Вот так делать не надо:
    $sql = "select ...
    from ...
    where 1 = 1
    ".(isset($_POST['status']) ? ' and medialib.status LIKE '.$_POST['status'] // тут сшили текст запроса и значение параметра (эти два слова нужно подчеркнуть) 
     : "")

    Прямая подстановка дает возможность проводить sql инъекции.
    Правильно нужно примерно так:
    $bind_params = [];
    if(isset($_POST['status']))
      $bind_params['status'] = $_POST['status'];
    $sql = "select ...
    from ...
    where 1 = 1
    ".(isset($bind_params['status']) ? " and medialib.status LIKE :status " // тут сшили текст запроса со специальным маркером (может использоваться знак ? )
     : "")
    foreach($bind_params as $bind_param)
    {
      // тут привязываем каждое значение параметра с маркером в запросе через функцию bind_param (интерфейс и название функции зависит от библиотеки для соединения с базой данных)
    }
    Ответ написан
    Комментировать
  • Как используя такую конструкцию .* в sql можно дать название подстолбцам, которые будут выведены?

    @alexalexes
    И мне нужно использовать такую конструкцию:
    select food.* from table

    Странное требование, но можно обойти оборачиванием.
    select food.*
    from(select t.Milk as food_Milk, t.Oil as food_Oil
            from table as t) as food
    Ответ написан
  • Какой HDD объемом 2 Тб, выбрать?

    @alexalexes
    WD Purple любой. В комиссионном магазине можно найти и 4 Тбайт за такую цену, главное, посмотреть SMART.
    Ответ написан
  • Как удалить # из url, чтобы не мешал обновлению страницы?

    @alexalexes
    Добавьте "return false" чтобы предотвратить действие по умолчанию при клике на ссылку - переход по ссылке.
    onclick="window.location.reload(); return false;"
    Ответ написан
  • Как сделать цикличный цикл php?

    @alexalexes
    Положить меню в базу данных в виде структуры:
    MENU - таблица с анонсами меню
    menu_id - код анонса меню
    public_date - дата анонса

    DISH - таблица блюд (без привязки к меню)
    dish_id - id блюда
    title - название блюда
    dish_text - текст состава

    Таблица, обеспечивающая состав меню из блюд
    MENU_CONSIST
    cons_id
    menu_id
    dish_id
    position - порядок вывода

    Имея такую структуру, можно составить запрос на вывод меню на ближайшие 30 дней:
    select *
     from menu m
      join menu_consist mc on mc.menu_id = m.menu_id
      join dish d on d.dish_id = mc.dish_id
    where m.public_date >= CURDATE()
       and m.public_date <= CURDATE() + INTERVAL 30 DAY
    Ответ написан
    Комментировать
  • Как добавить один html файл в другой с помощью {{> }}?

    @alexalexes
    Перемотать видеоролик на начало или посмотреть предыдущий видеоролик и обратить внимание на инструментарий мужика. Что он использует еще помимо классики - CSS/HTML/JS.
    Ответ написан
    Комментировать
  • Как в MODX вывести данные в зависимости от полученного значения из сниппета?

    @alexalexes
    Голый чанковый синтаксис:
    [[*alias:is=`алиас_последнего_значения_uri,_но_не_факт,_что_не_будет_пересекаться_с_одноименными`:then=`вызов_чанка_блока_или_чистый_html`]]

    С использованием сниппета If (нужно установить одноименный пакет):
    [[!If?
      &subject=`[[*alias]]`
      &operator=`==`
      &operand=`алиас_последнего_значения_uri,_но_не_факт,_что_не_будет_пересекаться_с_одноименными`
      &then=`вызов_чанка_блока_или_чистый_html`
    ]]
    Ответ написан
    Комментировать
  • Как правильно создать таблицу в которой будет храниться инфо о посте?

    @alexalexes
    Если вы хотите просто считать сколько лайков и дизлайков поставили посту, то просто введите две новые колонки в таблице постов.
    Если хотите журналировать выставление лайков и дизлайков и потом заниматься аналитикой, сколько их выставили в час, день, неделю, месяц, то создайте отдельную таблицу для лайков:
    Таблица ЛАЙКИ
    id_лайка,
    id_поста,
    id_типа_лайка, -- лайк/дизлайк
    дата_время_выставления
    Но даже журналируя лайки, можно вести их учет количества в отдельных колонках поста - одно другому не мешает.
    Других оптимальных решений реляционная модель предложить не сможет для вашей задачи.
    Ответ написан
    Комментировать
  • Как сделать подстановку в json файл?

    @alexalexes
    Вычитать файл csv в ассоциативный массив вида:
    $city_dictionary[$en_name] = $ru_name;
    И произвести замену:
    //$data['response'][0]['cities'][0] - вы уверены, что по конечному нулевому индексу находится весь список, а не один город?
    foreach($data['response'][0]['cities'][0] as $city_key => $city)
    {
      if(array_key_exists($city, $city_dictionary))
       $data['response'][0]['cities'][0][$city_key] = $city_dictionary[$city];
    }

    После этого $data можно конвертнуть обратно в json и в нем будет заменено то, что было в словаре $city_dictionary.
    PS: Метод имеет ограничение. В текущем формате ассоциативного массива $city_dictionary нельзя разместить два равноправных варианта перевода. В случае наличия альтернативного варианта русского перевода, из csv будет извлечен в массив последний вариант.
    PS2: Ассоциативный массив словаря ограничен объемом выделенной оперативной памяти скрипта.
    Для более объемного словаря целесообразно делать выгрузку в базу данных и от туда использовать словарь, либо в memcache - архитектура технологии идеально подходит под условия вашей задачи. Но использовать и ту и другую нужно имея небольшой опыт.
    Ответ написан
  • Как исправить файл стиля xsl?

    @alexalexes
    Сложно сделать first- или last- специфичный выходной элемент, так как нельзя внятно получить значение position.
    Однако, можно воспользоваться таким костылем:
    1) Вывести запятую и перенос строки впереди очередного элемента VALUES, сохранив перенос после элемента.
    2) Закомментировать лишнюю запятую в запросе.
    То есть добиться такого вывода:
    INSERT INTO table (config, allowance, tablename) VALUES --,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Voltage', 3, 'number_actual')
    ;

    Правило:
    INSERT INTO table (config, allowance, tablename) VALUES --</xsl:text><xsl:apply-templates/>
        <xsl:text>;</xsl:text>
      </xsl:template>
      
      <xsl:template match="node()[@format]">
        <xsl:variable name="allowance" select="Allowance/@value"/>
       <xsl:text>,&#10;</xsl:text> <!-- Сюда добавлены запятая и перенос -->    
    <xsl:value-of select="concat('(', $apostrophe)"/>
        <xsl:for-each select="ancestor::*">
          <xsl:variable name="element" select="local-name()"/>
          <xsl:value-of select="$element"/>
          <xsl:if test="$element='Item'">
            <xsl:value-of select="concat('[@key=', $apostrophe, $apostrophe, @key, $apostrophe, $apostrophe, ']')"/>
          </xsl:if>
          <xsl:text>/</xsl:text>
        </xsl:for-each>
        <xsl:choose>
          <xsl:when test="starts-with(@format, 'N')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'number_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'F')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'float_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'D')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'decimal_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'string_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#10;</xsl:text>
      </xsl:template>
      <xsl:template match="text()"/>
    </xsl:stylesheet>
    Ответ написан
    Комментировать
  • Почему при возведении -1000 в 1/3 степень получается Nan?

    @alexalexes
    Выражение:
    $result = -1000 ** (1 / 3);
    выполняется с таким приоритетом:
    $result = -(1000 ** (1 / 3));
    Поэтому тут нет NAN.
    Ответ написан
    Комментировать
  • Как правильно вывести массив из бд и перебрать его?

    @alexalexes
    На этом фрагменте строки:
    => '{type' =>
    у вас должно закрасться подозрение, что нужно собирать вложенный объект как-то по другому, а именно:
    $taskList[] = array( // старый способ объявления массива, можно [, но не суть
    'type' => 'Feature', 
    'id' => $row->id, 
    'geometry' => // в json-е встретилась фигурная скобка (свойство-объект) - повторяю ее открытие в своей конструкции 
    [ // это хоть и объявление массива, но в определенном режиме в JSON конвертнется в объект, так как имена свойств ассоциативные
      'type' => 'Point', 
      'coordinates' =>
        [ // а тут массив останется массивом, так как о ключах ни слова (они по индексу)
        $row->coordinates,
        $row->coordinates2
        ] // конец свойства coordinates
    ] // конец свойства geometry
    
    );
    Ответ написан
    1 комментарий
  • Какая разница между генераторами и массивами?

    @alexalexes
    https://www.php.net/manual/ru/language.generators....
    foreach (xrange(1, 9, 2) as $number) {
        echo "$number ";
    }

    Если рассказать простым языком магии, то при таком вызове внутри foreach, функция xrange определяет, что ее результат не собираются записывать в отдельную переменную, а собираются перебирать по элементам.
    Поэтому, когда выполнение интерпретатора php доходит до команды as, функция xrange выполняется до первого попавшегося yield внутри этой функции и возвращает это значение. При этом, контекст функции запоминается, а также внутренний цикл:
    for ($i = $start; $i <= $limit; $i += $step) {
                yield $i;
    }

    засыпает до того момента, пока во внешнем foreach выполнение не пройдет команду as еще раз, тогда произойдет размораживание yield и извлечение следующего значения, чтобы использовать его только как один элемент $number.
    За счет того, что as меняет режим работы вызова функции xrange, получается не извлекать все подряд.
    Ответ написан
    Комментировать
  • Как удалить элемент массива в localstorage, по нажатию на крестик, и перезаписать массив?

    @alexalexes
    Нужно использовать обертку+замыкание для обработчика, удаляющего элемент по клику.
    tasks.push(data); // тут вставили очередной элемент
    let task_index = tasks.length - 1; // узнаем его индекс по длине массива, так как он в текущей ситуации последний
    // несколько строк спустя
    b1.addEventListener("click", 
    (function(inner_task_index) // функция-обертка для изоляции контекста, сюда передается значение task_index, я специально выделил его другим именем inner_task_index, чтобы видеть контекст функции-обертки
      {
    // обертка возвращает функцию-обработчик события  для addEventListener
    return function delFromLocalSt() {
        task.removeChild(li);
            let array = JSON.parse(localStorage.getItem('task'));
            array.splice(inner_task_index, 1); // удаляем элемент по известному индексу используя механизм замыкания, используя контекст функции обертки
        localStorage.setItem('task', JSON.stringify(array));
       }
    })(task_index) // вызываем хитрую обертку, чтобы обеспечить изоляцию переменной от контекста функции createEl
    );
    Ответ написан
    1 комментарий
  • Зачем нужен multitouch на 10 касаний?

    @alexalexes
    Тоже искал на этот вопрос ответ. Из всего вороха статей и видеороликов можно сделать вывод.
    1. Для 99% задач хватит поддержки 2-3 одновременных касаний сенсора.
    2. Сенсор, который поддерживает 2 одновременных касания имеет технические ограничения, не позволяющие определять 2 касания в точках, расположенных на одной оси. В связи с этим нужно использовать сенсор с не менее 5 одновременных касаний. В нем не сэкономили на технологии изготовления, и регистрация 2-3 касаний гарантирована в любых точках.
    3. Теоретически, в сенсор на 10 касаний могли заложить более высокое разрешение в плане детализации точек касания (как бонус не экономии на технологии), что позволило бы точно захватывать более мелкие детали интерфейса. Но этот тезис нужно подтверждать либо техническими характеристиками, либо экспериментально.
    Ответ написан
    Комментировать
  • Как правильно организовать ссылку на значение в связанной таблице?

    @alexalexes
    Нет смысла. Вы не для красоты в таблице Book завели свойство author_id, чтобы связывать по нему строку из таблицы Author, тем самым получать доступ ко всем свойствам по идентификатору author_id.
    PS: А вы уверены что у книжки строго один автор? Или это для вас просто учебный пример?
    Ответ написан
  • Где в Chrome, нужно смотреть JS-события, применённые к элементу во время какого-либо действия с этим элементом?

    @alexalexes
    F12. Раздел "Элементы", выбираете элемент, на котором нужно посмотреть обработчик события. В области интерфейса для просмотра свойств элемента выбираете вкладку "Прослушиватели событий". Выбираете вид события, и выбираете точку входа в JS коде на это событие. Далее, при просмотре кода JS на вкладке "Источники" выбираете, где вам поставить точки останова, чтобы словить остановку выполнения обработки события.
    PS: Такой метод исследования работает только на ванильном или слабо прототипированном коде, написанный без применения библиотек и фреймворков. При использовании библиотек и фреймворков точки привязки событий будут указывать, как правило, на одну единственную функцию в этой библиотеке, отвечающей за высокоуровневый байндинг событий. В этом случае нужно изучать, какие инструменты для отладки есть в самой библиотеке или фреймворке.
    Ответ написан
    Комментировать
  • Как сделать, чтобы неподходящие под условие не забивали лимит?

    @alexalexes
    Вариант А.
    Вы не можете гарантировать, что любой файл изображений, сведения о которых храните в базе, будет доступен физически в любой момент.
    Придется неопределенное число раз постучаться в базу и протестировать каждую запись о файле, существует ли он физически. При тесте формируем список мертвых и живых файлов. После того, как протестировали нужное кол-во живых файлов, можно делать итоговый запрос с оглядкой на список мертвых файлов.
    $need_count = 10;  // сколько требуется файлов для выборки
    $alive_count  = 0;  // сколько живых файлов
    $is_need_repeat = true; // требуется повторить попытку получить живые файлы
    $death_list = []; // сюда накапливаем список id мертвых файлов
    $alive_list = []; // сюда накапливаем список id живых файлов
    while($is_need_repeat) // Если можно делать итерационную попытку и пока не набрали нужное количество живых файлов
    {
    // Этот запрос, чтобы прощупать целостность файлов, достаточно получить только те атрибуты, которые позволяют проверить его путь и запомнить id.
    $database->setQuery("
        SELECT id
        from блаблабла
        WHERE блаблабла 
                   ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса, они нам не нужны
                   ".(count($alive_list) > 0 ? : ' and id not in ('.join(',',$alive_list).') ' : '')." -- отсеиваем живые файлы из запроса, мы их уже проверяли
        ORDER блаблабла
    limit 0,".($need_count - $alive_count)); // делаем лимит по оптимистичному сценарию, как будто можем получить список файлов, и все они будут живые, но только то кол-во, которое недостает
    while($row = mysql_fetch_assoc($request))
    {
      if(file_exists('/www/ПУТЬ/'.$row['id'].'_100.jpg'))
      {
        $alive_list[] = $row['id']; // файл живой, заносим его id в список
      }
      else
      {
        $death_list[] = $row['id']; // файл мертвый, заносим его id в список
      }
      $curr_alive_count = count($alive_list);
      $is_need_repeat = $curr_alive_count > 0 && $curr_alive_count > $alive_count && $curr_alive_count < $need_count; // необходимо продолжить попытки, если на текущей итерации получили хоть один живой файл, живых файлов на этой итерации оказалось больше, чем на предыдущей, и их кол-во не достаточно до необходимого
      $alive_count = $curr_alive_count; // вписываем кол-во живых файлов на текущей итерации для проверки в будущем цикле (чтобы сравнить результаты двух циклов)
    }
    }
    // теперь можно сделать нормальный запрос, исключив мертвые файлы:
    $database->setQuery("
        SELECT *
        from блаблабла
        WHERE блаблабла 
                   ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса
        ORDER блаблабла
    limit 0,".$need_count);

    Вариант Б.
    Вы можете гарантировать, что контролируете целостность файлов.
    Тогда в таблице изображений делаете колонку is_del. Когда удаляете файл, вы должны пометить запись о файле в базе как удаленную по этому атрибуту.
    Если вы все таки частично контролируете целостность, то в определенный период времени (например, запускать скрипт по cron раз в час, сутки) вам нужно пройтись по всему списку файлов в базе и проверить целостность каждого файла, и внести актуальную метку is_del.
    Тогда получать живые файлы будет чуть-чуть проще:
    $database->setQuery("
        SELECT *
        from блаблабла
        WHERE блаблабла 
               and is_del is null -- или нулю, в зависимости, что будет по умолчанию
        ORDER блаблабла
    limit 0,".$need_count);
    Ответ написан
    4 комментария
  • Как изменить exe file?

    @alexalexes
    Если приложение не предусматривает использование отдельного конфиг файла с настройками видеорежима, то в общем случае - никак. Подобные характеристики заложены в файлах проекта у разработчиков приложения. Естественно, эти исходные файлы вам никто не предоставит.
    Есть вариант сделать реверс инжиниринг exe файла и попытаться найти нужные байты, отвечающие за видеорежим.
    Но если вы задаете такой вопрос, значит вы не знакомы с реверс инжинирингом. Чтобы им пользоваться, мало простого знакомства с процессом декомпиляции, нужно на этом собаку съесть.
    Ответ написан
    Комментировать
  • Какие проблемы могут возникнуть при работе программы с файлом БД из удаленной папки?

    @alexalexes
    Вариант с стандартным сервером БД, решающий все вопросы выше пока исключен.

    Вы не ищите легких путей. Перестаньте мыслить файлами с общим доступом в качестве хранилища. Эту роль как раз целиком и полностью берет полноценная СУБД в вашем кейсе.
    Ответ написан
    Комментировать