Ответы пользователя по тегу PHP
  • Как реализовать хэштеги?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    да все верно

    - пользователь указывает: тэг-1, тэг-2 ... тэг-x
    - разбиваешь по запятым и добавляешь в базу, например в табличку:

    post_id | int
    tag | varchar

    - дальше уже можешь подбивать топ или делать любые другие операции
    Ответ написан
  • Почему метод mediatopic.post возвращает ошибку 100?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Не уверен, но возможно ответ уже есть тут:
    https://toster.ru/search?q=Only+one+of+session_key...
    Ответ написан
    Комментировать
  • С чего начать изучение PHP7 для middle-level JavaScript-девелопера?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Привет, в твоем случае, все что тебе нужно можешь подтянуть за 1 день
    1) Ищешь любую вводную по php ~ 2 часа (синтаксис, сессии, куки)
    2) Изучаешь какую-нибудь простенькую ORM, например Idiorm ~ 2 часа (работа с бд)
    3.а) Изучаешь любой популярный мини-фреймворк: Lumen, Silex (mvc, авторизация и т.д.) ~ 6 часов
    3.b) Если в основном пишешь сервисами, то можно даже упростить, взяв микро-фреймворк, например: Flight PHP ~ 1 час

    ** за это время ты не станешь супер-профи в php, но это даст общую картину и позволит сразу начать делать любые мини-проекты.
    Ответ написан
    Комментировать
  • Как выполнять JS или PHP скрипт в реаальном времени?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    алгоритм такой:
    - на стороне клиента (js), делаешь аякс запросы каждые n-секунд (не забывая обрабатывать тайм-ауты, ошибки и порядок выполнения) к php скрипту. При необходимости в запросе можно слать дополнительные параметры (время или id или что-то еще)
    - на стороне сервера (php) пишешь логику сравнения
    - дальше в зависимости от стороны нужных действий, либо выполняешь что-то в скрипте на сервере, либо шлешь ответ из скрипта клиенту, что настало его время, а он в свою очередь при получении такого ответа делает нужные действия
    Ответ написан
    2 комментария
  • Как сделать кеширование товаров?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Не очень понятно о каком кешировании идет речь, минимальный вариант примерно такой:
    define('CACHE_DIR', '/путь/к/папке/кеша');
    $cacheFile = CACHE_DIR . '/' . intval($_GET['id']); // id продукта
    if (file_exists($cacheFile)) return file_get_contents($cacheFile);
    ob_start();
    // ... любой код
    $output = ob_get_clean();
    file_put_contents($cacheFile, $output);
    echo $output;


    Тут, не учитывается время жизни кеша, функционал работы корзины и т.д. Но, базовый смысл такой.

    В твоем случае, всего скорее проблема в скорости выборки товаров по определенным запросам. Если это так, то самый простой вариант создать таблицу типа memory и там хранить результаты наиболее тяжелых запросов. Более сложный вариант: выяснить что именно требуется кешировать и дальше оптимизировать код / конфиги базы, либо использовать http ускорители типа varnish-а.
    Ответ написан
    2 комментария
  • Почему обрезаются нули в строке php?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    вангую, что нужно сделать:
    $location_variants->{$k} = clone $location;

    P.S. Думаю, что объект $location передается по ссылке и при изменении поля price оно меняется так же в новом объекте.
    Ответ написан
  • Сравнить два массива содержащи guid?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    array_diff - именно та функция что необходима:
    <?php
    
    $arr1 = array( "45ebdbaa-380b-483b-80a2-73d7c53088e2","97baa061-4208-4aeb-8136-eb76c0932a3d");
    
    $arr2 = array( "45ebdbaa-380b-483b-80a2-73d7c53088e2");
    
    print_r(array_diff($arr1, $arr2));


    даёт результат:

    Array ( [1] => 97baa061-4208-4aeb-8136-eb76c0932a3d )


    возможно проблема где-то в другом месте?
    Ответ написан
  • YII2 Сложный запрос с выборкой?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    createCommand и обычный sql, типа того

    SELECT * FROM recept WHERE recept_id IN (
        SELECT DISTINCT recept_id FROM recept_product WHERE
            product_id NOT IN (1,2,3)
    )
    Ответ написан
    Комментировать
  • Можно ли не использовать капчу при авторизации и регистрации?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Любые данные завязанные на сторону клиента (сессии, куки и т.д.), не защитят никак от перебора паролей.

    Самый простой вариант, это записывать ip и кол-во неудачных попыток, дальше при превышении либо делать паузу между попытками (попробуйте через 5 минут), либо показывать каптчу (т.е. не сразу, а после 5 неудачных попыток).
    Ответ написан
    Комментировать
  • Как удалить неявные дубли в массиве php?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    <?php
    
        $arr = ["осиновый лист", "лист осиновый"];
    
        print_r(
            array_combine(array_map(function($val){
                $val = str_split($val);
                sort($val);
                return implode($val);
            },$arr),$arr)
        );


    или то, что посоветовал Сергей

    <?php
    
        $arr = ["осиновый лист", "лист осиновый"];
    
        print_r(
            array_combine(array_map(function($val) {
                $val = mb_split('\s', $val);
                sort($val);
                return implode(' ',$val);
            }, $arr), $arr)
        );
    Ответ написан
    Комментировать
  • Не работают сессии php, в чем дело?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    unset($_SESSION['locality']);
    session_destroy();
    Ответ написан
    2 комментария
  • Как использовать менеджеры пакетов? Composer, bower, другое?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Что-то ты запутался:
    * composer - это штука для управления зависимостями бэкэнда
    * bower - это штука для управления зависимостями фронтенда

    ключевые слова тут "управление зависимостями"

    Ты же беспокоишься, что в итоге у тебя будет торчать наружу. Так вот, не /vendor не /bower_components не должны быть доступны. Доступной у тебя должна быть одна директория - public_html в которой у тебя будет index.php и папка assets в которую и будет собираться вся media (css, js, картинки и т.д.). Как это организовать уже второй вопрос, на который тебе ответит гугл по запросу "сборщик проектов".

    И теперь по порядку:
    1) пользоваться отдельно Composer для PHP, и отдельно Bower
    да

    2) Придется параллельно пользоваться двумя разными менеджерами пакетов
    да

    3) Тогда вопрос, где размещать PHP и JS файлы собственно моего проекта? В /vendor и /bower_components?
    да, используй папки по умолчанию

    4) как это все организовать правильно, красиво и удобно?
    / .. framework_dirs ..
    /vendor
    /bower_components
    /public_html
    + assets/..
    + index.php

    ** По поводу bower, все что он генерит, многие кладут сразу в public_html, но т.к. у него нет возможности удалять лишние (например из всего пакета jquery оставить только 1 файл jquery.js), то я считаю, что полную папку лучше прятать и деплоить исключительно то, что нужно.
    Ответ написан
    3 комментария
  • Как реализовать в MVC?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    1) За что обычно отвечают классы предки в MVC?
    За хранение базовых функций, как пример, давай рассмотрим Controller
    Предположим, что ядро фреймворка, вызывает всегда три метода, в такой последовательности:
    beforeAction - запустить что-то до выполнения экшена
    action - запустить сам экшен
    afterAction - запустить что-то после выполнения экшена

    ** экшн = метод класса контроллера

    так вот чтобы, ты мог не объявлять beforeAction и afterAction, они объявляются в каком-нибудь абстрактном классе Controller, от которого и идет дальнейшее наследование и все потомки получают эти методы

    Либо на примере модели, есть какой-нибудь класс ActiveRecord, ты наследуешь свою модель от него и все потомки получают разом всю его функциональность: например конструктор запросов через вызов цепочек:
    Posts::find()->where(['title'=>'hello world'])->orderBy(['id'=>SORT_DESC])->all();
    ну, а твоя модель выглядит так class Posts extends ActiveRecord{}
    т.е. вся логика скрывается в родителе

    2) По разному, тут надо смотреть конкретный фреймворк: бывает что сервис контейнер этим занимается, бывает DI, бывает просто вызывается фабрика, а внутри ей передается соединение которое хранится где-нибудь в "реестре" ядра... в общем по-разному.

    3) Опять же по-разному, но в целом принцип такой. Для каждой сущности есть своя модель, например есть отдельно модель Конкурсы, есть отдельно модель Участники и т.д. Тебе надо показать отдельно кол-во парней и девушек, тогда в контроллере отвечающим за вывод конкурса, ты обращаешься к модели Участников и получаешь необходимую информацию (что-то типа $boys = Paticipant->maleCount(); $girls = Paticipant->femaleCount(); ) и передаешь эти данные во view. А сам подсчет, работа с бд и т.д. идет уже в модели (Paticipant). В итоге получается что вся твоя логика делится на такие шаги:
    - ядро анализирует запрос и вызывает экшн контроллера
    - экшн контроллера, получает необходимые данные из модели и передает во вью
    - модель содержит всякую логику получения и обработки данных
    - контроллер или экшн контроллера рендерит вью и отдает код клиенту

    4) Ну, обычно на сайте фреймворка пишут что туда входит. Всякие плюшки для разработчиков (например хелперы по созданию форм, классы по работе с SSH, консолью и т.д.), тесты, документация и куча всяких, часто никогда не используемых, штук
    Ответ написан
    Комментировать
  • Как забрать данные из xml средствами php?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Мне лень писать код, я тебе расскажу как надо сделать:

    1) simplexml_load_string, возвращает объект класса SimpleXMLElement:
    php.net/manual/en/function.simplexml-load-string.php

    2) У класса SimpleXMLElement, есть метод xpath:
    php.net/manual/en/simplexmlelement.xpath.php

    3) В xpath можно делать выборку по аттрибутам:
    www.w3schools.com/xsl/xpath_syntax.asp

    По ссылкам есть примеры.

    И не надо слушать говнокодеров не образованных программистов, которые для парсинга XML используют preg_match
    Ответ написан
    7 комментариев
  • Скрипт который удаляет картинки с хостинга в php?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    у тебя должен быть такой скрипт (другие пути):
    if (file_exists('./images/'))
        foreach (glob('./images/*.png') as $file)
            unlink($file);


    такой скрипт удалит все png файлы внутри папки /images/
    Ответ написан
  • Как правильно получить значение php из xml?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    1) покажи полностью твой код
    2) напиши, что по xml ссылке, у меня она не открывается

    попробуй так:
    $xml = file_get_contents('https://export.yandex.ru/bar/reginfo.xml?region=1');
    $o = simplexml_load_string( $xml );
    var_dump( $o );
    Ответ написан
  • Как в PHP присвоить объекту функцию?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Единственный, более менее адекватный вариант, это переопределить точку входа, и перехватывать автозагрузку классов CMS, подключая свои классы-модуля, которые наследуются от базовых классов CMS.

    Я имею ввиду, когда вызывается CMS\Route, ты перехватываешь эту загрузку, объявив раньше свой загрузчик и подключаешь MyModule\Route который унаследован от CMS\Route и изменяет его поведение.

    Это плохо, и за такое отрывают руки, но это лучше чем расстрел, за то, что хочешь сделать ты :)
    Ответ написан
    1 комментарий
  • Запуск js из php?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    получаешь гео-данные до отправки формы, и добавляешь их в форму авторизации скрытым полем

    если такой возможности нет (например, фронтенд это отдельный сервис, к которому у тебя нет доступа), тогда авторизуешь показываешь ему дополнительную страницу "перехода", на которой будет progressbar, а в фоне отправляется тебе ajax, после чего средствами js редиректишь его дальше с этой страницы или сабмитишь форму со скрытыми полями в которых уже есть нужная тебе инфа.
    Ответ написан
    Комментировать
  • Что лучше выбрать для многопоточной программы на выделенном сервере?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Как уже написали выше, используй тот яп который лучше знаешь. Если пол жизни работал с delphi можешь посмотреть в сторону java. На мой взгляд самая большая проблема, не в том как запустить 100500 потоков, а как организовать их взаимодействие (что скачено, что качать, куда это и как ложить, что делать в случае ошибок и т.д.)

    На php даже можно не форкать ничего, пишешь bash скрипт, который запускает 30 инстансов php-cli, где каждый инстанс работает с очередью данных (какой-нибудь rabbitmq) и всё. Главное не усложняй :)
    Ответ написан
    Комментировать
  • Как найти нужный элемент в string?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Тебе надо подробнее почитать про регулярный выражения, например Дж. Фридла.

    В твоем случае будет что-то типа:
    if (preg_match('~<input[^>]+name="csrfmiddlewaretoken"[^>]+value="([^"]+)"~Ui', $page, $matches)) {
        print_r($matches);
    } else {
        throw new Exception('Pattern not found');
    }

    А вообще для парсинга страницы, лучше использовать что-то типа DiDom
    Ответ написан
    Комментировать