• Какой курс по веб разработке выбрать?

    Nuby
    @Nuby
    ступай на https://htmlacademy.ru/ и пройди бесплатный интерактив.
    можешь заплатить 2 000 за годовую подписку.

    Это работает и это полезно.

    Остальное не работает и не может тебе предложить что-то, чего нет в бесплатном доступе.
    Ответ написан
  • Как вы используете jQuery и прочие библиотеки JS, установленные через npm?

    vitaosipq
    @vitaosipq
    разработчик, начинающий фрилансер
    Дополню к ответам выше, что папка node_modules должна быть просто в проекте локально, а уже на сервере собранный бандл с подключенными библиотеками. node_modules нужно в gitignor поставить, чтобы не загружать это огромное количество файлов. Если работаете в проекте с кем-то, то все пакеты должны быть в package json прописаны. Через консоль потом пакеты локально загружаются в node_modules
    Ответ написан
  • Как сделать увеличение блоков при наведении?

    Maxsior
    @Maxsior
    loading...
    ...
    .skill_block:hover {
        position: relative;
        opacity: 1;
        transform: scale(1.1); /*вот так*/
    }
    ...

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

    mrhard
    @mrhard
    web разработчик
    $content_page = file_get_contents('http://site.ru');
     if (substr_count('SLOVO',$content_page)>0){
        
        //Делаем что-либо полезное
        
     }
    Ответ написан
  • Можно ли показать текст статьи по клику, при использовании "the_excerpt()"?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Если повесить на Read More обработчик и подгружать содержимое через Ajax - да. Более простым способом - нет
    Ответ написан
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

    * Кэш должен очищаться по двум условиям (не по одному из, а именно по двум):
    - Время.
    - Протухание по бизнес логике.
    Разрешается по только времени в безвыходных ситуациях, но тогда время - короткий период.
    - При расчете ключей кэша должна использоваться переменная из конфигурации приложения (на случай обновлений кэш сбрасывается кодом, а не флашем кэш-сервера). В случае использования множества серверов - это очень удобный и гибкий инструмент при диплое.

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
  • CodeIgniter мертв?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    TL;DR Да, мертв.

    Что же в нем такого плохого?

    Да как бы сама идея, что фреймворк - это изменяемая часть приложения - говно, так как ведет к бесконтрольной зависимости вендорского кода, от вашего и наоборот.

    Маленький, шустрый, удобный

    Шустрый он как раз потому, что маленький и убогий по функциональности. PHP это далеко не язык быстрых систем, это язык быстрых решений. Хотите скорости - смотрите в сторону java, c#, c++, golang,..
    На счет удобства: вы вероятно путаете с порогом вхождения. Потрогайте Doctrine на досуге, только хорошо так потрогайте и вы узнаете, что такое удобство работы с БД, потрогайте Monolog и узнаете, что такое удобство работы с логами, потрогайте Symfony (да, его надо нормально так покурить), но экономит время он колоссально.

    для скачивания не требует установки композеров и всякого такого

    Собственно и что?)) У кода вашего приложения так, или иначе есть зависимости, от того же CI например, что плохого в том, что зависимостями будет рулить проверенная и мощная система, с генерацией автолоада и другими плюшками?

    Что есть в других фреймворках такого, чего нет в старичке CodeIgniter?

    Для начала у них есть сегодня и будущее))
    У Symfony, по сравнению с CI есть:
    * Архитектура и мощная методологическая база. Да, тут парни по SOLID выступают, а в CI даже в MVC не могут(Model не должна обрабатывать пользовательский ввод, это задача контроллера!!)
    * DI контейнер на пару с очень гибкой системой конфигурирования
    * Есть ORM/ODM Doctrine, лучше на данный момент нету
    * Есть де-факто стандартный для многих фреймворков Symfony HttpFoundation
    * Мощный компонет, для написания консольных приложений
    * Система безопасности Security Component
    * Большое количество мощных бандлов, поддерживаемых сообществом

    Или действительно CI мертв?

    Мертв он не потому, что вот я хейтер и вот так вот. А потому, что идеи, закладываемые в него - не актуальны:
    * фреймворк - изменяемая часть приложения. Фреймворк - это код другого вендора, хотите делать правки - делайте форк, но не переносите вашу бизнес логику в него. У фреймворка задача - сделать каркас, а не реализовывать вашу бизнес логику.
    * скорость в ущерб функцональности. Как я сказал выше - он куцый
    * пропагандирует говнопрактики, попробуйте следовать следующим требованиям к качеству кода если не согласны.

    И да, поддержка PHP 5.2.4, это не достижение, это заморозка 2007 года
    Ответ написан
  • Почему PHPStorm не загружает файлы на удалённый сервер?

    @Ultimat5
    Может возникнуть в том случае, если вы в настройках FTP, на вкладке Excluded Paths (Исключения) добавили свою папку в которую загружаете файлы. Для избежания данной ошибки, выделите путь,
    и удалите его из списка. 5abe18311ffed167346842.jpeg
    Ответ написан
  • Почему PHP теряет популярность?

    AleksandrB
    @AleksandrB
    PHP не мода, php - классика, а классика никогда не умирает. Если умрет php, то умрут все остальные языки backend разработки потому что появится что-то такое, что сможет в разы превзойти пхп в простоте, скорости и удобстве, на данный момент что джава, что питон, что руби +- одинаковые, каждый подходит для своих целей. Тот же питон выбирают из-за простоты интеграции нейронных сетей, но если говорить не о узких, а о главных параметрах (функционал, скорость и тд) все популярные бэк языки более или менее одинаковые смотрите те же сухие графики.
    А о уменьшении вакансий - глупость несусветная. трын тут приведена статистика за 2018 год и обоих графиках по вакансиям лидирует в сравнении с java/python PHP, при том на первых двух пишут как бэкэнд, так и миллион других штук. А на втором графике и вовсе пхп опережает js (единственный язык в самой популярной сфере разработки).

    А вот если речь идет о реально крупных компаниях (amazon, google...) там как раз предпочитают python из-за выше упомянутой простоты интеграции нейросетей.

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

    BoShurik
    @BoShurik
    Symfony developer
    https://getcomposer.org/doc/04-schema.md#classmap
    Положить файлики библиотеки в отдельную директорию (e.g. legacy-lib/) и прописать
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        },
        "classmap": ["legacy-lib/"]
    },
    Ответ написан
  • Что изменить/добавить на сайте?

    Zoominger
    @Zoominger
    System Engineer
    Убожество. И на рекламу похоже.
    И абсолютно не нужно в условиях существования сотни подобных сервисов с куда менее вырвиглазным интерфейсом.

    О Г-ди, зачем я перешёл в другой раздел:
    5d02941417180708806740.png
    Ответ написан
  • Что конкретно делает эта функция mysqli_real_escape_string()?

    @FanatPHP
    Это хороший вопрос, в первую очередь потому что найти человека, который знает правильный ответ, практически нереально. Опроси 10 похапешников, 10 из них тебе наплетут ереси, которая не имеет с реальностью ничего общего. Любой, кто заикнется про SQLинъекции, уже облажался.

    При том что функция этой функции совершенно примитивная - экранировать кавычки в строках SQL. Для соблюдения корректного синтаксиса. Это единственная функция этой функции, и больше ни для чего она не нужна.

    Как ты, наверное, уже знаешь, строки в SQL берутся в кавычки:
    SELECT * FROM table WHERE name='vasya'
    Вот чтобы vasya не приняли за имя таблицы или ключевое слово, его берут в кавычки. Очень просто. Но иногда у человека имя не просто вася. Что будет вот с таким запросом?
    SELECT * FROM table WHERE name='Я Д'Артаньян, а все вокруг ...'

    Мясорубка будет. БД решит, что имя - это 'Я Д', а дальше какая-то фигня, которую она не понимает. И выдаст ошибку.
    Поэтому кавычки надо экранировать.
    SELECT * FROM table WHERE name='Я Д\'Артаньян, а все ...'

    никаких ошибок не выдаст.
    Вот mysqli_real_escape_string() как раз этим и занимается - экранирует кавычку слешем, а заодно и сам слеш, потому что если слеш окажется в конце строки,
    SELECT * FROM table WHERE text='Мну сегодня в любви вкладкой ошиблись :\'

    то БД решит, что последняя кавычка экранирована, и строка не заканчивается. Снова мясорубка.
    Также mysqli_real_escape_string() экранирует еще несколько символов, но уже из чисто эстетических соображений.

    Еще одна функция этой функции - принимать в расчет кодировку текста. Есть кодировки, в который слеш - это не слеш, а часть другого символа. И когда БД будет парсить запрос, она не поймет, что это слеш, а решит что это просто буква. И снова мясорубка.
    Поэтому перед использованием mysqli_real_escape_string() надо сказать БД, в какой кодировке у нас данные, с помощью функции mysqli_set_charset().

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

    1. Строки надо форматировать в любом случае, независимо, ждем мы инъекцию, или нет. Мясорубка нам точно так же не нужна.
    2. Строками синтаксис SQL запросов не исчерпывается. Есть числовые литералы, есть имена полей. Для всех них mysqli_real_escape_string() бесполезна чуть более чем полностью.

    То есть, отсюда можно сделать вывод, что нельзя использовать mysqli_real_escape_string() для защиты от инъекций. Она предназначена для другого. Вот для этого другого, для форматирования строк, ее использовать можно. Но не нужно.

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

    В принципе, mysqli умеет так делать, но криво и неудобно. Поэтому вместо нее надо использовать PDO:
    $stmt = $pdo-prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->execute(["Vasya", "Д'Артаньян"]);
    $rows = $stmt->fetchAll();
    - и получить, в итоге, готовый массив с данными, которые вернула БД.

    И при этом никакой тебе возни с кавычками, слешами, real, escape, и прочей ерундой. просто, быстро, лаконично и безопасно.
    Ответ написан
  • Где сейчас тусуются серьезные PHP программисты?

    @FanatPHP
    Завсит от цели, для чего это спрашивается.

    Если чтобы поприставать с нубскими вопросами - то нигде.
    Если чтобы почитать умных мыслей - РНР дайджест на Хабре прекрасно суммирует все, что было написано за две недели. У меня например никогда не хватает времени, чтобы прочесть всё. Куда больше-то - я уж и не знаю.
    Если чтобы поучаствовать в серьезном прокете - на гитхабе, выбирай любой.
    Если чтобы послушать интересные доклады и пообщаться вживую - то конференции.
    Если интересует внутренне устройство языка - то php internals.
    Если интересует, что пишут пхп селебрити про что угодно, кроме программирования - то твиттер (Расмус показывает картинки из аэропортов и роботов, которых собирает его сын, Сара постит котиков - и так далее).

    Где точно не тусуются:
    Тостер и всякие подобные ресурсы типа стаковерфлоя.
    Ну то есть специалиста можно найти, если поискать, но концентрация будет гомеопатическая, если учитывать количество восторженных щеночков, которые увидели язык вчера, и спешат срочно поделиться уже накопленным багажом знаний.
    Чаты. Телеграм, дискорд - вот это вот все.
    Самая адовая трата времени, которая в принципе бывает в жизни.
    Опять же, люди пишут о чем угодно, кроме программирования, и ради пары полезных строчек надо убить весь день.
    Ответ написан
  • Отзывы о loftshool?стоит ли учиться?

    AnatolTh
    @AnatolTh
    Full Stack Developer
    Если с нуля и если нужен наставник, то конечно стоит, либо тот же htmlacademy, либо в свободном доступе курсы Специалист.
    Ответ написан
  • Отзывы о loftshool?стоит ли учиться?

    totalcount
    @totalcount
    Про Лофт не могу ничего сказать — нет такого опыта. Но есть опыт по Нетологии и по ГикБрейнс. Нетология получше имхо, и доверяют на рынке ей больше (тоже имхо). ГикБрейнс похуже, на мой взгляд. Советовал бы все же пойти в Нетологию.
    Ответ написан
  • Объясните как работает php-fpm?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала почитайте что такое SAPI. Затем представьте что apache + mod_php разделили на web-сервер, который проксирует запросы на php-fpm и отдает статику, и собственно отдельный web-сервер который имплементит SAPI и выполняет запросы связанные только с php. То есть статику отдавать мы можем только через php. Суть примерно та же что и у apache2 + prefork + mod_php но оптимизированный только для работы с php. Так же можно поставить на фронт более быстрый и легковесный сервер который умеет проксировать запросы.

    То есть php-fpm это эдакий fast-cgi сервер который постоянно держит готовые для работы пул-процессов (сколько в пуле процессов настраивается, так же как и от какого пользователя их запускать и все такое прочее). Каждый новый запрос уходит в какой-либо процесс из пула, запрос отрабатывает, возвращаем результат тому кто попросил (web-серверу обычно). Если процесс падает (fatal допустим) - поднимаем новый.

    Принципиальной разницы между apache2+mod_php нету, просто упрощается инфраструктура. Наш web-сервер должен только уметь проксировать запросы и отдавать статику, а php-frpm вообще может быть на разных машинах (балансировщиком можно раскидывать запросы). Ну и сами понимаете, nginx + php-fpm будет быстрее обрабатывать запросы чем apache2+mod_php какой бы мы менеджер процессов не использовали в апаче. Минусов по сравнению с apache+mod_php я даже не могу предложить.

    А php-runtime не зависит от этого. Он один на всех, CLI, FPM, mod_php...
    Ответ написан