Задать вопрос
Ответы пользователя по тегу PHP
  • Php маршрутизация. Чем плох такой вариант?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы не проверяете вставляемый роут, а что если я туда объект вместо строки влеплю? Если что-то влетело не так - бросайте исключение.

    Не используйте супер глобальные переменные. В начале создайте объект Request и уже с ним работайте.

    Не ясно, зачем нужны trim-ы, urldecode и т.д. Если что-то пришло не так как надо - роут не найден, и ничего более. Это не проблема роутера, что ему могут каку вбросить.

    callable - это довольно специфическая хрень. Это может быть массив из двух строк, функция, объект со строкой, просто строка. Нахрен это дерьмо. Используйте тогда уже \Closure.

    Если у вас все равно регулярки всюду - имеет смысл использовать именованные последовательности:
    |(?P<id>\d+)|
    |(?P<name>[a-Z]+)|


    Замены паттернов имеет смысл делать при вставке роута, а не на момент диспатча.

    Форматирование...gqBbWeuzy9E.jpg
    Почитайте про PSR-2

    З.Ы. Когда наиграетесь - возьмите готовое и качественное в Symfony/Silex))
    Ответ написан
    Комментировать
  • Как правильно сделать аутентификацию на php?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Попробуйте использовать пример из Symfony, но с включенным xdebug. Пройдите процесс аутинтефикации от начала запроса и до отдачи ответа. На самом деле xdebug стоит использовать в принципе для ситуаций, когда вы не знаете, что в коде происходит))
    Ответ написан
    Комментировать
  • Влияет ли количество файлов на скорость работы сервера?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Из за забитости серверной директории, то есть чем больше файлов на сервере , тем он медленнее с ними работает, так ведь?

    Нагрузка на файловую систему конечно повышается (если все файлы в одной директории), но что бы это стало ощутимо - файлов должно несколько десятков тысяч и более.
    Ответ написан
    Комментировать
  • Пишу приложение на PHP, подкинете идею, что можно еще добавить?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы хотите, что бы критику php коду давали по скрину с версткой?)) Что уж тут, скидывайте внутрянку.

    На счет идеи: как консольная обертка над inotify с логгером - вполне может быть полезно. GUI сомневаюсь, что вообще нужен.

    • Удаление файлов.
    • Редактирование.
    • Показывает размер, тип, время изменения, сколько прошло с изменения.

    Это вам вряд ли нужно. Для редактирования и удаления файлов есть огромнейшее количество программ.

    Там, где реально нужно следить за бывшими правками файлов обычно используется VCS.
    Ответ написан
    Комментировать
  • Возможно ли подделать переменную $_SERVER?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Я всегда в любых своих проектах использовал данные из массива $_SERVER напрямую.

    Использовать глобальные переменные - плохая практика. С точки зрения безопасности, тестируемости и надежности вашего кода. На счет суперглобальных: один раз при инициализации вашего приложения вытягиваете нужные для вас данные из них, проверяете и вставляете в некий объект Request, это уже данные, которым вы можете доверять, посему изменять их внутри Request нельзя. Посмотрите symfony.com/doc/current/book/http_fundamentals.html

    require_once $_SERVER['DOCUMENT_ROOT'].'/папка/файл.php'

    Так писать по нельзя. От слова "совсем".
    Используйте Composer. Подключение файлов вручную нужно только в точке входа (обычно это index.php). Опять же с точки зрения безопасности.
    Никто вам не гарантирует, что $_SERVER['DOCUMENT_ROOT'] будет правильным, да и то, что будет создан такой элемент - тоже не гарантирует.

    Исходя из этого возникает вопрос. На сколько это оправдано?

    Со всей силы оправдано.

    Но, что мне делать с массивом $_SERVER?

    По возможности - забыть про его существование)). Исключения бывают конечно же, но редко.

    Каким образом он может быть подменен или в него может быть вставлена инъекция?

    $_SERVER['DOCUMENT_ROOT'] = '/dev/null';
    
    require 'path/to/your/file.php';


    Если запустить скрипт из консоли - куча элементов $_SERVER просто не будут созданы, например QUERY_STRING

    Может быть NetBeans прав?

    Прав

    и действительно нужна обработка.

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

    Рекомендую почитать: Попросили проверить код, на что смотреть нужно?
    Ответ написан
    Комментировать
  • Почему mongodb нагружает систему до 100%?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    подскажите куда копать и что делать!

    Для начала отследить, что его так грузит. Если виновник будет найден - простить и понять.

    Если не найден: разделяйте систему между несколькими серверами.

    15к пользователей

    Это rps, или постоянное количество открытых соединений?
    Ответ написан
  • Еще раз о ActiveRecord vs. DataMapper, есть ли связи в DM?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Комментировать
  • Как сделать инклуд разных php файлов при обновлении страницы?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Как не попасть в спам ловушки при рассылке писем пользователям?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    не отправлять спам
    Ответ написан
    Комментировать
  • Как инициализировать свойства типа Объект в trait'ах PHP или существует ли возможность регистрации нескольких __construct методов в очередь?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Концепция с дефолтным объектом - это хреновая затея. Подключение к БД вы например как в свойстве класса сделаете (не объекта)?

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

    На счет вашего примера работы с БД: вам трейты тут не нужны, от слова "совсем")). Расширьте ваш Query методами, что вы хотите пихать в трейты. Класс Select вам тоже не нужен, добавьте его функционал как метод в Query. Если я правильно понимаю Query - это объект с состоянием, который в результате должен суметь создать SQL код, дык добавьте в него еще метод getSQL().

    Обратите внимание на защиту от SQL-инъекций. Что будет, если вызвать ваш Select так:

    <?php
    
    $query = new Select(
        [
            'table'  => "1;DROP TABLE products;",
            'fields' => [],
        ]
    );


    Вообще говоря: если цель понаучаться - дерзайте, если таки дело делаете - используйте Doctrine2, не стоит терять время для поделку, которая 99.99% будет хуже существующих аналогов.

    Очень вам рекомендую, почитайте PSR-2

    Чуть не забыл:

    Как инициализировать свойства типа Объект в trait'ах PHP?

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Адекватная ли фильтрация POST данных?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    ну, эта ваша защита от ничего))

    <?php
    
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    
    class InvalidRequestParam extends \InvalidArgumentException
    {}
    
    class MyController
    {
        /**
         * @param Request $request
         * @return Response
         */
        public function myAction(Request $request)
        {
            try {
                $intPostParam          = $request->request->get('intPostParam');
                $unsignedIntPostParam  = $request->request->get('unsignedIntPostParam');
                $md5GetParam           = $request->query->get('md5GetParam');
                $optionalDigitGetParam = $request->query->get('optionalDigitGetParam');
    
                if (is_null($intPostParam)) {
                    throw new InvalidRequestParam('"intPostParam" is required');
                } elseif (!is_numeric($intPostParam)) {
                    throw new InvalidRequestParam('"intPostParam" must be numeric');
                }
    
                if (is_null($unsignedIntPostParam)) {
                    throw new InvalidRequestParam('"unsignedIntPostParam" is required');
                } elseif (!ctype_digit($unsignedIntPostParam)) {
                    throw new InvalidRequestParam('"unsignedIntPostParam" must be digit');
                }
    
                if (is_null($md5GetParam)) {
                    throw new InvalidRequestParam('"md5GetParam" is required');
                } elseif (!preg_match('/^[\da-f]{32}$/', $md5GetParam)) {
                    throw new InvalidRequestParam('"md5GetParam" must be correct md5 hash');
                }
    
                if (!is_null($optionalDigitGetParam) && !ctype_digit($optionalDigitGetParam)) {
                    throw new InvalidRequestParam('"optionalDigitGetParam" must be digit or null');
                }
    
                // Тут ваша бизнес логика
    
                return new Response('All params correct');
            } catch (InvalidRequestParam $e) {
                return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
            } catch (\Throwable $e) {
                return new Response('Some thing went wrong', Response::HTTP_INTERNAL_SERVER_ERROR);
            }
        }
    }
    Ответ написан
  • Как и где можно получить хороший стиль программирования на PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Читать: Макконнелл "Cовершенный код"
    Учить: Symfony
    НЕ учить: Laravel (почему читаем тут, ответ господину regretful)
    Если будете следовать требованиям выше в ссылке - рост будет быстрее
    Ответ написан
    Комментировать
  • Адекватный ли способ защиты админки?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Защита на глобальных переменных - это не самая хорошая идея. В любой точке кода строка
    $_SESSION['admin'] = 1;
    отключит ее.

    В своей практике наталкивался на случаи, когда даже сами сотрудники добавляют в uploads вредоносный код, под видом невинных файлов (я уже молчу про анонимусов, которым захочется вас взломать). А в вашем случае взлом будет еще и нереально легким.
    -- --
    Контроль доступа как правило имеет смысл делать в экшнах, а не в конструкторе контроллера.
    -- --
    echo $e->getMessage(); - вот это плохая идея. Не выводите клиенту текст исключения, прописывайте его явно. Что будет, если словите исключение с куском SQL? Будете показывать структуру вашей БД кому попало?
    -- --
    Бросание исключения после редиректа обычно бессмысленно. Вы уже знаете ответ для клиента, завершайте процесс.
    -- --
    Кстати, фатальные исключения - это не круто, это признак говнаря, не делайте так.
    Ответ написан
  • Какими знаниями должен обладать Middle и Senior php developer?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    мне не приходилось сталкиваться со многими вещами, с абстракциями, неймспейсами, точнее я понимаю, что они делают и как работают, но сам не использую, так как не вижу смысла.

    Что ж - тогда нужно столкнуться. Мидл отличается от Джуна не некими "мистическими знаниями", а опытом решения не стандартных задач.

    Что касается используемых фреймворков вами - чем раньше перейдете на Symfony - тем быстрее вырастите. Безусловно, для своих задач yii - не плох, но это средне-маленькие проектики, для больших - это скорее плохой выбор, чем хороший (экспоненциальное разрастание моделей в случае больших команд - это убийственная практика). Kohana на пару с CodeIgniter - вообще учат тому, как писать не стоит((

    Собственно чего я набросил на kohana?
    1. Фреймворк не должен меняться, и не должен быть "в перемешку" с вашим кодом. Слишком велик соблазн что-то поменять во фреймворке. Как следствие - обновление части кода с фреймворком усложнится.
    2. Явная инициализация всех подсистем проекта при загрузке. Зачем? Велика вероятность, что вообще все что там на каждый запрос не нужно.
    3. Больше автолоада богу автолоада. Есть принятые стандарты PSR-0 и PSR-4, используйте их. Поймете зачем нужны неймспейсы. А кукули типа My_Very_Perfect_Controller - это практика 2000-х.
    4.
    <?php defined('SYSPATH') or die('No direct access allowed.');

    Эта защита имеет смысл только в случае, если ваш код в публичном доступе, чего вообще-то быть не должно. По хорошему в публичном каталоге должен быть только один исполняемый php файл index.php
    5. Статика - это путь к бесконтрольной связности проекта. Код с ее использованием тяжело поддается тестированию и изменению.
    6. ActiveRecord для больших проектов - это самоубийственная практика, увы. Передавая модель куда-то вы передаете не только данные, но и подключение к БД. Как следствие код, который со всей силы не должен иметь возможность делать запросы к БД - может это делать и будет.

    Почитайте на досуге Попросили проверить код, на что смотреть нужно?
    Ответ написан
    1 комментарий
  • Можно ли написать балансировщик на PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    php для балансировки отдачи файлов... это хреновая затея, это ж stateless язык! А вот для контроля доступа, но балансировкой nginx-ом - это норм. Файлы можно шардировать через mogilefs, через php вытягивать урл шарда, а отдачу производить уже nginx-ом через X-Accel-Redirect
    Ответ написан
    Комментировать
  • PHP | Что по вашему мнению не так в функции получения IP пользователя?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    @ - это плохо, очень. используйте array_key_exists + валидация по типу. В глобальных и суперглобальных переменных может быть что угодно((
    Ответ написан