• Как переносить данные с одного листа на другой в точное время?

    @AndryG
    Добавьте в данные поле с временем добавления (например) и переносте в архив данные опираясь на его значение.

    Если триггер и запустится в 12:15, то в архив данные улетят только за нужный период
    Ответ написан
    Комментировать
  • Можно ли заменить реле на другой компонент?

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

    @AndryG
    Я за семь минут сформулировал три разных ответа. Это ж надо так умудриться задать вопрос, что хрен поможешь.

    (я использую MAMP) без него, вместо желаемого результата на странице появляется весь код PHP,
    Ну. конечно будет появляться исходный код, ибо интерпретатора нет и никто исходники не обрабатывает.

    когда подключается PHP код выходит ошибка (не находит страницу)

    Ошибки - это нормально! Нужно найти причину и устранить ее.

    Правильно заданый вопрос - 50% ответа. Тренируйтесь излагать мысли - полезно для кодинга
    Ответ написан
    Комментировать
  • Как загрузить изменения напарника?

    @AndryG
    Git push, git pull, git fetch — в чем разница? Шпа...

    Команда git push в ходе выполнения переносит все изменения, внесенные юзером, в удаленный репозиторий (например, такой как GitHub):


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

    @AndryG
    юзеры (они же физлица)
    кампании (много всяких, но для каждой одна запись, чтобы не было "Рога и копыта", "Рога и Копыта". и т.д.)
    кампании-юзеры (разные юзеры в разное время могут работать в разных компаниях)

    В таблице объявлений два поля: user_id, company_id
    Ответ написан
    Комментировать
  • Как обновить блок после удаления и добавления и получить данные для редактирования?

    @AndryG
    Очень надеюсь, что это у вас учебная задачка. Выше вам описали проблемы с безопасностью.

    В общем случае вам нужно вместо $('#message').html(data); проводить манипуляции с DOM на основании data. Это вам тоже описали выше. Когда возьметесь за реализацию, то заметите, что один и тот же html код вам приходится реализовывать и на стороне сервера средствами php и на стороне браузера через jQuery. Выкрутиться из этого можно разными способами:
    - дублировать логику в двух реализациях - самый плохой вариант
    - формировать html на стороне сервера, присылать его куски в бразуер аякс-ответом, а потом встраивать в DOM
    - отдавать сервером даные только в json, а html (именно с данными) строить всегда на стороне клиента
    - возвращать в аякс ответе сгенерированный javascript код, который будет проводить нужные манипуляции в DOM :)

    Я порекомендовал бы второй вариант.

    Делаете php функции, которые формируют:

    Строку с данными
    function htmlRowData($row){
    // return IDcomment
    }

    Строку с формой редактирования
    function htmlRowFormEdit($row){
    // return ФОРМА РЕДАКТИРОВАНИЯ
    }

    Рисуете себе API вашего аякса: какие вы запросы отправляете и какие данные вы получаете, формат ответа.
    Используем родной для javascript JSON.
    В ответе сервер может возвращать такие поля:

    showMessage: text // сообщение для юзера. Вывести алертом, всплывашкой (jGrowl) или еще как

    rowAction: "insert"/"replace"/"remove"

    rowHtml: html // html код Загрузка страницы.

    В контейнер формы выводим результат функции htmlForm(NULL) // вернет html пустой формы с кнопкой ДОБАВИТЬ
    Формируем таблицу, используем while($row = mysql_fetch($q){ echo htmlRowData($row);}

    Удаление записи. Ответ сервера
    "showMessage": "Запись 45 успешно удалена",
    "rowAction": "remove",
    "rowId": 45

    JS код находит Успешное добаление записи. Ответ сервера
    "showMessage": "Запись добавлена под номером 46",
    "formHtml": "<div>пустая форма с кнопкой добавить</div>"
    "rowAction": "insert",
    "rowHtml": "<tr data-id=46><td>46<td>это коммент записи 46...</tr>"

    JS код вставляет в таблицу новую строку, забивает новое содержимое в контейнер формы

    Проблема при попытке добавить новую запись. Ответ сервера
    "showMessage": "Упс, комментарий слишком короткий",
    "formHtml": "<div>форма с заполненными полями и кнопками добавить/отменить</div>"

    JS код забивает новое содержимое в контейнер формы (полезно данные обновлять, чтобы видеть, что же ты на сервер шлешь)

    Успешное сохранение измененной записи. Ответ сервера
    "showMessage": "Запись 44 изменена",
    "formHtml": "<div>пустая форма с кнопкой добавить</div>"
    "rowAction": "replace",
    "rowId": 44,
    "rowHtml": "<tr data-id=44><td>44<td>это новый коммент записи 44...</tr>"

    JS код заменяет (jQuery.replace() ) в таблицt строку, забивает новое содержимое в контейнер формы

    Дальше пишем серверную часть.
    Для отладки запросов делаете небольшую страничку и с и в него скидываете приходящие ответы в виде текста $('#debug_div').text(data). И добиваетесьот сервера корректных резуотаттов согласно апи.

    Переходим к брузерной части.
    Читаем про делегирование обработки событий в jQuery. Навешиваем на общий контейнер формы и таблицы обработчик событий всех кнопок добаления удаления, редактирования, сохранения редактирования. Реализовуем модификации DOM, ползуемся атрибутами data-id для поиска нужных мест в table
    Для кнопок можно применить такой вариант.
    Все кнопки имеют атрибут data-ctrl=ACTION, подвязываетесь на событие:

    $('body').on('click', '[data-ctrl]'m function(){
     const $t = $(this);
     const action = $t.data('ctrl');
      
     var ajaxData = {action: "Oops"}; 
      
    
     if('remove' === action){
      ajaxData.action = "remove";
      ajaxData.rowId = $t.closest('tr[data-id]').data('id'); // кнопка удаления находится в строке данных
    }
     ...
    })
     
      $.ajax({
        ...
        data: ajaxData,
        success: function(data){
        if("remove" === data.rowAction){
         ... 
      }
    }
    )


    И ещё совет: для обкатки решения упростите ваши данные до одного поля ID - меньше js кода писать и переписывать.
    Ответ написан
    1 комментарий
  • Текстовый редактор для больших файлов с подсветкой синтаксиса существует?

    @AndryG
    https://www.emeditor.com/
    Саме зараз відкритий бекап mysql на 4Гб. Підсвічує синтаксис. Є в меню пункт макроси, та мені він нецікавий.
    Ответ написан
    Комментировать
  • Как исправить "The repository is in the detached HEAD state" без консоли?

    @AndryG
    git-branches-newBranch - создайте новую ветку с любым именем на текущем месте.
    Так вы закрепите свой коммит, чтобы потом не искать его в reflog.

    А дальше разбирайтесь, как вы голову оторвали :)

    Поставьте на комп TortoiseGit - тоже удобная штука для работы с git, порой, там можно решать проблемы, если в косоли боитесь.
    Ответ написан
  • Как создать Глобальную переменную PHP?

    @AndryG
    https://www.php.net/manual/ru/intro.memcached.php
    Будет хранить в памяти даные указанное время. Все процессы, да и приложеня, смогут добраться до этих данных.
    Есть удобные методы для правильного изменения данных (чтобы лишнего не записать, нужное не затереть и т.п.)
    Ответ написан
    Комментировать
  • Онлайн обменник QIWIBTC с API или незамороченным фронтом для парсинга?

    @AndryG
    https://coincat.in

    Парсить ничего не надо - сервис предоставляет API

    Документация неполная, пришлют в письме более подробное описание
    Ответ написан
    2 комментария
  • Как при переходе через ссылку закрыть меню?

    @AndryG
    Перехватывайте у контейнера всплывающее событие клика и схлопывайте его.
    Ответ написан
    Комментировать
  • На чём создать конструктор документов?

    @AndryG
    https://uk.wikipedia.org/wiki/HCL_Domino

    IBM Notes та Lotus Notes
    Ответ написан
    Комментировать
  • На чем сделать онлайн-документацию для образовательных учреждений?

    @AndryG
    Lotus Notes - это база данных документов: ее основным элементом является отдельный документ. Структура документа Notes обычно определяется формой (form), содержащей в себе ряд полей.

    Крутая штука. Какось сталкивался в одном банке. Кодил понемногу. Есть что почитать и у кого спросить.
    Ответ написан
    Комментировать
  • Почему PhpStorm ругается на переменные при использовании require или include?

    @AndryG
    require 'file.php';
    /** @var int $name */
    echo $name;


    Подскажите шторму, что это за переменная и он поверит вам.
    Ответ написан
    Комментировать
  • Как принимать потребительские платежи на ФОП в Украине?

    @AndryG
    https://wayforpay.com/ давно сотрудничаю, очень доволен.
    Ответ написан
    Комментировать
  • Как в phpstorm + git сделать частичную фиксацию файла?

    @AndryG Автор вопроса
    Разобрался. В окне кода каждый измененный кусок кода можно привязать к разному changeList. Когда будем комитить changeList, то увидим что типа "только 3 изменения из 5"
    Ответ написан
    Комментировать
  • Как правильнее сделать такой функционал?

    @AndryG
    Основная фишка задачи в том, что вы указали даты, разбили прямую времени на диапазоны и прокомментировали лишь часть из них. А еще есть другие диапазоны. Например, между 17 часов 31 дек и 0 часов 1 янв, который в задаче не указан и если не указать на него ЗАКРЫТО, то так дойдем до диапазона по умолчанию и получим ОТКРЫТО.

    Я сделал двухуровневую конфигурацию - сперва выбираем широкий диапазон, задаем в нем состояние по умолчанию. Второй уровень диапазонов позволяет переопределить значение по умолчанию.

    код
    <?php
    
    header('Content-type: text/plain');
    
    ?>31 Декабря с 8:00 до 17:00
      1 Января выходной день
      Со 2 января по 8 Января 10:00 до 23:00
      9 Января с 11:00 до 23:00
    
    <?
    $dtList = [
          ['12/31', '12/31', false, [['08:00', '17:00', true]]], // открыто
          ['01/01', '01/02', false, []], // закрыто (пустой диапазон времени)
          ['01/02', '01/08', false, [['10:00', '23:00', true]]],
          ['01/09', '01/09', false, [['11:00', '23:00', true]]],
          ['01/01', '12/31', true, [['06:00', '08:00', false]]],
    ];
    
    $dt = new dt('2020-12-28');
    $finish = (new dt('2021-01-14'))->getTimestamp();
    
    do {
        $res = false;
        foreach ($dtList as [$a1, $b1, $def, $subList]) {
            $a1 = $dt->_clone($a1);
            $b1 = $dt->_clone($b1);
            if (h::testTimeRange($dt, $a1, $b1)) {
                foreach($subList as [$a2, $b2, $c2]){
                    $a2 = $dt->_clone($a2);
                    $b2 = $dt->_clone($b2);
                    if (h::testTimeRange($dt, $a2, $b2)) {
                      $res = $c2;
                      break 2; // выход с обоих циклов
                    }
                }
                $res = $def; // первый уровень сработал, а второй не имеет подх. диапазона, значит значение по умолчанию для перв. уровня
                break;
            }
        }
        echo "\n ", $dt->format(), $res ? ' open' : ' close';
        $dt->modify('+'.rand(1, 1).' hour');
    } while ($dt->getTimestamp() < $finish);


    результат
    31 Декабря с 8:00 до 17:00
    1 Января выходной день
    Со 2 января по 8 Января 10:00 до 23:00
    9 Января с 11:00 до 23:00

    28.12.2020 00:00 open
    28.12.2020 03:00 open
    28.12.2020 05:00 open
    28.12.2020 08:00 open
    28.12.2020 09:00 open
    28.12.2020 11:00 open
    28.12.2020 12:00 open
    28.12.2020 13:00 open
    28.12.2020 15:00 open
    28.12.2020 16:00 open
    28.12.2020 18:00 open
    28.12.2020 19:00 open
    28.12.2020 20:00 open
    28.12.2020 23:00 open
    29.12.2020 02:00 open
    29.12.2020 05:00 open
    29.12.2020 06:00 close
    29.12.2020 09:00 open
    29.12.2020 12:00 open
    29.12.2020 15:00 open
    29.12.2020 17:00 open
    29.12.2020 20:00 open
    29.12.2020 22:00 open
    29.12.2020 23:00 open
    30.12.2020 02:00 open
    30.12.2020 03:00 open
    30.12.2020 06:00 close
    30.12.2020 07:00 close
    30.12.2020 10:00 open
    30.12.2020 12:00 open
    30.12.2020 15:00 open
    30.12.2020 17:00 open
    30.12.2020 19:00 open
    30.12.2020 20:00 open
    30.12.2020 23:00 open
    31.12.2020 02:00 close
    31.12.2020 05:00 close
    31.12.2020 07:00 close
    31.12.2020 09:00 close
    31.12.2020 10:00 close
    31.12.2020 13:00 close
    31.12.2020 16:00 close
    31.12.2020 19:00 close
    31.12.2020 20:00 close
    31.12.2020 23:00 close
    01.01.2021 01:00 close
    01.01.2021 02:00 close
    01.01.2021 03:00 close
    01.01.2021 04:00 close
    01.01.2021 06:00 close
    01.01.2021 09:00 close
    01.01.2021 10:00 close
    01.01.2021 11:00 close
    01.01.2021 12:00 close
    01.01.2021 13:00 close
    01.01.2021 15:00 close
    01.01.2021 16:00 close
    01.01.2021 18:00 close
    01.01.2021 20:00 close
    01.01.2021 23:00 close
    02.01.2021 00:00 close
    02.01.2021 03:00 close
    02.01.2021 06:00 close
    02.01.2021 07:00 close
    02.01.2021 10:00 open
    02.01.2021 11:00 open
    02.01.2021 12:00 open
    02.01.2021 13:00 open
    02.01.2021 14:00 open
    02.01.2021 15:00 open
    02.01.2021 16:00 open
    02.01.2021 17:00 open
    02.01.2021 18:00 open
    02.01.2021 20:00 open
    02.01.2021 23:00 close
    03.01.2021 02:00 close
    03.01.2021 04:00 close
    03.01.2021 07:00 close
    03.01.2021 10:00 open
    03.01.2021 12:00 open
    03.01.2021 13:00 open
    03.01.2021 16:00 open
    03.01.2021 17:00 open
    03.01.2021 20:00 open
    03.01.2021 22:00 open
    03.01.2021 23:00 close
    04.01.2021 00:00 close
    04.01.2021 02:00 close
    04.01.2021 05:00 close
    04.01.2021 06:00 close
    04.01.2021 09:00 close
    04.01.2021 12:00 open
    04.01.2021 13:00 open
    04.01.2021 14:00 open
    04.01.2021 15:00 open
    04.01.2021 17:00 open
    04.01.2021 19:00 open
    04.01.2021 22:00 open
    04.01.2021 23:00 close
    05.01.2021 01:00 close
    05.01.2021 02:00 close
    05.01.2021 05:00 close
    05.01.2021 06:00 close
    05.01.2021 08:00 close
    05.01.2021 10:00 open
    05.01.2021 11:00 open
    05.01.2021 14:00 open
    05.01.2021 16:00 open
    05.01.2021 17:00 open
    05.01.2021 20:00 open
    05.01.2021 23:00 close
    06.01.2021 01:00 close
    06.01.2021 03:00 close
    06.01.2021 04:00 close
    06.01.2021 05:00 close
    06.01.2021 08:00 close
    06.01.2021 09:00 close
    06.01.2021 11:00 open
    06.01.2021 13:00 open
    06.01.2021 15:00 open
    06.01.2021 18:00 open
    06.01.2021 20:00 open
    06.01.2021 22:00 open
    07.01.2021 00:00 close
    07.01.2021 01:00 close
    07.01.2021 02:00 close
    07.01.2021 03:00 close
    07.01.2021 06:00 close
    07.01.2021 07:00 close
    07.01.2021 09:00 close
    07.01.2021 10:00 open
    07.01.2021 13:00 open
    07.01.2021 14:00 open
    07.01.2021 16:00 open
    07.01.2021 17:00 open
    07.01.2021 20:00 open
    07.01.2021 23:00 close
    08.01.2021 01:00 open
    08.01.2021 02:00 open
    08.01.2021 04:00 open
    08.01.2021 05:00 open
    08.01.2021 07:00 close
    08.01.2021 09:00 open
    08.01.2021 11:00 open
    08.01.2021 14:00 open
    08.01.2021 17:00 open
    08.01.2021 20:00 open
    08.01.2021 23:00 open
    09.01.2021 00:00 open
    09.01.2021 01:00 open
    09.01.2021 02:00 open
    09.01.2021 05:00 open
    09.01.2021 07:00 close
    09.01.2021 10:00 open
    09.01.2021 12:00 open
    09.01.2021 14:00 open
    09.01.2021 17:00 open
    09.01.2021 20:00 open
    09.01.2021 22:00 open
    09.01.2021 23:00 open
    10.01.2021 01:00 open
    10.01.2021 04:00 open
    10.01.2021 05:00 open
    10.01.2021 07:00 close
    10.01.2021 10:00 open
    10.01.2021 12:00 open
    10.01.2021 14:00 open
    10.01.2021 17:00 open
    10.01.2021 19:00 open
    10.01.2021 20:00 open
    10.01.2021 23:00 open


    класс dt
    <?php
    class dt extends DateTime{
    
      /** Формат отображения даты-времени по умолчанию в игре */
      const F_DEFAULT = 'd.m.Y H:i';
    
      /**
      * Создает
      *
      * @param mixed $time
      * @param DateTimeZone $timezone
      */
      public static function createRand($time = null, DateTimeZone $timezone = null){
        $time = preg_replace_callback('@/(\d+)-(\d+)/@', function($m){
             return (string)h::rand($m[1], $m[2]);
          }, $time);
        return new self($time, $timezone);
      }
    
      /**
      * $time допускает указание нескольких доп. параметров для modify() через разделитель |
      *
      * @param mixed $time
      * @param DateTimeZone $timezone
      * @return DateTime
      */
      public function __construct($time = null, DateTimeZone $timezone = null){
        $time = explode('|', $time);
        parent::__construct($time[0], $timezone);
        while($s = next($time)){
          $this->modify($s);
        }
      }
    
      /**
      * Вывод даты согласно формату
      *
      * @param string Мо умолчнию будет общепринятый в игре вариант F_DEFAULT
      * @return string
      */
      public function format($format = null){
        return parent::format(is_null($format) ? self::F_DEFAULT : $format);
      }
    
      /**
      * Клонирует текущий объект.
      * @return dt
      */
      public function _clone($modify = null){
        $res = clone $this;
        if(!is_null($modify)){
          $res->modify($modify);
        }
        return $res;
      }
    
      public function __toString(){
        return $this->format();
      }
    
    }
    Ответ написан
    Комментировать
  • Почему в интеркасса при отмене платежа он засчитывается?

    @AndryG
    $payStatus = trim($_POST['ik_inv_st']); -- больше переменная в коде не встречается


    Вам присылают уведомление о изменении статуса платежа, а вы игнорируете этот статус и выдаюете плюшки клиентам.

    Что за игра? Любопытно глянуть на сервер :)
    Ответ написан
  • Как сделать sql select по дате?

    @AndryG
    Сдается мне, что, запихнув поле в функцию приведения типа либо даты, вы убили использование индекса по полю.

    Предлагаю автору проверить сей момент. Если я оказался прав, то для использования индекса нужно поставить вилку значений и не трогать само поле:

    where  UpdateDate >= :date and UpdateDate < date_add(:date, interval 1 day)
    -- :date - полночь необходимой даты
    Ответ написан
    Комментировать