Ответы пользователя по тегу PHP
  • Что учить laravel или ООП?

    @Vasiliy_M
    Для увлеченного программированием человека ООП писец как интересно, ибо это мощнейший инструмент для разработки ПО, позволяющий строить красивую архитектуру кода.

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

    @Vasiliy_M
    Очевидно, что Database() можно вынести в отдельную модель, типа ActiveRecord
    объект для работы с СУБД никоим образом не относится к паттерну AR. AR не должна наследоваться от объекта СУБД.

    и просто наследовать её
    https://refactoring.guru/ru/replace-inheritance-wi...

    Мне не комфортно, что приходится создавать объект в __construct, чтобы пользоваться им в классе.
    это ваши проблемы. точнее это вообще не проблема, что в конструкторе создаются объекты.
    учитесь мыслить независимыми объектами. учитесь складывать из кирпичиков механизм, в котором нет жёсткой связанности. приведенный код как раз это и обеспечивает.

    Здравствуйте, решил все-таки научиться хоть немного программировать по-взрослому
    прочти хотя бы 1/3 этой книги
    Ответ написан
    Комментировать
  • Зачем нужен RreflectionClass?

    @Vasiliy_M
    постоянно использую. вот, 4 часа назад написал чудо-проверку на наличие свойств в объекте:

    foreach ($validatorAttrs as $validator_property_key => $validator_property_value) {
        // Проверка на наличие в классе таких свойств.
        try {
            $reflection->getProperty($validator_property_key);
        } catch (\ReflectionException $e) {
            throw new \InvalidArgumentException(
                get_class($this) . ": Bad call validator settings on property `$key`: " . $e->getMessage()
            );
        }
        // Устанавливаем свойства валидатора, установленные клиентом.
        $o->$validator_property_key = $validator_property_value;
    }
    Ответ написан
    Комментировать
  • Как лучше организовать классы и методы?

    @Vasiliy_M
    моя статья, будут вопросы, пиши
    archive.li/bDirF
    Ответ написан
    Комментировать
  • Как заставить скрипт работать раз в день?

    @Vasiliy_M
    localStorage
    Ответ написан
    Комментировать
  • Какую роль играет PHP PDO и SQLite в "боевых" проектах?

    @Vasiliy_M
    phpfaq.ru/pdo#intro

    - старое доброе расширение mysql. В 5-й версии нудит нотисами о том, что устарело, а из 7-й уже удалено совсем. Плюс форменная истерика в интернетах на её счёт (абсолютно беспочвенная при этом. Бандерлоги так и не научились правильно ей пользоваться, но все свои проблемы решили свалить на неё).
    - mysqli. Эта библиотека не предназначена для испрользования напрямую в коде. А только как строительный материал для создания библиотеки более высокого уровня. Напрямую же ей пользоваться невозможно. Легче пережить небольшую атомную войну, чем попытаться привязать несколько переменных в оператор IN().
    - PDO - тупо методом исключения: ничего другого все равно больше не остаётся. Тем более, что это такой недо-DAL, который делает много того, что должна делать библиотека для работы с SQL (но ещё больше она не делает, о чем речь пойдёт ниже)
    все "радости" разработчиков по поводу PDO - от незнания. PDO - жутко неудобная, недоделанная хрень. Просто ничего другого нет. Поэтому мы пишем самописные обертки для упрощения работы с базой.
    Ответ написан
  • Ошибка php не удаётся вывести данные?

    @Vasiliy_M
    Ответ написан
    Комментировать
  • Что не так с моим кодам, не передается в датабазу?

    @Vasiliy_M
    чувак, ты заепал. 3 тема с твоим говнокодом.
    почитай вот это - phpfaq.ru/debug
    Ответ написан
    Комментировать
  • Как посмотреть лежит ли передаваемое числовое значение переменной между значениями массива?

    @Vasiliy_M
    Это тривиальная задача и это не делается на уровне php - это делается на уровне базы. Т.е. это задача базы дать необходимую выборку, сформировать массив. Иначе зачем тогда вообще нужен был бы SQL?
    Ответ написан
  • Как сделать сайт безопасным при авторизации?

    @Vasiliy_M
    Можно конечно записывать в куки захэшированный пароль, чтобы каждая страница проверяла соответствие куки - логин == бд.логин && пароль == бд.пароль, но я не уверен что это правильно.

    это правильно. не безопасно, но правильно. не безопасно потому, что можно подойти к браузеру и стырить куки. но это проблема другого рода. можно поставить время жизни кук = 0 и это будет эмуляция сессий, но без генерирования тучи сессионных файлов.

    т.е.

    1. Пользователь вводит логин и пароль, они верны.
    2. Ставим куки:
    - ID - идентификатор пользователя
    - HASH - md5(user_password_hash + salt), где
    user_password_hash - захэшированый в базе пароль
    salt - соль

    тогда на каждой странице запрос будет вида
    SELECT * FROM `user` WHERE `id` = ID_из_куки
    далее просто сравниваем $_COOKIE['HASH'] === md5($user['user_password_hash'] . $user['salt'])

    Плюсы подхода - никогда не происходит уничтожение "сессии" (т.е. всегда пользователь авторизован), если вы не ставите время жизни куки = 0. Для многих сайтов, где не критична безопасность - это очень красивый, легкий и простой вариант авторизации.
    Ответ написан
    4 комментария
  • Что почитать по составлению безопасных sql запросов?

    @Vasiliy_M
    Там все актуально до сих пор. Написанное было актуально лет 10 назад, актуально будет еще долго. Принципы те же самые. Ничего не изменилось. Автор той статьи - очень авторитетный товарищ и на этой теме "собаку съел". Он многих "учил" в онлайне еще тогда, когда 95% населения тостера под стол пешком ходили. Вот кстати его сайт еще - phpfaq.ru с очень ценной информацией.
    Ответ написан
    2 комментария
  • Как узанать имя неявной переменной?

    @Vasiliy_M
    Само название переменной у тебя лежит в переменной $a.
    Вот доказательство:
    echo ${'какой то текст, может вычисляться'}; // выведет 123
    echo $a; // какой то текст, может вычисляться
    Ответ написан
    Комментировать
  • Как получить доступ к переменной из другого пространства имен?

    @Vasiliy_M
    Хотя любой корректный PHP-код может находиться внутри пространства имен, только классы (включая абстрактные и трейты), интерфейсы, функции и константы зависят от него.
    php.net/manual/ru/language.namespaces.definition.php

    Т.е. переменные нельзя так использовать.

    namespace Code1{
        function sayHi(){
            print "Передаю привет из code1";
        }
        CONST A = 1;
    }
    namespace Code2{
        function sayHi(){
            print "Передаю привет из code2";
        }
        CONST A = 2;
    }
    namespace {
        print "файл general.php успешно подключен";
        Code2\sayHi();
        print "<br>" . Code2\A;
    }
    Ответ написан
    Комментировать
  • Какой php фреймворк учить?

    @Vasiliy_M
    1) В чем смысл фрейморков?
    За тебя уже все написано. Каркас, CRUD/ORM и масса плюшек.

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

    3) Почему способ с самописным роутером, плохой?
    Фреймворк - это не только роутер. Можно перефразировать вопрос и спросить:
    Почему способ с самописным фреймворком плохой?
    Самописный фреймворк - это не плохо. Как получение опыта - очень даже хорошо. Для себя можешь писать. Но что бы в команду устроиться работать, тебе твой фрейм самописный не поможет. Команде нужна унификация, для этого и существуют фреймворки.

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

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

    @Vasiliy_M
    phpfaq.ru/sessions

    Как сохранить пользователя авторизованным на сайте?

    В общем смысле - нужно в куки (не сессионные, сессии можно вообще не использовать для авторизации)
    прописать логин + пароль в зашифрованном виде. Дальше примерно такой код:

    /**
         * Аутентификация пользователя на основании данных из COOKIE.
         *
         * @param void
         * @return Mvs\Module\User\Model\User
         */
        public function processAuthentication()
        {
            if ($this->request->getCookie(self::ID_COOKIE_NAME, 'string') &&
                $this->request->getCookie(self::HASH_COOKIE_NAME, 'string')
            ) {
                $user = $this->mapper->findModelById($this->request->getCookie(self::ID_COOKIE_NAME, 'string'));
    
                if (is_object($user) &&
                    md5($user->getLogin() . $user->getPassword() . Mvs\Registry::getInstance()->SECURITY['AUTHORIZATION_SALT'])
                    === $this->request->getCookie(self::HASH_COOKIE_NAME, 'string')
                ) {
                    $user->setVisitdate(new Mvs\Type\Datetime());
                    $user->setIp($_SERVER['REMOTE_ADDR']);
                    $this->mapper->saveModel($user);
                    return $user;
                } else {
                    $this->logout();
                }
            }
    
            return $this->mapper->findModelById(-1);
        }


    Сессия при авторизации не нужна по большому счету. Можно проверять доступ пользователя на основании одних лишь кук.

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

    @Vasiliy_M
    Начал хорошо:
    1. При загрузке сразу обрезать изображения и ложить их в рабочие директории под нужными разрешениями, при этом появилась необходимость сразу же и сохранять информацию о изображении в БД не привязывая к какому либо посту (для того, чтобы кроном, периодически удалять те картинки, которые пользователи так и не сохранили вместе с постом).
    я точно также сделал у себя.

    Дальше треш и вообще не понятно.

    проблема в том, что между этими двумя действиями редко, но может сработать крон, и удалить нужные изображения вместе с ненужными
    проблемы никакой быть не должно - записывай дату добавления изображения и кроном ищи изображения старше часа, например:

    $sql = 'SELECT * FROM t 
                    WHERE post_id IS NULL
                    AND file_date < (NOW() - INTERVAL 60 MINUTE)
                    ORDER BY id ASC LIMIT ?i';
    Ответ написан
  • "Global" или "&"?

    @Vasiliy_M
    лучше забудь про GLOBAL и пиши код так,как будто их нет в языке
    Ответ написан