Ответы пользователя по тегу PHP
  • Как сделать ручной редирект на определенную страницу?

    @MikUrrey
    Думаю, лучше всего сделать так: каждое сообщение сделать (если еще не сделано) объектом, в котором будет приходить тип, например text или command.
    text выводится клиенту, command выполняется браузером.
    //Где-то в недрах кода ждем команды...
    document.addEventListener("commandFromChat", function(e) {
      switch(e.detail.command) {
        case "goto": return document.location.href = e.detail.payload;
        case "somethingElse":  break; //можно обрабатывать разные команды
      }
    });
    
    //Нам письмо!
    let message = {
      "type":  "command",
      "command":  "goto",
      "payload":  "https://flowers.shop/красные-розы-100-см.html"
    };
    
    //Получая команду, браузер инициирует событие, например так:
    if (message.type === "command") {
      let event = new CustomEvent("commandFromChat", { "detail": message});
      document.dispatchEvent(event);
    }


    Таким образом можно чат превратить в инструмент исполнения любых желаний покупателя менеджером)

    Только не забудьте о безопасности, чтобы П не превратился в объект развлечения для К :))
    Ответ написан
    2 комментария
  • Как исправить кодировку в ajax?

    @MikUrrey
    Ответ конкретно на вопрос:
    $pol = mb_convert_encoding($_GET['value'], 'UTF-8', 'windows-1251');
      $pol1 = mb_convert_encoding($_GET['oldvalue'], 'UTF-8', 'windows-1251');

    или
    $pol = iconv('UTF-8', 'windows-1251', $_GET['value']);
      $pol1 = iconv('UTF-8', 'windows-1251', $_GET['oldvalue']);


    Вы, надеюсь, понимаете, где ваш код уязвим, почему его нельзя использовать в реальном проекте и то, что набор функций mysql_* уже давно никто не использует?
    Ответ написан
  • Почему не находит часть строки с символами подчёркивания?

    @MikUrrey
    Почему не находит часть строки с символами подчёркивания?

    Находит, strpos вернул позицию начала подстроки в строке - 0.
    Если нужно проверить, то строгим равенством - не находя подстроку, strpos возвращает false.
    <?php 
    if ($pos !== false) { ... }

    Как можно обрезать строку и получить brand_id?

    Много способов, зависит от исходных условий. В вашем случае, возможно, такой подойдет:
    <?php
    $brand_id = preg_replace('/^_from_search_/',  '',  $str);
    Ответ написан
    6 комментариев
  • Php код вставляется как текст в html, как исправить?

    @MikUrrey
    У вас, похоже, не установлен PHP. Попробуйте:

    sudo apt install php libapache2-mod-php
    sudo systemctl reload apache2
    Ответ написан
    1 комментарий
  • Как вытащить логи PHP наружу из контейнера?

    @MikUrrey Автор вопроса
    Помог следующий совет от единомышленника с другого ресурса:

    Поскольку вся директория, куда подключается том, замещается, нужно выполнить создание файла после монтирования, используя секцию CMD:
    CMD touch /usr/local/php-logs/php-fpm.log && \
      chmod 666 /usr/local/php-logs/php-fpm.log && \
      php-fpm -F

    (php-fpm -F - это команда запуска сервера, которая уже была в CMD).

    Теперь всё работает просто отлично.
    Ответ написан
    Комментировать
  • Ошибка при сборке контейнера во время установки composer?

    @MikUrrey Автор вопроса
    Решение такое: curl: (23) Failed writing body означает, что программа, вызванная "по трубе", не обработала вывод от curl и упала. Если ваш случай 1 в 1, значит, скорее всего, неправильно сконфигурирован РНР. В php.ini включите display_errors = On и смотрите вывод, РНР сообщит, что не так.
    В моем случае не так было вот что:
    Fatal error: Directive 'track_errors' is no longer available in PHP in Unknown on line 0

    Удалил из php.ini track_errors, и контейнер взлетел.
    Ответ написан
    Комментировать
  • Как уладить проблему с Сomposer 1.x.x?

    @MikUrrey Автор вопроса
    Странно, но на следующий день все сработало без ошибок. Подозреваю, что это мог быть github'овский rate limit, но не уверен в этом полностью.
    Возможно, кому-то будет полезен совет: если не нашли решения подобной проблемы, попробуйте сделать то же самое через сутки.
    Ответ написан
    Комментировать
  • Как сделать отметить людей?

    @MikUrrey
    1) В браузере: в JS переменную рендерится список участников беседы. Как- зависит от требований. Может, статично вместе с HTML-кодом страницы, может, динамически - AJAXом, а может, в "живом" режиме посредством WebSocket. На обработчик события input в поле textarea вешается задача выводить меню участников на позиции курсора, если нажата "собака" @ (чаще всего именно она используется для обращений). Клик на пункте меню добавляет ник собеседника после "собаки"
    2) На сервере: получаем текст и регуляркой извлекаем подстроки вида "@никнейм", собираем их и извлекаем из базы данных юзеров по никнеймам их реквизиты, на которые и будем слать уведомления (SELECT WHERE IN).

    Более подробные детали реализации проявляются по ходу изучения стека разработки :)
    Ответ написан
    Комментировать
  • Возможно ли иметь на одном сервере Flask и PHP?

    @MikUrrey
    Лучше всего, пожалуй, для этого использовать Docker. Flask в одном контейнере, PHP - в другом, база данных - в третьем. Запустить все через Docker compose, и пусть общаются между собой по внутренней сети.
    Можно и прямо как есть, в одном пространстве, но тогда задолбитесь настраивать порты и веб-серверы.

    Хотя еще можно попробовать заставить Flask слушать какой-то специфический порт, скажем, 82, и тогда сайт, теоретически, сможет к нему стучаться через 127.0.0.1:82. Но на практике без тонкой настройки могут элементы окружения подраться между собой.
    Ответ написан
    4 комментария
  • Что плохого в статических функциях?

    @MikUrrey
    Статические блоки памяти (переменные, функции, методы, свойства) нужно использовать только тогда, когда вы понимаете, почему они у вас здесь и сейчас должны быть статическими.
    Статические методы ругают за то, что они вызываются без инициализации класса и, соответственно, не взаимодействуют с другими его членами, что идет вразрез и с самой идеей ООП, и с практическими подходами вроде SOLID.
    Часто статические методы применяются в составе хелперов, т. е. если класс используется как контейнер для методов (а, по сути, обычных функций), сгруппированных по смыслу, где не подразумевается создание объекта. Например,
    namespace app\helpers;
    
    class StringHelper
    {
    
       public static function truncate($string)
       {
           //...
       }
    
       public static function capitalize($string)
       {
           //...
       }
    }

    Но такой подход тоже ругают :) Хотя бы потому, что с приходом пространств имен в PHP группировать и изолировать таким образом функции уже не нужно.
    namespace app\helpers\string;
    
       function truncate($string)
       {
           //...
       }
    
       function capitalize($string)
       {
           //...
       }

    - теперь вместо
    \app\helpers\StringHelper::truncate($string);
    используем
    \app\helpers\string\truncate($string);
    суть не меняется, но мусорный бак с набором "всякой всячины" превратился в аккуратный чемоданчик инструментов)

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

    @MikUrrey
    Привет!
    Как правильно организовать нахождение классов с API в структуре проекта (MVC)? Они хранятся вместе с моделями? Или нужно создавать отдельную папку в папке APP (Или вне ее?)?

    Часто применяемая (но не единственно правильная!) схема:
    - /App
       | - /Models
       | | - Article.php
       | | - Category.php
       | - /Controllers
       | | - Articles.php
       | | - Categories.php
       | - /views
       | | - /articles
       | | | - articles_list.php 
       | | | - article_page.php 
       | | - /categories
       | | | - my_categories.php 
       | | | - categories_list.php 
       | | | - article_page.php

    App - соответственно название вашего приложения, MyFirstSobes ;)
    Имейте в виду, что структура не "железная" - могут создаваться папки при необходимости как в App, так и в других папках приложения.
    допускается делать методы внутри Модели\контроллера?

    И допускается, и приветствуется)
    Далее: если вы делаете REST API (сужу по упоминанию json_encode), имейте в виду, что это MVC без "V".
    Т. е. "представления" здесь не нужны, обычно контроллер выплевывает клиенту JSON без помощи шаблонов.

    Просто показать на собесе, что я умею пользоваться функцией json_encode()

    Ой-ой-ой, с таким подходом до собеса дело не дойдет, простите за прямоту)

    Коллеги верно пишут - штудируйте ООП, вникайте в паттерны проектирования, пилите личные проекты, изучайте фреймворки и структуру чужих проектов. Развивайтесь, в общем)
    Ответ написан
  • Как передать массив дат в javascript?

    @MikUrrey
    У вас происходит путаница со структурой из-за того, что вы пытаетесь создавать JSON "вручную".
    Смотрите, тут все просто: вам нужно создать подобный по структуре массив в РНР, а потом сконвертировать его в JSON штатными средствами.
    <?php
    $datejs    = [];
    //...
    $datejs[] = [$YY, $MM, $DD];
    //...
    echo json_encode($datejs);

    json_encode даст на выходе по сути валидный JS код, который можно потом присвоить переменной
    echo '<script type="text\javascript">';
    echo 'var disabled = ';
    echo json_encode($datejs);
    echo ';' . "\n"
    echo '</script>';

    или передать в ответ на AJAX-запрос.
    Ответ написан
  • Как подгружать текст без повторов на php?

    @MikUrrey
    Подойдет вариант с удалением?
    Файл называется index.php и размещается в папке skripti :
    <?php
    $files = glob('*.txt'); //получаем список имен файлов
    $idx = rand(0, sizeof($files)-1); //генерируем случайный номер в списке
    $file = $files[$idx]; //получаем по этому номеру имя файла
    echo file_get_contents($file); //выводим его содержимое
    unlink($file); //и удаляем.
    ?>

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

    @MikUrrey
    # Если кнопка "Yes" нажата
        if( isset( $_POST['btn_yes'] ))
        {
            //Здесь должно происходить что-то типа
            echo '<div class="vacancy remove">';
        } else {
            echo '<div class="vacancy">';
        }
    Ответ написан
  • Что лучше Null или пустая строка в ValueObject?

    @MikUrrey
    Вы получаете и обрабатываете GET-параметры, обычный GET-параметр - это строка.
    "По-правильному" -
    $this->fullname = $request->request->get('fullname', '');

    Создавать NullObject в данном случае - это излишество, PHP - один из немногих ЯП, где строка не является объектом. Сгодился бы и null, но это "не православно".
    Ответ написан
  • Не удается создать связь между таблицами. Что делать?

    @MikUrrey
    Связь не устанавливается - такие утверждения нужно конкретизировать)
    Наверное, выдает ошибку о том, что foreign key ссылается на несуществующие записи?
    В таком случае, нужно сначала все связуемые таблицы проверить JOIN'ами и найти потенциальные несоответствия, потом решить что с ними делать - либо удалить, либо создать недостающие записи.
    (Прошу прощения - ошибку на скрине не сразу заметил).
    Ответ написан
    4 комментария
  • Выводится только последний элемент массива в цикле foreach. Что делать?

    @MikUrrey
    Навскидку - вы данние пишете в массив $dec, а выводить их пытаетесь из $val:
    $dec = json_decode($f, true);
    
            // for($val = 0; $val < count($dec); $val++) {
            //     echo "<tr>";
            //     echo "<td>".$val["name"]."</td>";
            //     echo "<td>".$val["number"]."</td>";
            //     echo "<td>".$val["date"]."</td>";
            //     echo "<td>".$val["time"]."</td>";
            //     echo "</tr>";       
            // }

    и формат данных в JSON у вас смешанный, многомерный, а вы его как плоский список перебирали.

    Наиболее универсально - применить рекурсию:
    <?php
    function printDec($dec) {
        foreach ($dec as $k => $item) {
            if ($k === "0" || $k === 0) {
                printDec($item);
            } else if ($k === "name") {
                echo "<tr>";
                echo "<td>".$item."</td>";
            } else if ($k === "time") {
                echo "<td>".$item."</td>";
                echo "</tr>\n";
            } else {
                echo "<td>".$item."</td>";
            }
        }
    }
    $f = file_get_contents("data.json");
    $dec = json_decode($f, true);
    printDec($dec);
    Ответ написан
    6 комментариев
  • Везде ли нужно проверять на существование элемента в массиве?

    @MikUrrey
    Привет!
    Если массив является частью входных данных, будь то user input, или какой-то файл, или БД, то всё верно - проверка нужна (даже обязательна). А вот в таком случае и подобных точно нет:
    $this->someParam = [
         'a' => 1,
         'b' => 2,
    ];
    //...
    //...
    //...
    $a = $this->someParam['a'] ?? '';

    Такая проверка уже сродни
    if (TRUE !== FALSE) {
         //...
    }
    Ответ написан
    2 комментария