Ответы пользователя по тегу PHP
  • Адаптация сайта под мобильные устройства с помощью php mobile detect и как это повлияет на SEO?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Данное сообщение не претендует на исчерпывающий ответ, но думаю эта информация будет полезной. Лично я - так никогда не делал, т.к. мне в целом не нравится этот подход, прежде всего с точки зрения обслуживания двух версий вёрстки. Но есть ряд сайтов, в т.ч. и довольно серьёзных компаний, например таких как YouTube, ВсеИнструменты и другие, которые перекидывают мобильные устройства на мобильные версии сайта, что на мой взгляд, технически очень мало отличается от описанной Вами схемы (скорее даже наоборот, Ваша схема выглядит более интересно, т.к. всё действо происходит в рамках одного домена, без поддоменов и страниц-дубликатов).

    Но я бы всё же подумал, стоит ли так заморачиваться, мобильную версию сайта всё равно нужно адаптировать и содержать два набора шаблонов одновременно. Если Вам нужно вырезать какой-то контент - это должна быть графика, видео и прочие тяжелые элементы (т.к. вырезать основной текста страницы по моему, смысла нет) - возможно, эти элементы имеет смысл просто скрыть? Если мне не изменяет память, современные браузеры не будут грузить, скажем, изображения которые не отображаются на странице (в принципе Вы всегда можете это проверить самостоятельно, просто скрыв элемент и посмотрев логи HTTP-сервера). Либо же в крайнем случае добавить немножко JS'а, который будет управлять некоторыми частями контента страницы в зависимости от устройства.
    Ответ написан
    Комментировать
  • Как составить регулярку на совпадение?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Может быть так? ^https\:\/\/\S+?\.domain.ru$
    Ответ написан
    1 комментарий
  • Как создать многоуровневое выпадающее меню для сайта?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Всё далее сказанное - исключительно личный опыт и мнение, на истину не претендует.

    Лучше написать верстку с уклоном на статику: на чистом html+css,
    Я бы написал именно так, если это возможно. Это как минимум должно быть быстрее чем то же самое + JS.

    на bootstrap с добавлением css
    Это скорее всего будет быстрее с точки зрения получения результата, но на счёт качества такого решения - есть большие сомнения. Вообще, одно из правил HTML'а/вёрстки - если есть возможность реализовать что-то меньшим кол-вом элементов - нужно делать именно так. То есть, если физически есть возможно сделать что-то с помощью одного <div/>'а, а не двух, трёх и т.д. - нужно делать это одним <div/>'ом (без фанатизма конечно).

    или сделать более динамично: на php, реализовав все через цикл для получения вывода элементов: «Категория», «Товары», «О нас» и т.д.?
    Это напрямую зависит от Ваших задач и потребностей. Если Вам нужно что бы меню формировалось на сервере - то его нужно формировать на сервере. К вёрстке непосредственно это не относится. Лично я в своей практике использую и тот и другой подход, а иногда оба сразу (часть меню - статическая, часть - динамическая), в зависимости от желаемого результата.

    P.S. Про "функциональность" не могу судить в контексте данного вопроса, но по скорости загрузки, - вариант без Bootstrap'ов и JS - должен быть максимально быстрым.
    Ответ написан
    Комментировать
  • Что делать если в класса сущности много свойств?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Какие есть варианты упрощения ? чтобы при создании объекта не передавать кучу параметров в конструкторе.
    На вскидку, вариантов несколько:
    1. Передавать не 20 десятков свойств, а именованный массив, например так:
    __construct($array) { ... }
    
    new MyClass([
        'property1' => 'value1',
        'property2' => 'value2',
        'property2' => 'value3',
    ]);


    А в самом классе соотв. заполнять те поля которые не переданы - значениями по умолчанию (если это допустимо), так будет несколько более читабельно.

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

    3. Или, можно где-то сохранять эти значения (в конфиге, в БД, в сессии, где-то-ещё) и при создании экземпляра нужного класса - доставать их оттуда (такая практика встречается довольно часто).
    Ответ написан
  • Как обновить данные php с помощью ajax?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    нужно вставить код html в котором есть php
    Если Вы хотите, что бы этот код PHP выполнился - то скорее всего никак, т.к. PHP обычно выполняется на сервере.

    Как альтернативный вариант Вы можете разместить этот самый PHP-код на сервере, скажем по адресу /myphpcode.php, сначала обращаться к нему, примерно так:
    //Код исключительно для примера, на работоспособность не проверял
    var myphpcode = null;
    $.get('/myphpcode.php', function(data) {
        myphpcode = data;
    });


    А потом полученный результат вставлять куда Вам нужно.
    Ответ написан
    Комментировать
  • Как взаимодействовать с другой функцией?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Если речь идёт о контексте класса, то я думаю Вам нужно это.

    P.S. Ну и вот ещё пара ссылок: раз, два по теме "цепочка вызовов PHP".
    Ответ написан
    3 комментария
  • Как подключить файлы, лежащий на другом сервере?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Вообще, обычно для задач подобных тем, что Вы описали - используют Git и другие системы контроля версий, который рассылают уведомления о том, что исходный код на источнике обновился, зависимые серверы получив такое уведомление (оно ещё называется "пуш") - они скачивают обновление и развораичвают его локально, подобный процесс так же иногда называется "сборкой".

    Но, насколько я понимаю, у Вас случай несколько проще и не требует "тяжелой артилерии". В этом случае, может быть актуально использовать программы типа sshfs или ftpfs и прочие подобные штуки.

    Почитать можно например тут или тут.

    Если простой вариант Вас не устроит - можете попробовать использовать такие сервисы как например GitHub или BitBucket, там есть такая штука как "Веб-хуки", именно она как раз таки рассылает уведомления о том, что исходный код был изменен, можете попробовать написать простенький скрипт, например на том же PHP, который бы стягивал изменения из удалённого репозитоиря и проводил прочие манипуляции подобного толка.
    Ответ написан
    1 комментарий
  • Как добавить перенос в PHP при записи в базу данных?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Я думаю что как-то примерно так: $summ = $param1 .= "\r\n" .= $param2
    Ответ написан
  • Нужно ли экранировать get-запросы в input?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Не совсем понятно, что Вы имеете в виду под фразой "вставляю GET-запрос"... варианта у меня два на эту тему: либо результата GET-запроса, либо какие-то доп. параметры для GET-запроса. В обоих случаях, если речь идёт о содержимом какого-то поля типа INPUT (или TEXTAREA, что равносильно по сути) - оборачивать его в htmlspecialshars - лично я никакой необходимости не вижу. При отправке запроса - форма сама по себе прекрасно кодируется, без всяких "оборотов", содержимое поле исходно так же обычно не требует никаких дополнительных "оборотов", не зависимо от того, собираетесь ли Вы сохранять это в БД или нет.

    P.S. Вообще, говоря про htmlspecialchars() и БД, логически "оборачивание" делается перед выводом данных на сайте, а не перед вставкой. Делается это например для того, что бы исключить возможность недобросовестным пользователям, которые оставляют скажем комментарии - вставлять в эти комментарии например JavaScript-код и прочие подобные факторы.
    Ответ написан
  • Как выполнить цикл внутри цикла 1 раз?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Как выполнить цикл внутри цикла 1 раз?

    Примерно как-то так:
    $flag = true;
    
    foreach($var1 as $v1) {
        if($flag) {
            foreach($var2 as $v2) { 
                 //2-й цикл
            }
            
            $flag = false;
        }
    }
    Ответ написан
    4 комментария
  • Зачем добавлять классы в контейнер в Laravel?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Почему лучше добавлять классы в контейнер и создавать их из контейнера а не через new?
    Откровенно говоря, вопрос звучит аки "почему молоток лучше чем пассатижи?".

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

    А все прочие прелести, возникшие в результате такого подхода, например связка модели с параметром роута и т.п. - это уже побочный эффект подхода, а не его основная задача. При этом, если Вам "просто нужен какой-то класс" - никто не запрещает создавать его через new или иным другим способом.

    P.S. Я понимаю, что объяснение слегка примитивное и не совсем точно отражает суть, но другого объяснения, которое бы не переросло в формат/масштаб на учной статьи, на данный момент у меня не нашлось.
    Ответ написан
  • PHP: как сделать так, чтобы аргумент мог принять только одно из определённых значений?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Мне почему-то кажется, что должно существовать какое-то более грамотное решение.

    Возможно, вот такое:
    if(in_array($arg, ['foo', 'bar', 'baz'])) {
        // ...
    }
    Ответ написан
    2 комментария
  • Какие есть хорошие библиотеки для считывания текста?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Судя по ~2.3млн. загрузок и ~4.4к звёзд - вот хорошая библиотека для чтения офисных форматов и PDF. А ещё есть вот это. И ещё есть поиск на packagist.
    Ответ написан
    1 комментарий
  • Что почитать о продвинутой разработке web приложений?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    1. Приложение должно работать 24/7 с возможностью остановить и запустить процесс заново.
    Приложения на PHP, по умолчанию работают "24/7", но если Вы хотите, что бы процесс PHP постоянно висел в памяти - лучше обратить внимание на другой язык/стек, например C# + .NET или GO, они работают по принципу "процесс постоянно сидит в памяти", если для Вас это принципиально, т.к. у PHP несколько другая архитектура и, запустить ПХП-скрипт в циклическом режиме хоть и ничего не мешает, но я бы так делать не стал (по принципу "колоть орехи монитором - тоже ничего не мешает").

    2. Связь фронтенда и бэкэнда реализована с помощью jQuery запросов к PHP - что мне кажется далеко не самым оптимальным вариантом.
    Клиент-серверный обмен данными на уровне REST-API - вполне себе оптимален и достаточно часто применяется, если Вы об этом...

    Не хочу учить по книжкам, сразу пытаюсь решать реальные задачи. Если то в языке не пойму - смогу загуглить.
    Это Вы зря... Для начала, я бы всё-таки рекомендовал Вам книжку за авторством Котерова "PHP 7". Отличная книга "начального уровня". Если осилите её целиком - это будет неплохой старт.

    P.S.
    Знаю/понимаю фронтенд. В бэкэнде (на PHP) могу решить 90% задач, которые должно делать приложение.
    Мне нравится Ваш оптимизм :)))

    Эпилог:
    jQuery постепенно уходит в историю, если хотите "знать фронтэд", на сегодняшний день - нужно знать хотя бы 1 из популярных ЖС-фреймворков, сейчас очень активно применяются (примерно в равной степени) VueJS и ReactJS, рекомендую Вам изучить хотя бы один из них, помимо прочего...
    Ответ написан
    9 комментариев
  • Как бесконечно повторить n-итерацию цикла?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Альтернативный вариант:

    <?php
    
    $x = 10;
    for($i = 0; $i < 100; $i++) {    
        if($x > 0) {
            $i--;
            $x--;
            echo "X: {$x}<br/>";
            // continue;
        }
    
        echo "I: {$i}<br/>";
    }


    Формально, такой вариант будет повторять именно ту итерацию. Но вариант с while'ом (указанный выше) мне нравится больше.
    Ответ написан
    Комментировать
  • Как получить данные по api?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    В том смысле, что может они в какой то глобальный массив записываются, и я могу попробовать их оттуда получить?
    Не исключено. В первую очередь следует обратить внимание на массивы $_GET и $_POST.
    Ответ написан
    Комментировать
  • Как подписать запрос SSL сертификатом с удаленного ресурса?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Есть подозрение, что параметр/аргумент cert который вы указываете - должен принимать путь до сертификата, а Вы передаёте ему содержимое сертификата, а не путь. Решений тут на вскидку несколько:
    1. Найдите HTTP-клиент (или параметр у текущего клиента) который позволяет указывать содержимое сертификата
    2. Скачивайте сертификат на сервер, указывайте путь до него и удаляйте, после выполнения запроса сертификат (если в этом есть необходимость)
    3. Аналогичным образом Вы можете сохранить его в БД, доставать оттуда и сохранять временно при каждом запросе
    4. Можете попробовать переписать сам клиент таким образом, что бы он принимал на вход не путь, а сразу содержимое сертификата (я думаю, это будет не очень сложно)
    Ответ написан
    1 комментарий
  • Как менять аватарку на своем сайте?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    При обновлении странички, проблема не пропадает.
    Судя по описанию, это связано с тем, что картинка кэшируется в браузере. Решить это можно например так: <img src="image1.png?<?php echo time(); ?>" /> Это пожалуй самый просто вариант (менять путь, что бы он не кэшировался).

    Кэш в браузере так же обычно сбрасывается с помощью нажатия пару раз на Ctrl+R или Ctrl+F5.

    Ещё можно в на http-сервере настроить заголовок, что бы конкретно эта картинка не кэшировалась... Ещё картинку можно отдавать с помощью PHP и скриптом контроллировать заголовки отвечающие за кэширование...
    Ответ написан
    9 комментариев
  • Почему по крону php скрипт не все данные исполняет?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Наиболее вероятных совета тут два:
    1. Парсер, как и любая другая программа подобного толка должен вести лог, из него обычно и узнают про причины и источники ошибок.
    2. Убедитесь, что у парсера достаточно прав для записи всех файлов во всех местах, куда он их пишет. Для проверки можете добавить эту же задачу в крон под root'ом (или иным образом заставьте запускаться Вашу программу от имени администратора). Если ошибки исчезнут - значит проблема была в правах.
    Ответ написан
    2 комментария
  • Разворачивают ли у вас разработчики сервисы локально?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Кто как справляется с этой проблемой?


    Мы легко решили для себя эту проблему с помощью двух инструментов:
    1. Часть сервисов работает на тестовом сервере, доступном локально
    2. Docker

    P.S. Разворачивать и обновлять проекты в докере - дело если не нескольких секунд, то минут, не более того. При этом за всю настройку и прочую богадельню связанную с настройками ОС для сервиса, софта и пр. - отвечают авторы самого сервиса, разработчику достаточно скачать/обновить несколько файлов описывающих контейнер(ы) и выполнить 1-2 команды, дальше всё соберётся и поднимется автоматически.
    Ответ написан
    Комментировать