Ответы пользователя по тегу PHP
  • Точно и подробно про защиту от инъекций в php, mysql?

    @xfg
    Подготовленные запросы.

    Старайся вообще читать по меньше хабр и побольше документации от разработчиков инструмента, которым пользуешься. Хабр и другие блог платформы это субъективное мнение автора. Не надежный источник информации.
    Ответ написан
    3 комментария
  • Что читать после PHP.net?

    @xfg
    SOLID, GRASP, PoEAA и DDD если вы серьезно настроены, а если нет, то прочитайте документацию к laravel или yii2 и отгружайте rapidly code в промышленных масштабах.
    Ответ написан
    Комментировать
  • Что можно посмотреть, чтобы не говнокодить в MVC?

    @xfg
    Любой популярный фреймворк посмотрите и попробуйте сделать фреймворк без M и без V, оставьте только C и контейнер зависимостей. Такой фреймворк должен только парсить request и вызывать нужный метод контроллера и систему событий, чтобы можно было навешивать обработчики до вызова метода контроллера и после. Больше ничего не нужно, всё остальное можно будет внедрить через контейнер взяв компоненты из других фреймворков, а также написав свои. Получится слабосвязанный компонентный фреймворк. Назовете его loose или low framework, посвященный одному из важнейших принципов GRASP loose/low coupling :)
    Ответ написан
    Комментировать
  • PHP Websocket оповещение о новой записи в базе данных mysql, как реализовать?

    @xfg
    Хочу чистый PHP без всяких демонпхп и прочего.

    Без каких-то готовых библиотек нужно самому реализовать протокол websocket описанный в rfc6455.

    Это примерно тоже самое, как если бы прежде чем использовать протокол http вы бы самостоятельно написали свой веб сервер подобно nginx/apache и т.д. которые реализуют этот протокол.

    Если так, то читать rfc и делать. Если нет, то брать например ratchet или любую другую библиотеку в которой уже реализован websocket протокол.

    С mysql проблема в том, что она не умеет стримить данные в реалтайме и работает в режиме request-response, также как http протокол. Поэтому либо использовать старый-добрый поллинг базы раз в N время либо искать что-то похожее на mysql-live-select для php, но я не видел. Идея в том, что скрипт прикидывается как slave и слушает бинарный лог изменений.
    Ответ написан
    3 комментария
  • Создание больших проектов на Node или PHP?

    @xfg
    Для больших фулл реалтаймовых сайтов с базами данных пока беда, они почти все работают по принципу request response, как и веб до появления вебсокетов. Приходится хаки писать или делать дикий polling базы. Из нового поколения баз данных сейчас есть только rethinkdb, крутой проект, но еще довольно сырой. Как только пробуешь делать что-то посерьезнее, чем примеры из документации, выясняется что этого он еще не умеет, разработчики конечно обещают это всё добавить, так что ждем.

    Есть еще такой фреймворк Meteor, но он мне вообще не нравится, раньше просто доставал обновления из mongo через обычный polling базы и называл это всё крутым фреймворком для реалтайм сайтов. Потом они переделали и стали слушать обновления через oplog, который нужен для репликаций в mongo, но не для всех запросов это работает, для некоторых все равно выходом является только polling и в этот oplog сыпятся апдейты со всех баз данных и всё такое. Ну а хули, костыль есть костыль. Ну и вообще штука дико монолитная, хуже чем sails.js.

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

    @xfg
    Все работают одинаково. Скрипт на PHP может быть запущен как демон и работать пока его не остановить. Равно как и в Java, C#, Ruby, Python, Perl можно сделать так, чтобы скрипт каждый раз умирал.

    Строго говоря node.js это не язык программирования, а среда для исполнения javascript кода. Во многих языках есть аналогичные non-blocking i/o платформы, в php это reactphp, в python это twisted, который появился задолго до появления node.js.

    Вы сами решаете как будет работать ваша программа, либо как демон, либо запускаться каждый раз заново. Это не зависит от языка программирования. Просто в одном языке может быть более распространен один подход, в другом другой. Но это не означает, что в данном конкретном языке програмирования нельзя реализовать другой подход.
    Ответ написан
    3 комментария
  • Для чего используют абстрактные классы?

    @xfg
    Попробуйте основательно разобраться, что такое полиморфизм, особенно одна из его разновидностей - полиморфизм типов.

    Полиморфизм типов часто применяется в php. Вот его суть на вашем примере:

    abstract class ClassName
    {
        abstract public function doSomething($something);
    //не абстрактные методы
    }
    
    class ChildClass extends ClassName
    {
        public function doSomething($something)
        {
            //code
        }
    }
    
    class Main {
      public run(ClassName $class) {
        //code
      }
    }
    
    $obj = new Main();
    $obj->run(new ChildClass());

    Метод в Main::run() параметризован, его параметр $class теперь может соответствовать только дочерним классам вашего абстрактного класса ClassName.

    Зачем это нужно?
    Это нужно тогда, когда у вас может быть несколько реализаций одного и того же компонента. И вы точно знаете, что в будущем вам может понадобиться другая реализация. Например, представьте себе класс кеширования. Согласитесь, что кешировать можно в файл, можно в базу, можно в память и т.д. В таком случае, вы можете выделить абстракцию Cache с общим функционалом для любой реализации и создать наследников CacheFile, CacheMysql, CacheRedis и т.д.

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

    Но, скорее всего, если вы ничего об этом не слышали, то вам следует обязательно познакомиться с Dependency injection container, который будет внедрять нужный компонент автоматически, вместо вас. Вы же лишь будете указывать в конфигах, какую именно реализацию компонента нужно подавать всему остальному коду. Тогда весь ваш проект сможет переезжать с CacheFile на CacheRedis и наоборот с помощью изменения всего одной строчки в конфиге.

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

    Помимо примеров в гугле, смотрите еще и живой код open source проектов.
    https://github.com/yiisoft/yii2/blob/master/framew...
    https://github.com/yiisoft/yii2/blob/master/framew...
    https://github.com/yiisoft/yii2/blob/master/framew...
    и т.д.
    Ответ написан
    Комментировать
  • Можно для тех кто в танке про CSRF?

    @xfg
    4. Get-запросы токенами защитить невозможно

    Возможно, но не нужно. Вам не следует выполнять никаких действий, кроме отдачи контента по get запросу. Для update/delete/create нужно использовать POST если это классический веб-сайт и PUT/DELETE/POST если это RESTful API.

    Пусть клиент отправляет csrf-токен в POST запросе. Пусть сервер при старте сессии сохраняет csrf-токен в сессию. Пусть сервер перед тем как выполнить POST запрос проверит соответствие токена из запроса с тем, что в сессии.

    В базе данных токен хранить избыточно. Сохранив в сессию, вы всегда будете иметь к нему доступ, клиент его изменить никак не сможет.
    Ответ написан
    2 комментария
  • Нужен совет, касательно создания чата (PHP or Node)?

    @xfg
    Очень много вопросов. Отвечу только касательно порта. Nginx умеет проксировать websocket трафик.
    location /wsapp/ {
        proxy_pass http://wsbackend:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    Подробнее можно прочитать https://www.nginx.com/blog/websocket-nginx/
    Думаю apache и другие это тоже умеют, но конкретнее сказать не могу, так как не использую их.
    Ответ написан
    Комментировать
  • Правильно ли реализовал подключение к БД?

    @xfg
    echo "Не удалось подключиться к MySQL: {$db->connect_error}";

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

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

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

    Закрывать соединение с бд в модели - плохо. Закрывать соединение с бд лучше на уровне приложения, после того, как отработал экшен контроллера.

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

    Посмотрите лучше любой популярный фреймворк, чтобы понять как и что примерно работает.
    Ответ написан
    4 комментария
  • MVC php на пальцах?

    @xfg
    Модель - это любая ваша бизнес-логика, всякие вычисления и запросы к бд. То есть то, без чего приложение впринципе не имеет смысла.

    Контроллер - это посредник между моделью и видом. Он запрашивает данные (вызывает методы) у модели и затем передает их в вид.

    Вид - с помощью полученных данных от контроллера рисует пользовательский интерфейс.

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

    Нужна одна точка входа. Клиент всегда запрашивает только index.php, оно там внутри на основе данных из запроса решает какой контроллер создать и какой метод из контроллера выполнить. Всё.
    Ответ написан
    4 комментария
  • Что все-таки должен уметь делать frond-end-разработчик?

    @xfg
    Бекендер предоставляет api для манипулирования данными, а ваша задача эти данные отобразить конечному пользователю. Взаимодействие с сервером ваша задача. Вы делаете полностью клиент. На каком фреймворке или без, вам решать. Но в подавляющем большинстве случаев пишут classic websites, где клиентская часть генерится на сервере и клиент соответственно писать не нужно, поэтому весь сайт делает бекендер, отдать можно только верстку верстальщику, а фронтендер в таком проекте не нужен.

    Фронтендер такой же программист. Скажем у фейсбука есть API, вас просят написать веб клиент к этому api. И вы должны это сделать. На выходе должен быть готовый продукт, которым уже может пользоваться конечный потребитель. Это фронтендер. Это его отличает от верстальщика, задача которого картинку напилить в html.
    Ответ написан
    Комментировать
  • Правильно ли я использую PHP-DI?

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

    @xfg
    Бери уже готовую библиотеку, например swiftmailer
    И смотри метод Swift_Message::setFrom() и в целом документацию.

    Учись искать готовые решения.
    Ответ написан
    Комментировать
  • Области применения веб фреймворков?

    @xfg
    Yii - для написания серверной части приложения.
    AngularJS - для написания клиентской части приложения.
    Nodejs - платформа, для написания серверной части приложения.

    В классическом веб-приложении, сервер сам генерирует html код из шаблонов с вставками простейшего php-кода. Но можно реализовать "тонкий сервер" с помощью RESTful Api и отдавать только данные, например в формате JSON. С помощью AngularJS пишется клиент для взаимодействия с сервером. Он же берет на себя ответственность за генерацию html (view) из шаблонов.
    Ответ написан
  • Какой PHP фреймворк хорошо подходит для Angular API?

    @xfg
    Ответ написан
    Комментировать
  • Как подружить php и socket.io?

    @xfg Автор вопроса
    Нашел причину. Она банальна. Изначально нужно отрендерить html-страницу, а только после этого выбрасывать событие через elephant.io в socket.io.

    Исходя из этого, можно в actionIndex только рендерить страницу, а уже внтури страницы можно сделать ajax-запрос например при наступлении события jQuery(window).load() к нужному php экшену, который будет с помощью elephant.io выбрасывать событие в socket.io.
    Ответ написан
    Комментировать