• Как отслеживать посетителей на сайте, которые перешли из мессенджеров?

    Vindicar
    @Vindicar
    RTFM!
    document.referer - на клиентской стороне.
    На серверной стороне - HTTP-заголовок Referer.
    А вообще - нет, способа нет, так как ссылки во внешних приложениях не дают Referer.
    Есть обходные пути.
    1. Включать в ссылку какой-то referer ID, тогда можно будет отследить, кто перешел на сайте по этой конкретной ссылке.
    2. Если мессенджер использует страницу с предупреждением о переходе по ссылке (как Steam, например), то тогда переход будет с этой страницы, и его можно будет отследить. Но это зависит от мессенджера.
    Ответ написан
    Комментировать
  • В чем суть такой записи в reset.css?

    nowm
    @nowm
    Это специфичное для blockquote определение, которое Eric Meyer (автор reset.css) позаимствовал у Paul Chaplin. Первая строка content: "" делает так, чтобы у blockquote исчезли кавычки — на случай, если вторая строка content: none не поддерживается браузером, потому что первая строка — это CSS 2, а вторая — это CSS 2.1. В одну строку их записать нельзя, потому что по стандарту для свойства «content» нельзя комбинировать ключевые слова «normal» и «none» с другими значениями.

    Вообще, когда встречается перечисление одного и того же свойства с разными значениями, это делается для того, чтобы обеспечить совместимость с разными браузерами. То есть, если, например, браузер не поддерживает «content: none», он применит «content: ""», а другую запись проигнорирует.

    Обычно дублирующие записи располагаются в определённом порядке. Первой записью идёт самый плохой вариант, который должен сработать везде. Затем идёт вариант, который более полно описывает вашу цель. Пример:

    .some-class {
        background: #e66465;
        background: linear-gradient(#e66465, #9198e5);
    }


    В этом коде, если браузер поддерживает градиентный фон, он сначала прочитает, что нужно использовать цвет «#e66465», а потом это перезапишется записью «linear-gradient», и итоговое значение будет «linear-gradient(#e66465, #9198e5);». Если же браузер не поддерживает градиент, он сначала прочитает, что нужно использовать «#e66465», а потом увидит неподдерживаемое определение «linear-gradient», проигнорирует его, и итоговое значение будет «#e66465».
    Ответ написан
    Комментировать
  • Как привести массив к виду?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    <?php
        $arr = ['Слово 1', 'Слово 2', 'Слово 3', 'Слово 4'];
        $arr2 = array_chunk($arr, 2);
        print_r($arr2);
    Ответ написан
    Комментировать
  • Вывод ошибки размера изображения через php, если размер картинки больше 5 мегабайт, как проверить?

    @artem-dainov
    Php, java, js. Boot spring, jquery, git
    Никогда не доверяйте тому, что пользователь вам присылает. Знаю, что $_FILES можно подменить.
    Есть такая функция, в php, filesize()
    Используйте её для проверки, что-то подобное.

    <?php
    $max_size  = 1024*1024*5; // Один килобайт имеет 1024 байт. Их умножаем и получаем мегабайт. Далее умножаем на пять.
    $tmp_size = filesize($_FILES['file_img']['tmp_name'][0]);
    if ($tmp_size>$max_size) {
     echo "Ошибка, ваш файл привышает 5 мб"; exit();
    }
    ?>


    Как-то так. И еще один момент. Если вы позволяете другим пользователям загружать картинки на сайт, то это не последняя проверка с размером файла. Еще нужно проверять, не вредна ли картинка.
    Ответ написан
    Комментировать
  • Требования к современной верстке?

    @DeniSidorenko
    Хочется дополнить ответы что написали выше. Умение писать правильный код который можно будет интегрировать с движком. Часто бывает что сдают верстку, визуально вроде все окей, но код настолько не структурирован и не логичен что ужас. Много кастомных классов где не требуется. К примеру каждый слайд- в слайдере имеет свой класс и стилизуется отдельно ( когда это можно было не делать) .При выводе из базы данных - очень много проблем создает.
    Редко когда встречается хорошая аккуратная верстка, которая изначально предполагает что контент будет меняться . За частую при смене даже фото - все летит.
    Ответ написан
    Комментировать
  • Как обработать возникшую ошибку в PHP скрипте загрузки страницы?

    Stalker_RED
    @Stalker_RED
    Редирект это 3xx, а ошибка это 5xx.
    Вы не можете отдать два статуса одновременно.

    Но вы можете отдав 500 отдать и содержимое страницы.
    header('HTTP/1.1 500 Internal Server Error', true, 500);
    readfile("my500page.html");
    Ответ написан
    Комментировать
  • Как обработать возникшую ошибку в PHP скрипте загрузки страницы?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это очень хороший вопрос, по многим причинам.

    Во-первых, очень хорошо что он сам по себе поставлен. Обычно пользователи РНР не задумываются о таких "мелочах". Но на самом деле об этом должен думать каждый программист, делающий сайты
    Во-вторых, здесь мы можем видеть довольно характерный баг Апача, который действительно, почему-то не выполняет директиву ErrorDocument для 500 ошибок, полученных от РНР. Ну и вообще, завязываться на Апач во времена доминирования Нжинкса как-то не очень дальновидно.
    В-третьих, как правильно заметил Stalker_RED, сделать редирект при 500 статусе (или 500 статус при редиректе) невозможно - статус может быть только один. Да это и нет смысла делать - проще сразу на месте нужную страницу и прочитать.
    В-четвертых, текущий подход, прямо скажем, не очень оптимальный:
    - о роботах мы позаботились, о пользователе позаботились, но надо ещё не забыть и программиста. Которому как раз сообщение об ошибке-то нужно видеть во всех подробностях!
    - просто отдать нужный НТТР код недостаточно - надо бы ещё и завершить работу скрипта.
    - ловить все ошибки вручную через try-catch так себе удовольствие. И код раздувает,и поведение потом быстро не поменяешь. А если в какой-то момент захочется для отладки прикрутить whoops - это придётся по всем блокам бегать?

    Чтобы решить все эти проблемы разом, надо сделать единый обработчик ошибок. Который и подробности для программиста залогирует, и нужный заголовок отправит, и красивый хтмл юзеру покажет.

    В самом простом варианте это будет что-то вроде такого:

    set_exception_handler(function ($e)
    {
        error_log($e);
        http_response_code(500);
        if (ini_get('display_errors')) {
            echo $e;
        } else {
            include 'pages/error_500.php';
        }
    });

    В теории, конечно, можно заменить error handler на глобальный try-catch который оборачивает точку входа, но это менее удобно. Тем более, что для обработки фатальных ошибок нужен свой отдельный обработчик, и в итоге код обработки ошибок начинает занимать довольно значительный объем и лучше конечно его инициализацию вынести отдельно.
    Ответ написан
    Комментировать
  • Вопрос по тестовому заданию, масштабируемый сервис?

    insighter
    @insighter
    -First time? - Huh? (C#, React, JS)
    Возможно, чтобы реализация предусматривала быструю доработку подключения других источников данных.
    В любом случае скорее всего речь шла про функционал, а не производительность.
    Ответ написан
    Комментировать
  • Вопрос по тестовому заданию, масштабируемый сервис?

    angrySCV
    @angrySCV
    machine learning, programming, startuping
    видимо ожидается маштабирование вашего сервиса.
    для этого есть несколько подходов:
    например подходы связанные с "реплицированием", тоесть просто дублируются базы данных, что позволяет ускорять чтение (запись из-за этого наоборот будет медленней, тк требуется синхронизация записи между копиями),
    и второй подход "шардирование", когда на разных базах хранятся разные группы данных (например пользователи с 1-1000 хранятся и обрабатываются на сервере 1, с 1000 по 2000 на сервере 2 и тд).
    есть и более хитрые подходы типа умных кэшей.
    Также судя по пункту 4, ожидается какой-то "кэширующий слой" между вашим сервисом и сторонним источником котировок.
    Ответ написан
    Комментировать
  • Где найти книги или курсы по PHP, где даётся проектирование приложений с учётом ООП?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Мне в свое время помогла проработка всех шаблонов проектирования из трех источников: "Head First Design Patterns"+refactoring.guru+designpatternsphp.readthedocs.io. Каждый шаблон разбирала и пыталась понять, почему здесь нужен паттерн, а не процедурный код, обернутый в один класс. Еще помогла книга по чистой архитектуре, но она зашла уже после паттернов. Просто важно полностью для себя понять, почему эти подходы до сих пор существуют и находить для себя два-три примера, потому что один-единственный пример для изучения может быть однобоким и даже неправильным.
    Также эти книги и темы помогают вылечиться от трудностей решения задач на фреймворках, потому что наконец-то начинаешь видеть всю структуру и взаимодействия модулей и классов, а не просто примеры из документации натягиваешь на бизнес-требования)
    Ответ написан
    3 комментария
  • Как убрать No 'Access-Control-Allow-Origin' от CORS, если в URL нету знака вопроса?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В определённых случаях браузер делает preflight request. Сначала ресурс запрашивается методом OPTIONS, на который браузер рассчитывает получить ответ 200 с установленными CORS-заголовками. И только если этот запрос прошёл, то делается основной запрос.
    Проверьте, что ваш сервер нормально отвечает на OPTIONS.
    Ответ написан
    9 комментариев
  • Реализую method chaining. Как сделать так, чтобы вызов метода влиял на общий результат?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Учись задавать вопросы. То что ты сейчас понаписал - это называется проблема XY, бич всех новичков. (ну и конечно бич всех помогаек на тостере, которым некогда думать, им надо на вопрос отвечать).

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

    Потому что она решается элементарно. Надо просто понять, что просто "вызовами методов" ООП не ограничивается. иногда в методах даже пишут какой-то код. поэтому привязываться к факту вызова метода просто глупо. А информация между методами в классе передается с помощью переменных, то есть свойств класса

    class foo {
        protected $bar;
        public function bar(string $data ) {
            $this->bar = $data; 
        }
    
        private function baz() {
            if (isset($this->bar)) {
                // сделать что-то
            }
        }
    }
    Ответ написан
    1 комментарий
  • Почему при использовании iframe пишет что сайт не позволяет установить соединение?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В ответе сервера по данной ссылке есть заголовок X-Frame-Options: SAMEORIGIN. Значит сайт запрещает использование данной страницы в iframe других сайтов.
    Ответ написан
    3 комментария
  • Трюк с тернарным оператором PHP?

    @Flying
    В целом то, что вам нужно скорее ближе к новой функциональности в PHP 8: throw expression. В этом случае ваш код мог бы выглядеть, к примеру, вот так:
    Auth::check() ?? throw new AuthenticationRequiredException("Вам необходимо сначала авторизоваться");

    Однако, если вы реально хотите именно такой конструкции как ваша - то здесь, конечно, тоже есть варианты, ведь начиная с PHP 7 нам доступен uniform function call syntax и, следовательно, возможны конструкции вида:
    Auth::check() ?? (function(){echo "Вам необходимо сначала авторизоваться";})();

    Конечно, я ни в коем случае не призываю делать именно так, это плохое решение, но технически возможное.

    Существенно лучшим вариантом в этом случае на самом деле будет просто создание отдельной функции, которая будет брать на себя реакцию на такие ситуации:
    function failure(string $error): void 
    {
      // Просто для того чтобы быть ближе к вашему примеру, 
      // в реальности здесь должна быть нормальная логика обработки, 
      // к примеру тот же throw new RuntimeExcepton($error);
      echo $error;  
    }

    в этом случае ваш пример сводится к:
    Auth::check() ?? failure("Вам необходимо сначала авторизоваться");

    Помимо этого обратите внимание на то, что использование null coalescing operator ?? подразумевает, что тип возвращаемого значения функции Auth::check() - это mixed|null что выглядит странно, поскольку от результата проверки ожидается тип boolean.

    В реальности здесь лучше подходит сокращённая версия тернарного оператора, т.н. elvis operator. В этом случае ваш код может выглядеть вот так:
    class Auth {
        public static function check(): bool 
        {
            return false;
        }
    }
    
    function failure(string $error): void 
    {
        // В реальности, как указано выше, лучше использовать 
        // throw new RuntimeException($error);   
        // echo используется для примера
        echo $error;
    }
    
    Auth::check() ?: failure('Вам необходимо сначала авторизоваться');

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

    Robur
    @Robur
    Знаю больше чем это необходимо
    Это вы серезную проблему на самом деле затронули.
    варианта два
    - либо сделать блокировки на уровне БД, где над такой проблемой подумали бородатые дядьки и придумали разные решения (и вам нужна будет нормальная БД)
    - либо поменять систему так чтобы такой проблемы вообще не было - обеспечить обработку только одного заказа в один момент времени, если у вас скрипт работает в единственном экземпляре, то вы можете приостановить обработку всех остальных заказов, если уже какой-то один обрабатывается. Например завести очередь, при поступлении заявки класть ее в эту очередь, брать и обрабатывать по одному от начала и до конца, и когда один заказ полностью завершился и сформирован, брать следующий, обрабатывать его.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В целом правильно, неплохая проработка материала.
    У меня есть только пара замечаний, не относящихся напрямую к централизованному обработчику.

    • error_reporting(E_ALL & ~E_NOTICE); делать не стоит. Если только не приходится работать с адовым легаси, которое сыпет нотисами, лучше отлавливать все ошибки. Учитывая же что в 8-ке обращение к несуществующей переменной станет не нотисом а предупреждением, такая конструкция со временем станет бессмысленной. что означает - ошибки надо исправлять, а не замалчивать.
    • ini_set("error_log", __DIR__ . "/php-errors.log"); будет не очень хорошей идеей, если файл error-handler.php выше корня веб-сервера. Ошибки надо прятать подальше.
    • ini_set('display_startup_errors', 1); - это какая-то дичь, которая кочует из руководства в руководство. Никто никогда этих стартап еррорс не видел, но многие старательно пишут это заклинание у себя в коде. Это по-любому связано с настройкой сервера, и в отладке ошибок поможет примерно ничем.
    • само по себе задание настроек через ini-set ненадежно. Ошибка может случиться до того, как РНР прочитает эту команду. Задавать надо в конфигурации веб-сервера.
    • в теории можно добавить флаг или автоматическую проверку на джейсон запрос. и соответственно кодировать ответ в джейсон. Но это только для криовруких фронтендеров, которые не умеют читать НТТР статусы, а ждут что им все разжуют в джейсоне, и без error: true они не поймут, что была ошибка
    • стек вызовов может быть довольно длинным, и раздувать логи. Можно подумать о более укороченном варианте.


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

    Я только не понял, почему вопрос про error_handler. Что именно смущает?
    Ответ написан
    5 комментариев
  • Анимация при скролле, есть что кроме wow и animate.css?

    scrollmagic
    sal
    Ответ написан
    Комментировать
  • Анимация при скролле, есть что кроме wow и animate.css?

    @Deepperr
    Советую greensock. Не так просто, но оно того стоит, поверьте)
    Ответ написан
    1 комментарий