Ответы пользователя по тегу PHP
  • Как запретить срабатывание POST метода?

    @MikUrrey
    В upload.php в самом конце сделайте редирект на эту же страницу:
    //определяем протокол - HTTP/HTTPS
    $proto = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')? 'https': 'http';
    //шлем заголовок для "обновления" страницы без пересылки формы.
    //все последующие "ручные" обновления страницы будут происходить без отправки формы
    header('Location: ' . $proto . '://' . $_SERVER['HTTP_HOST'] . '/' . $_SERVER['REQUEST_URI']);
    exit;

    Вообще, это "best practice", перебрасывать редиректом после обработки формы, если не было ошибок при сохранении формы.
    Exit в конце прерывает выполнение остального кода.
    Ответ написан
    3 комментария
  • Группирование массива php по id?

    @MikUrrey
    Для этого дополните массив еще одним уровнем, индексом менеджера:
    foreach ($history_tables as $history_table) {
        //если данного менеджера еще нет в массиве, создаем его
        $manager_id = $history_table['manager_id'];
        if (!isset($data['history_tables'][$manager_id])) {
          $data['history_tables'][$manager_id] = array();
        }
        $data['history_tables'][$manager_id][] = array(
            'date'      => $history_table['date'],
            'text'      => $history_table['text'],
            'manager'      => $history_table['manager'],
            'manager_id'      => $history_table['manager_id'],
            'status'      => $history_table['status']
          );
    }
    Ответ написан
    3 комментария
  • Инсталляции сайта на Javascript?

    @MikUrrey
    Там JS не нужен по большому счету. Минимум CSS, старый добрый HTML, и PHP, который составляет 95% функциональности подобной подсистемы.
    Конфигурация отправляется из полей POST-запросами и сохраняется обычно в файлы, реже в БД. Почему реже? Потому, что системы настройки обычно настраивают так же и сам доступ к БД.
    Так же из РНР обычно и генерируются input-поля с уже заполненными value.
    Чтобы с непривычки не мучаться с импортами-экспортами-инклюдами конфигурационных файлов, рекомендую использовать JSON - это дёшево и сердито:
    $config = json_decode(file_get_contents(__DIR__ . '/.config'), true); //читаем конфиги
    //...
    file_put_contents(json_encode($config), __DIR__ . '/.config'); //пишем конфиги

    В данном примере .config - с точкой вначале, чтобы конфиги нельзя было открыть и прочитать из браузера - ведь это конфиденциальные данные. `__DIR__` - это магическая константа, путь к папке скрипта, в котором она использована.
    Сохранять конфиги можно как угодно иначе, главное, чтобы они были недоступны из web.
    Так же вам нужно предусмотреть элементарную безопасность: фильтрацию данных, полученных от пользователя.
    Резюмируя, чтобы написать минимальный конфигуратор на РНР, нужно проштудировать информацию о:
    json_encode / json_decode
    file_get_contents / file_put_contents
    htmlspecialchars / strip_tags / preg_match / filter_input

    HTML и CSS, как я понимаю, вы уже и так успешно пользуетесь.
    Ответ написан
    2 комментария
  • Как обратиться такому объекту Object ( [name:protected] => subject)?

    @MikUrrey
    values:
    /**
         * Get all values
         *
         * @return array
         */
         public function get()

    https://github.com/Webklex/php-imap/blob/master/sr...

    name:
    /**
         * Get the attribute name
         *
         * @return string
         */
        public function getName()

    https://github.com/Webklex/php-imap/blob/master/sr...

    оно ведь?
    Ответ написан
    Комментировать
  • Как добавить в базу данных несколько записей?

    @MikUrrey
    Ошибка в строке
    $query->execute(['nickname', 'email' => $nickname, $email]);

    вероятно, должно быть так
    $query->execute(['nickname' => $nickname, 'email' => $email]);

    и еще,
    'VALUES(:nickname, email)'
    должно быть так:
    'VALUES(:nickname, :email)'
    Ответ написан
    Комментировать
  • Можно ли подгружать данные на многостраничный сайт при помощи api?

    @MikUrrey
    Почему нет?)
    Сервер может делать так:
    if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
      //вот тебе данные в виде JSON
    } else {
      //а вот тебе те же данные, но в виде HTML
    }
    Ответ написан
    7 комментариев
  • Есть ли реализации packagist (composer-сервера) на PHP?

    @MikUrrey Автор вопроса
    Нашел сам. https://github.com/Rarst/release-belt
    Все делаем по инструкции, получаем репозиторий. Только веб рут должен указывать на public/index.php вместо index.php, а composer.json кроме указанных строк нужно добавлять
    "config": {
            "secure-http": false
    }

    потому что localhost, естественно, не поддерживает https.

    P.S. Да, автор гордо сообщает, что даже composer.json в пакетах не нужен. Но лучше все же с ним, потому что иначе композер может не понять, как создать автозагрузку для вашего пакета.
    Ответ написан
    Комментировать
  • Как сопоставить две базы товаров?

    @MikUrrey
    Библиотек не знаю, но, если правильно понял задачу, опирался бы в решении на следующие подсказки:
    1) Сделать инструмент консольным
    2) Пройти по каждому товару в первой базе и вывести возможные совпадения по второй
    3) Для получения совпадений разбить название на слова, короткие отбросить, по остальным составить условие типа такого: LIKE % word1 % AND LIKE % word2 % AND LIKE % word3 % и т. д.
    4) Опираясь на количество совпадений и порядок следования слов вывести процент схожести по каждой позиции
    5) Предоставить input, где можно будет ввести ID совпадения вручную или выбрать позицию с наибольшим совпадением по мнению скрипта, просто нажав Enter.

    Вот, в принципе, и всё. Только, исходя из своего опыта, скажу что 20000 это реально много для ручной обработки, даже с таким скриптом))
    Ответ написан
    Комментировать
  • Входит ли дата во временной интервал?

    @MikUrrey
    //по феншую
    function checkDateIsBetween(string $data, string $timeFrom, string $timeTo): bool
    {
        $dateObject = new DateTime($date);
        $day = $dataObject->format('Y-m-d');
        $from = (new DateTime($day . ' ' . $timeFrom))->getTimestamp();
        $to = (new DateTime($day . ' ' . $timeTo))->getTimestamp();
        $ts = $dateObject->getTimestamp();
        return ($ts < $to) && ($ts > $from);
    }
    
    //по быстроляну
    function checkDateIsBetween2(string $date, string $timeFrom, string $timeTo): bool
    {
        $ts = strtotime($date);
        list($day, $time) = explode($date);
        return ($ts > strtotime($day . ' ' . $timeFrom)) && ($ts < strtotime($day . ' ' . $timeTo));
    }
    $date = '2019-07-01 16:22:01';
    $timeFrom = '17:40:00';
    $timeTo = '23:59:00';
    $dateIsBetween = checkDateIsBetween($date, $timeFrom, $timeTo);
    $dateIsBetween2 = checkDateIsBetween2($date, $timeFrom, $timeTo);


    Как можно заметить, идея состоит в том, чтобы ко времени начала и конца "пристроить" день заданной даты, а затем получить и сравнить временные метки.
    Ответ написан
    Комментировать