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

    php666
    @php666
    PHP-макака
    die ( mysql_error () );
    последние 10 лет программил
    на зоне программил с отсутствием интернета?

    По факту отстал настолько, что можно смело искать другую работу. Точнее не отстал, а даже не вышел за пределы новичка.

    Правда, ищи другую работу. Тебя просто порвут по скилам молодые мальчики.
    Ответ написан
  • Как не попасть в "неправильный" PHP?

    php666
    @php666
    PHP-макака
    как отличить компанию куда следует откликаться, где со старта можно постигать и повышать скилл на профессиональном уровне и не попасть в конторы по клепанию ИМ


    https://github.com/Vasiliy-Makogon/PHPINFO/blob/ma...
    Ответ написан
  • PHP стоит ли изучать язык по материалам 2015 года?

    php666
    @php666
    PHP-макака
    Изучать пхп можно и по книжкам уровня PHP4, ничего кардинально нового, кроме объектной модели, в языке с тех пор не появилось. Код, написанный на PHP4 исправно работает на PHP7 с минимальным количеством правок, которые разруливаются за 5 минут работы.
    Ответ написан
  • PHP, как отфильтровать нежелательные символы UTF-8 в текстовой строке?

    php666
    @php666
    PHP-макака
    при дальнейшем выводе в браузере может получиться каша
    что значит каша?
    В какой кодировке данные в базе? В какой кодировке ответ сервера?

    Есть мнение, что надо просто унифицировать кодировку проекта к utf8mb4 и не заниматься ерундой.
    Ответ написан
  • Что лучше использовать для корзины покупок?

    php666
    @php666
    PHP-макака
    Но есть люди которые запрещают их использование путем установок некоторых расширении в браузеры.
    это их проблемы

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

    php666
    @php666
    PHP-макака
    Высокоуровневые методы (например, find****) должны быть обёрткой над кодом, который использует билдер запросов. У тебя дубляж низкоуровневого кода работы с PDO повсеместно.

    Когда я свою ORM писал, у меня это выглядело так:

    // высокоуровневый метод делающий ТОЛЬКО выборку по id
        public function findModelById($id): Model
        {
                return $this->findModelByParams(
                    array('where' => array('`id` = ?i' => array($id)))
                );
        }
    
        // УНИВЕРСАЛЬНЫЙ низкоуровневый метод, находящий объект модели по любым параметрам
        public final function findModelByParams(array $params=array()): Model
        {
            $res = parent::createQuerySelect($params);
    
            $object = $this->createModelFromDatabaseResult( is_object($res) && $res->getNumRows() ? $res->fetch_assoc() : array() );
    
            return $object;
        }
    
        // построитель любого sql-запроса на SELECT, его исполнение и возвращение объекта типа РЕЗУЛЬТАТ
        protected final function createQuerySelect(array $params)
        {
            $params = self::makeSqlFromParams($params); // это сам билдер!!!!!!!!!!!!!!
    
            $sql = 'SELECT' . $params['what'] . 'FROM ?f' . $params['join'] . $params['where'] . $params['order'] . $params['limit'];
    
            array_unshift($params['args'], $this->getTableName());
            array_unshift($params['args'], $sql);
    
            $result = call_user_func_array(array($this->getDb(), 'query'), $params['args']);
    
            return $result;
        }


    Аналогично был метод на удаление:

    protected final function createQueryDelete(array $params)
        {
            $params = self::makeSqlFromParams($params);
    
            $sql = 'DELETE FROM ?f ' . $params['where'] . $params['limit'];
    
            array_unshift($params['args'], $this->getTableName());
            array_unshift($params['args'], $sql);
    
            return call_user_func_array(array($this->getDb(), 'query'), $params['args']);
        }


    insert/update в подобном билдере не нуждались, они были частью метода save, в точности как у тебя.

    Твоя обертка будет работать, но дубляжа кода много, это прям бросается в глаза. Ты можешь не писать билдер запросов, но тогда ты будешь описывать каждый новый метод и в каждом методе у тебя везде будет написано одно и тоже - prepare/execute/fetch

    Это всё будет давить, особенно когда тебе понадобится сделать методы типа findUserByIdOrNameAndSurname($id, $name, $surname)
    где нужно будет исполнить запрос вида select * from users where id = ? OR name = ? AND surname = ?

    Тут уже не спасет твой метод findByAttribute.

    Тебе захочется иметь "красивый" метод высокого уровня, в итоге ты либо напишешь его в привычной стилистике

    public static function findUserByIdOrNameAndSurname($id, $name, $surname)
        {
            $stmt = self::$db->prepare('SELECT * FROM `' . static::getTableName() . '` WHERE id = ? or name = ? and surname = ?');
            $stmt->execute([$id, $name, $surname]); // или как тут правильно, не знаю..
            $r = $stmt->fetch();
    
            return $r ? new static($r) : null;
        }


    либо сам придешь к необходимости создать метод findModelBySql($sql).

    Но и то и то будет нагромождением повторяющихся кусков кода.

    spoiler
    PS дзен AR ты познал, крайне советую остановиться и не повторять моих ошибок. Я тоже писал свою ОРМ, только это никому нахер не нужно. И твоя ОРМ тоже не нужна, даже тебе. Есть проверенные решения, тот же eloquent. Не занимайся ерундой.
    Ответ написан
  • Как убрать php-врезки из html?

    php666
    @php666
    PHP-макака
    или комбинировать html с php это нормально и так и надо делать?
    если ты посмотришь на "скомпилированный" шаблона код ЛЮБОГО php-шаблонизатора, будь то smarty или что-то поновее, то увидишь, что в итоге получается html-шаблон со вставками php. Это абсолютно нормально.

    Ну и на статью на эту тему.
    Ответ написан
  • Зачем Laravel/Symfony/etc если можно собрать из библиотек свой «фреймворк солянку»?

    php666
    @php666
    PHP-макака
    Ведь они тащат за собой кучу ненужных вещей
    заблуждение. Не надо думать, что ты умнее коллективного мозга опенсорс-проектов. Всё там нужно, а если и не нужно конкретно тебе, то скорее всего потому, что ты не прочитал доки и не знаешь, какие возможности дает тот или иной пакет.

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

    если можно собрать из библиотек свой «фреймворк солянку»?
    ты соберешь хорошую машину из солянки запчастей ВАЗа, БМВ и Тойоты? При большом опыте работы с этими машинами - возможно. Только это сизифов труд.
    Ответ написан
  • Чем чревато использование модификатора public?

    php666
    @php666
    PHP-макака
    чем же всё-таки на реальном примере чревато использование public
    Ну смотри.
    Представь себе, что ты - объект, а все твои свойства (сердце, печень, желудок) - публичные. Я могу к тебе подойти, тыкнуть пальцем в сердце и ты помрешь. Так же и в объектах - те свойства, которые ответственны за работоспособность объекта класса, которые не должны быть доступны извне, делают private/protected.

    Как в закрытое свойств (желудок) поместить еду? Сделаем публичный метод ЕСТЬ(), который поместит туда еду. На вход подаем пищу.
    Зачем нужен метод, если, теоретически, желудок можно было бы сделать public и класть в него пищу напрямую, с помощью лопаты? Очевидно, метод ЕСТЬ() имеет кое-какую проверку входящих данных. Например, если ты засунешь себе в рот тухлятину, то эта "еда" просто не пойдет дальше - сработает рвотный рефлекс.
    Такая же аналогия с программированием - хорошая практика - делать т.н. сеттеры/геттеры методы, которые принимают и возвращают свойства объектов. На эти методы можно повесть некую логику. Например, при установки свойства проверять его корректность, а при возвращении - отдавать в определенном формате.

    Когда нужны public-свойства? В очень редких случаях, например когда объект выполняет роль некого хранилища, например это \stdClass -объект верхнего уровня PHP. Но в реальной разработке это очень редкие явления.
    Все классы должны иметь закрытые свойства, а для манипуляции с ними - геттеры/сеттеры. Это хорошая практика.

    Ну и пример банальный:

    // класс для работы с mysql
    class Database
    {
        /**
         * Ресурс соединения с mysql 
         * @var mysqli
         */
        public $connection;
    
        public function __construct()
        {
            $this->connection = mysqli_connect(/**/);
        }
    }
    
    $db = new Database();
    
    // какой-то петя в коде написал случайно:
    $db->connection = 123; // все сломалось
    Ответ написан
  • Как правильно реализовать автозагрузку в PHP, не жертвуя использованием use?

    php666
    @php666
    PHP-макака
    Переформулируй свой вопрос.
    Ничего не понятно.
    Автозагрузка и пространства имен никак не связаны, в чем конкретно затык?
    Что значит
    Я не могу использовать use, что меня сильно напрягает
    Ответ написан
  • Как правильно сделать аутентификацию пользователя?

    php666
    @php666
    PHP-макака
    аутентификация - это не сфера класса пользователь
    аутентификация - это сфера класса Authorization (или как хотите его назовите)

    авторизация:
    $auth = new Authorization(/* передаем объект запроса или _REQUEST */);
    if ($auth->processAuthorization('login', 'password') {  // set cookies/sessions and redirect
    // redirect to other
    }


    аутентификация:
    $auth = new Authorization(/* передаем объект запроса или _REQUEST */);
    $current_user = $auth->processAuthentication(); // или null если не аутентифицировались
    Ответ написан
  • Автозагрузка обязывает указывать namespace у всех классов?

    php666
    @php666
    PHP-макака
    1) С точки стандартов программирования, насколько правильно указывать у каждого класса namespace?
    да, это правильно. Один файл, один класс, который должен лежать в определенном пространстве имен.

    2) Какой подход для использования spl_autoload_register из двух перечисленных является более правильным?
    Второй. Ибо это стандарт. "Вызывать несколько раз, в качестве аргумента указав функции, подключающие классы из разных директорий" - это когда у тебя мешанина из кода и ты пытаешься всё это натянуть на современные реалии.

    Сейчас дефакто композер стандарт, не изобретай велосипед, не стоит заморачиваться на то, что само по себе практически не используется (spl_autoload_register) в проектах.

    1. Возьми композер (у меня под виндой phar работает, если запускать через php), инициализируй его у себя в проекте:
    php ../composer.phar init

    2. Создай в корне директорию в app с именем Test - это будет пространство имен App\Test, туда положи файл Test.php, в котором объяви класс Test с указанием пространства имен namespace App\Test;

    3. В файле composer.json допиши:
    {
    .....
        "autoload": {
            "psr-4": {
                "App\\": ["app/"]
            }
        }
    }

    где app - будет весь код твоего приложения, те твоих чудо-классов.
    Запусти php ../composer.phar dump-autoload

    3. Подключи лишь одну строку: require('./vendor/autoload.php');в файл индекса или в те файлы, где нужны классы с автоподгрузкой.

    4. Должно получиться это:
    5ea45cd48bcdf580929185.jpeg
    Ответ написан
  • Загрузка изображения перед его загрузкой. Как это делают?

    php666
    @php666
    PHP-макака
    Я так делал.

    Рисуется скрытый фрейм:
    <iframe width="0" height="0" name="iframe"></iframe>

    Рисуется форма ПОСЛЕ основной формы поста:
    Форма для загрузки изображений с кнопкой выбора файла:
     <form action="/thumbnail.php" method="post" enctype="multipart/form-data" target="iframe">
         <input type="file" name="file" id="file" />
     </form>


    При выборке картинки срабатывает событие submit и грузит её в скрытый фрейм на /thumbnail.php.
    thumbnail.php преобразовывает изображение, сохраняет на ФС, записывает кое-что в таблицу (см далее), после чего отдает путь к превью, JS из родительского окна браузера рисует блок изображения с URL этого превью.
    Рисуется в основной форме поста hidden поле вида
    <input type="hidden" name="thumbnail[]" value="123">

    где 123 - ID картинки, которую мы положили уже на сервер и записали в таблицу вида
    id | id_post | file_name | file_date
    получается что-то вроде записи
    123 | null | file.jpeg | 20-02-2020
    при посте самой формы мы делаем update, пробегаемся по массиву thumbnail из POST и у каждой записи обновляем id_post на тот, что получили в результате сохранения поста:
    update images set id_post = 1 where id = 123

    крон ходит раз в 15 минут и убивает все картинки, где id_post is null и file_date < now()-1 час
    Ответ написан
  • Cms или фреймворк?

    php666
    @php666
    PHP-макака
    Пошел на курсы backend разработки PHP
    значит, знаний ноль
    в частности упор на laravel
    все равно, что солдату из 18 века дать управлять танком Т90 хотя бы без образования средней школы и ПТУ
    структура ужасная, разобраться сложно и нет нормальной документации
    скорее всего, это твое субъективное мнение. ты увидел реальный код и испугался.
    найти работу на фреймворке
    стесняюсь спросить, а кому ты нужен на современный серьезный проект с нулевым опытом и знаниями?

    Ты посиди годика 2-3 на чудовищном коде 20-и летней давности, научись подводным камням языка, набей руку, тогда, возможно, попадешь и на фреймворк.

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