Ответы пользователя по тегу PHP
  • Нужно ли соблюдать типизацию в PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Это нормальный стиль?

    Это днище.

    Не следует ли избегать приведения типов, а при необходимости явно приводить типы с помощью (int), (bool) или intval, strval и т.п.?

    Следует забыть про существование НЕ явных преобразований типов. Явное же приведение - это норм.

    Как приведение типов влияет на производительность?

    Так же, как и аэродинамика формы носа у велосипедистов.

    Почитайте на досуге: Попросили проверить код, на что смотреть нужно?
    Ответ написан
    Комментировать
  • Является ли SQL запрос уязвимым к SQL инъекции?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Является ли SQL запрос уязвимым к SQL инъекции?

    Да. Пример

    $login = '"; DROP TABLE `staff`;'

    Метод экранирования \" обеспечивает безопасность запроса от SQL инъекции или нет?

    Только в случае, если вы экранируете встраиваемые строки. Нынче это делается через плейсхолдеры.
    Ответ написан
  • Как из нескольких массивов получить один, с максимальным результатом?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    4-х уровневый цикл, сначала по $arr_ext, внутри по $arr_get, внутри по $arr_pages и внутри по $arr_query. Дальше элементы из каждого уровня конкатенируете вместе и получаете то, что хотели.
    Ответ написан
    Комментировать
  • Можно ли сделать ЧПУ URL при процедурном подходе?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Можно ли при процедурном подходе к построению движка сделать ЧПУ url?

    Да, но это пустая трата времени. Отказываться от ООП в не процедурном языке - затея глупая.

    Сделал по урокам движек для блога

    Посмотрел ваш код, грусть-печаль. Совет на будущее: если уроку больше 3-х лет даже не смотрите.

    как дошел до создания ЧПУ, задался вопросом, можно ли вообще это реализовать.

    Еще бы, роутеры обычно предполагают 1 точку входа, а у вас их куча.

    Если, кто-то сталкивался с этой задачей, подскажите как быть

    Возьмите Silex и не создавайте велосипед.

    -- --

    Если бегло по вашему коду:
    1. mysql_** не поддерживается, забудьте за существование этих методов.
    2. PSR-2, PSR-4 - почитайте и возьмите на вооружение.
    3. Для автозагрузки используйте composer. По хорошему require_once(вместо require/include/include_once) пишется всего один раз.
    4. Посмотрите twig и не пишите вперемешку php, html, js, sql, css
    5. Почитайте на досуге и постарайтесь проникнуться
    Ответ написан
    4 комментария
  • Почему не в области видимости переменные в функциях?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    php.net/manual/ru/language.variables.scope.php

    Но сразу предупрежу: глобальные переменные - это ЗЛО, не используйте их. Передавайте данные в виде аргумента в функцию.
    Ответ написан
  • Сервис авторизации Это библиотека или Приложение?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Сервис авторизации Это библиотека или Приложение?

    Дом - это 16-ти этажка, или коттедж?

    И где вообще граница между приложением и библиотекой?

    приложение - то, что реализовано для выполнения.
    библиотека - то, что реализовано для подключения.

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

    Какие угодно.
    Ответ написан
    1 комментарий
  • Как file_put_contents заставить не учитывать слэш?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    str_replace
    Ответ написан
    Комментировать
  • Нужно ли строго следовать стандартам PHP при разработки CMS?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    TL;DR
    Вы хотите потратить кучу времени просто так, увы. Если так хочется сделать cms - делайте, но возьмите за основу фреймворк, Silex например (лучше конечно Symfony, но там порог вхождения довольно высокий).

    -----------------------------------------------------------

    Use PSR-4 Luke!

    и в идеале мой namespace должен строится как:
    lib\<имя поставщика>\< namespace>\< имя класса>.... >


    Плохая идея, очень. Namespace стоит делать: < vendor >\< project >\<...>\ClassName
    Подключив зависимости через composer вы столкнетесь с тем, что путь к конечному файлу будет:
    vendor/< vendor >/< project >/.../ClassName.php
    И это вне зависимости от того, используется ли ваша cms, или нет. Путь всюду будет идентичным.

    с точки зрения проекта это было бы лаконично, понятно и удобно в функциональном плане

    Не повторяйте глупостей CodeIgniter. Ваша cms - это зависимость под вашим вендорингом, она не должна быть вперемешку с проектом на этой cms.

    PS: использовать composer не планирую, все библиотеки будут писаться мной, но планируется что для данной CMS системы могут разрабатываться сторонние модули и плагины.

    Зря, не делайте глупость. Автолоад и управление зависимостями - это решенная задача. Ваш вариант не будет лучше, примите за исходную.

    В проекте есть строгая классификация папок, грубо говоря классы модуля должны быть в папке с названием модуля внутри папки modules.....

    Что мешает сделать систему конфигурации у каждого модуля? Жесткое позиционирование файлов/каталогов - это как выровнять людей по высоте с помощью циркулярки))

    небольшие пояснения о том что подразмевается под modules | components | plugins

    Ваша классификация мягко говоря не очевидна. Обычно модуль - это некая крупная часть системы, состоящая из компонет. В вашей класификации плагин и модуль - это одно и тоже, просто разными словами.
    С моей точки зрения в этом разделении смысла нет. Это все равно некие зависимости вашего проекта на базе cms, просто они могут быть не портабельные, а разрабатываться под конкретный проект.

    А вот разделение по MVC было бы вполне не плохо. Не забудьте про консольное выполнение.

    каждый элемент системы как и сама система будут реализованы на основе MVC

    Если я правильно понимаю это получиться что-то типа HMVC. Если так - вам придется вывернуться на изнанку, что бы получилось И гибко И производительно И саппортабельно.
    Ответ написан
    3 комментария
  • Надо ли бросать исключение при приеме ошибочных (невалидных) данных?

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

    Если это валидатор - достаточно вернуть ErrorResponse объект с ошибкой.
    Если это вызов метода с не правильным данными - бросайте исключение.

    Или достаточно просто занести код и сообщение ошибки в массив errors и при выводе работать с ним?

    Не стоит, возвращайте сразу ErrorResponse.

    Полезна ли информация с Исключений при валидации во время дебагга?
    Да, так вы получаете stacktrace, помимо сообщения об ошибке.

    Работа с ошибочными данными может вызвать ошибку непосредственно при их обработке.

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

    Вот вам пример, Assert::assert - это штука из либы ko-ko-ko/assert
    public function loginAction(Request $request) : Response
    {
        try {
            $userName = $request->request->get('userName');
            $password = $request->request->get('password');
    
            Assert::assert($userName, 'userName')->match('/^[\a-z\d]{3,32}$/i');
            Assert::assert($password, 'password')->lengthBetween(6, 32);
        } catch (\Throwable $exception) {
            return new Response($exception->getMessage(), Response::HTTP_BAD_REQUEST);
        }
    
        try {
            // Your business logic here
            
            return Response();
        } catch (\Throwable $exception) {
            $this->get('logger')->error($exception->getMessage(), ['exception' => $exception]);
            return new Response('Could not login', Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
    Ответ написан
    1 комментарий
  • Как по-изящнее переписать несколько php echo строк?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Можно-ли как-то красивее переписать строки?

    Используйте шаблонизатор типа twig и будет вам счастье))

    Конкретно ваш случай - printf
    Ответ написан
    Комментировать
  • Как перейти на JAVA после PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Последние год полтора пишу продакшен в основном на Laravel.

    Попробуйте Symfony, так же рекомендую почитать

    Собственно в последнее время мне стало скучно и решил я поискать себе приключений на свою точку.

    Смените проект на более крупный))

    Глянул курс по JAVA SE (синтаксис, пару либ), куда двигаться дальше?

    Как и с другими языками: поищите вакансии на проекты, что вас могут заинтересовать и посмотрите требования.

    Что посоветуете попилить в качестве тестового проекта, чтобы посмотреть, что вообще можно реализовать?

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Для 2006-го года вполне норм.
    С тех пор на php нашли следующие напасти:
    * PSR-2 - это набор соглашений по форматированию кода.
    * PSR-4 - это правила по реализации автолодинга.
    * Composer - это библиотека для управления зависимостями и генерации автолодинга.
    * Появилось много шаблонизаторов типа twig.
    * Устоялось понятие router и это понятие реализовано практически в каждом современном фреймворке.

    Как вы считаете, такой подход приемлимый, или быдлокодинг в квадрате?

    Это не говнокод, который нет смысла поддерживать.

    Почитайте на досуге, думаю вам будет полезно.
    Ответ написан
    Комментировать
  • Есть ли аналог php-fig в javascript?

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

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    vagrant
    Ответ написан
    Комментировать
  • Что не так c моим мега php "демоном"?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    TL;DR
    * Стартуйте воркеры через supervisor
    * Для очередей используйте сервер очередей, например rabbitmq
    * Используйте PSR-3 совместимый логгер

    1. Запускалка воркеров по крону... посмотрите supervisor, не создавайте костыльных велосипедов.
    2. Лок таблицы - жирно, очень жирно)) Лок записи - еще куда ни шло. Вы даже малую нагрузку так выдержать не сможете.
    3. Воркер - такая штука, что спокойнейшим образом может отвалиться, по этому лучше ее рестратовать сразу, см. supervisor
    4. В случае проблемных тасок рискуете потерять не отработавшие.
    5. Вы не проверяете аргументы методов - вот это печально, что будет, если вызвать
    $task->start("'; DROP TABLE " . PREFIX . '_tasks');

    6. Для логгирования очень рекомендую использовать что-то на базе PSR-3, Monolog например, не плодите костылей.
    7. В воркере вы локаете таску, в таскере разлокиваете, зачем таскеру это делать? Если уж так, то лок И анлок - задача воркера.
    8. Вы когда выгребаете новые таски, смотрите на lock=0, при завершении ставите lock=0, похоже на хрень. Получается одна и та же таска постоянно будет выполняться.
    Ответ написан
  • Что не так в данном коде PHP и почему?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Проще сказать, что у вас так...
    <?php
    // Не стоит использовать глобальные И суперглобальные переменные.
    // Лучше в принципе забудьте про их существование.
    // В начале обработки сформируйте Request и уже далее с ним работайте.
    // Вы данные на входе даже не проверяете, это ужасно
     $uname = $_REQUEST['user_name'];
     $upass = $_REQUEST['user_pass'];
    
    // Это уже прошлое, mysql_*** НЕ поддерживается.
     mysql_connect("localhost", "root", "12345678");
     mysql_select_db("orders");
    
    // см. выше на счет суперглобальных переменных.
     $user_ip = $_SERVER['REMOTE_ADDR'];
    // Почитайте про PSR и забудьте про существование однострочных управляющих конструкций
     if ($_SERVER['HTTP_X_FORWARDED_FOR']) $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    
     if ($user_ip=="127.0.0.1")
        {
    // Авторизация по ip, вы серьезно?))
          echo "Добрый день Администратор<br>";
        }
        else
        {
    // Что будет, если отправить $upass="';DROP TABLE users; SELECT '1" ?
    // Это называется sql инъекция
    // Параметры подставляются по другому
           $sqlQuery = "SELECT * FROM users WHERE uname='$uname' and upass='$upass' and `real`=1";
           $result = mysql_quеry($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
    // Не используйте присваивания в условиях
           if ($user = mysql_fеtch_array($result));
              {
                echo "Здравствуйте ".$user['fio']."<br>";
              }
              else
              {
                echo "Я вас не знаю"; exit;
              }
        }
    // см. выше на счет суперглобальных переменных
     if ($_REQUEST['search'])
        { // Выводим результаты поиска
          echo "Результат поиска: <br>";
          $search_name=$_REQUEST['search'];
    // Что будет, если отправить $search_name="';SELECT CONCAT(uname, ' ', upass) AS info FROM users" ?
    // тоже sql-инъекция
    // и входящие данные вы не проверяете
          $sqlQuery = "SELECT * FROM forms WHERE satus='$search_name'";
          $result = mysql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
          while ($one_form = mysql_fetch_аrray($result))
            {
               echо $one_form['info']."<br>";
            }
    
          }
     echo "<form>Введите поиск: <input type=text name='search'><input type=submit></form>".;
    ?>

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Можете посмотреть в направлении систем типа centrifugo
    Ответ написан
    Комментировать
  • Организовать phpDoc для __get property где property это экземпляр класса, как?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вам магический геттер не нужен, о слова "совсем". Под приватные свойства сделайте геттеры, это вам здорово облегчит жизнь. Да и костыли с док блоками городить не придется.
    Рекомендую почитать про SOLID, ваш Base - это божественный объект.
    Так же очень настоятельно рекомендую почитать про PSR-4, сейчас никто не пишет свои автолодеры.

    На счет dock block property, он объявляется:

    /**
     * @property TYPE_HERE VAR_NAME_HERE [DESCRIPTION]
     */


    П.С. Код не мой, переписать не хочется, так как есть много проектов на этом движке.

    Если есть возможность выбросить этот движок - делайте поскорее, иначе технический долг будет только возрастать, а код очень скоро станет не саппортабельным
    Ответ написан
    Комментировать