Задать вопрос
  • Как организовать поиск в 5-и таблицах БД PostgreSQL?

    @alexalexes
    Обратите внимание на форму кавычек.
    Если используется " " - то переменные внутрь вставлять можно напрямую "text $search какой-то текст".
    Если ' ', то переменную можно только приклеить 'text ' . $search . ' какой-то текст'.
    Если текст - это текст запроса, то за вставку или приклеивание параметров напрямую разработчика надо ругать и бить.

    PS: Устаю напоминать, никогда не склеивайте параметры запроса с текстом запроса напрямую - это дверь для sql-инъекции!
    php.net/manual/ru/function.pg-query-params.php
    Ответ написан
    Комментировать
  • Какой способ получения IP лучше?

    @alexalexes
    Как договоритись с админом сети, или как принято на хостинге.

    https://habr.com/post/177113/

    //здесь не понятно зачем нужна собака @, и зачем фильтровать и обязательно ли это делать?

    Собака отключает логирование ошибки в вызове элемента массива.
    Например:

    $client = $_SERVER['HTTP_CLIENT_IP'];

    Если вдруг в массиве $_SERVER не окажется элемента с ключом 'HTTP_CLIENT_IP', то в лог-файл сервера запишется предупреждение об этом.
    Чтобы предупреждений не было можно поступить так:

    $client  = array_key_exists('HTTP_CLIENT_IP',  $_SERVER) ?  $_SERVER['HTTP_CLIENT_IP'] : '';


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

    @alexalexes
    Вот вам в div.
    В input-е используется свойство value для отображения значения.
    А div надо набивать содержимым.
    Вот и вся разница.
    Пример элемента вывода:
    <div id="i4"></div>
    Код вывода:
    document.getElementById('i4').innerHTML = Number(n1)*0.5;
    Ответ написан
    Комментировать
  • Почему возникает "неровная прокрутка"?

    @alexalexes
    Анимация прокрутки происходит всегда за фиксированное время (сейчас 500 мс).
    Если top получается 100 пикселей, то промотка будет казаться медленней, а если 1000 пикселей - то быстро.
    А нужно сделать так, чтобы время анимации было пропорционально длине "прыжка".
    var anim_speed = 300; // пикселей в секунду
    var anim_time = (top * 1000) / anim_speed; // 1000 - поправка на милисекунды
    //анимируем переход на расстояние 
    $('body,html').animate({scrollTop: top}, anim_time);

    PS: Обычная школьная формула по физике: время равно расстоянию деленное на скорость.
    Ответ написан
    Комментировать
  • Какая разница между public function и public static function?

    @alexalexes
    Если делать статику:
    class any_class
    {
      public static function add()
      {
      }
    }

    ... то, чтобы воспользоваться методом, не надо создавать объект, классу которого принадлежит этот метод, он доступен, если есть описание класса.
    any_class::add()
    А так лишний раз создавать объект по любому поводу, чтобы воспользоваться методом add().
    class any_class
    {
      public function add()
      {
      }
    }

    $any_class_object = new any_class;
    $any_class_object->add();

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

    @alexalexes
    Измените структуру документа:
    <div class="info_block one">
    <div class="one_1"></div>
     <div class="one_2"></div>
    </div>
    <div class="info_block two">
    <div class="two_1"> </div>
    <div class="two_2"> </div>
     </div>
    <div class="info_block three"> 
    <div class="three_1"> </div>
    <div class="three_2"> </div>
    </div>
    <div class="info_block four">
    <div class="four_1"> </div>
    <div class="four_2"> </div>
     </div>

    Определите стили для инф. блоков.
    По умолчанию, все инф. блоки скрыты, нескрытым может быть блок, имеющий в себе класс active:
    <style>
    div.info_block
    {
      display: none;
    }
    div.info_block.active
    {
      display: block;
    }
    </style>

    Подключаете JQuery:
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>

    Определяете функцию, которая будет устанавливать убирать и устанавливать класс active на инф. блоках.
    <script>
    function display_div(class_name)
    {
      $('div.info_block').removeClass('active');
      $('div.info_block.' + class_name).addClass('active');
    }
    </script>

    Делаете видимым первый блок:
    <script>
    display_div('one');
    </script>

    Вставляете в пункты меню обработчик onclick для вызова функции отображения текущего инф. блока:
    <ul>
      <li onclick="display_div('one')">Первый блок</li>
      <li onclick="display_div('two')">Второй блок</li>
      <li onclick="display_div('three')">Третий блок</li>
      <li onclick="display_div('four')">Четвертый блок</li>
    </ul>
    Ответ написан
    1 комментарий
  • Загрузка файла в хранилище Postgres без прав суперпользователя на PHP?

    @alexalexes
    Если нельзя управлять пользователями, то нужно создать такое приложение, которое может подключиться от имени другого пользователя с нужным набором прав.
    Только это приложение должно быть запущено на сервере на постоянной основе и уметь обмениваться по http с PHP через curl.
    Ответ написан
    1 комментарий
  • Почему выводит кракозябры?

    @alexalexes
    Если у вас используется сервер PHP 5.6 и выше, то нужно отправлять браузеру http-заголовок, в какой кодировке скрипт будет отдавать данные, в независимости в какой кодировке сам файл скрипта, и даже в том случае, если вы нормально отдаете HTML-структуру документа.
    //установка кодировки вывода
      header('Content-Type: text/html; charset=utf-8');

    Если не знаете, в какой кодировке будут данные, то нужно идентифицировать кодировку, и вписать ее в header():
    echo mb_detect_encoding(implode("\n", $output));
    ----------------------------
    Кодировку подобрал для заголовка методом тыка, так как mb_detect_encoding() не вывел явного ответа.
    У меня оказалась CP866:
    header('Content-Type: text/html; charset=CP866');
    $data = 'help';
    exec(escapeshellcmd($data), $output, $return);
    echo implode("<br>", $output)."<br>Return Code: ".$return;
    Ответ написан
  • Как проверить, являются ли дата и время автоматическими?

    @alexalexes
    Простукивайте параметр Type в реестре Windows:
    HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
    Значения: NoSync - не используется синхронизация, и NTP - используется.
    Ответ написан
    Комментировать
  • Можно ли совместить распаянную и съемную ОЗУ?

    @alexalexes
    В ноутбуке используется тип памяти DDR3L, у которой напряжение питания 1,35 В (буква L как раз это обозначает), против вашей DDR3 (NT4GC64B8HG0NS-DI), у которой питание 1,5 В.
    Вместе такой тандем не запустится.
    Ответ написан
    3 комментария
  • Как из базы MySQL вывести данные в Android Studio?

    @alexalexes
    Между вашим клиентским приложением и MySQL должно быть серверное приложение, которое будет непосредственно выполнять запросы на MySQL и предоставлять данные и API вашему приложению.
    Легче всего поднять PHP или node.js сервер и связать его с MySQL, обмен данными с клиентом - в JSON формате.
    Ответ написан
    Комментировать
  • Можно ли картинку в Windows Forms преобразовать в кнопку или ссылку?

    @alexalexes
    Повесьте *Click обработчик на тот объект, который вы хотите использовать как кнопку.
    Не принципиально, как он выглядит, лишь бы имел геометрические размеры.
    Ответ написан
    Комментировать
  • Можно ли изменить внешний вид диалогового окна Windows Forms?

    @alexalexes
    По-моему, нужно просто выбрать другой тип проекта - WPF.
    Ответ написан
    Комментировать
  • Как вывести много вложений вместе с постами?

    @alexalexes
    Я обычно выгребаю всю вложенность одной портянкой (добиваемся уникальности имен полей, добавляя необходимые префиксы):
    Select p.id as post_id, p.create_date as p_create_date, p.title as p_title, p.text as p_text,
               img.id as img_id, img.name as img_name,
              v.id as v_id, v.name as v_name
    from posts p
    left join images img on img.post_id = p.id
    left join videos v on v.post_id = p.id

    А потом в PHP собираю ассоциативный массив с нужной глубиной вложенности:
    $out = [];
    foreach($rows as $row)
    {
      $post = &$out[$row['POST_ID']]; //ссылка на элемент массива первого уровня - пост
      $post['CREATE_DATE'] = $row['P_CREATE_DATE'];
      $post['TITLE'] = $row['P_TITLE'];
      $post['TEXT'] = $row['P_TEXT'];
       if(!is_null($row['IMG_ID']))  
      {
          $image = &$post['IMAGES'][$row['IMG_ID']]; //ссылка на элемент массива второго уровня - элемент массива изображений
          $image['NAME'] = $row['IMG_NAME'];
      }
       if(!is_null($row['V_ID']))  
      {
         $video = &$post['VIDEOS'][$row['V_ID']]; //ссылка на элемент массива второго уровня - элемент массива видео
          $video['NAME'] = $row['V_NAME'];
      }
    }

    На выходе получаем $out - вполне себе структуированный объект, пригодный для дальнейшей обработки и выдачи на фронтенд.
    PS: Использование ссылок ускоряет сборку таких структур.
    Например, чтобы заполнить несколько свойств элемента массива IMAGES, который вложен, быстрее будет отрабатывать конструкция:
    $post = &$out[$row['POST_ID']];
    $image = &$post['IMAGES'][$row['IMG_ID']];
    $image['NAME'] = $row['IMG_NAME'];
    $image['WIDTH'] = $row['IMG_WIDTH'];
    $image['HEIGHT'] = $row['IMG_HEIGHT'];


    Чем вот такое нагромождение для заполнения каждого свойства:
    $out[$row['POST_ID']]['IMAGES'][$row['IMG_ID']]['NAME'] = $row['IMG_NAME'];
    $out[$row['POST_ID']]['IMAGES'][$row['IMG_ID']]['WIDTH'] = $row['IMG_WIDTH'];
    $out[$row['POST_ID']]['IMAGES'][$row['IMG_ID']]['HEIGHT'] = $row['IMG_HEIGHT'];
    Ответ написан
  • Как сделать кроссбраузерное оформление для Select?

    @alexalexes
    select-ы, чекбоксы, полосы прокрутки - это самые некастомизируемые элементы веб интерфейса.
    В качестве альтернативы используют JQuery ui виджеты.
    Ответ написан
    Комментировать
  • Почему windows xp не видит андроид-смартфоны?

    @alexalexes
    https://www.asus.com/ru/support/FAQ/1011564/
    Попробуйте установить драйвер с сайта производителя гаджета.
    Ответ написан
    Комментировать
  • Нормально ли что бекенд отдает сырые данные на фронт?

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

    @alexalexes
    Упражнение
    (# Id -- идент. упражнения
    * Grp_Id -- идент. группы мышц, внеш ключ
    * Name -- Название,
    * Descr -- Описание
    )

    Мышцы
    (# Id -- идент. мышцы,
    * Grp_Id -- идент. группы мышц, внеш. ключ,
    * Name -- Название
    )

    Группа мышц
    (# Id -- идент. группы мышц,
    * Name -- Название
    )

    Воздействие упражнения
    (# Id -- идент. воздействия,
    * Ex_Id -- идент. упражнения, внеш. ключ
    * Мus_Id -- идент. мышцы, внеш ключ
    * Power -- сила воздействия или просто целевой флаг
    )

    Если вы говорите про связь "много-много", то знайте, что за ней прячется еще одна табличка, реализующая ассоциативную связь между основными объектами, и по сути это две связи через таблицу. В вашем случае, это Воздействие упражнения. Если взять концепцию графа ("много-много" - это всегда граф, а точнее его ребрышки). То, упражнения и мышцы - это вершины графа, а ребра - это как раз пары [ex_id, mus_id], вес ребра - сила воздействия. В этой же табличке можно было бы хранить ребра воздействий на группы мышц [ex_id, grp_id], в этом случае mus_id будут заполнены null-значениями, но задание говорит, что нужно связать группы мышц с упражнениями.
    Ответ написан