Ответы пользователя по тегу PHP
  • Как привести объект родителя к объекту потомка?

    Adamos
    @Adamos
    Можно ли привести объект родителя к объекту потомка?

    Нельзя привести объект к тому, чем он не является.
    Потомок может быть создан из родителя - банально конструктором, например.
    Ответ написан
    Комментировать
  • В чем разница между шаблонами делегирование, фасад, интерфейс?

    Adamos
    @Adamos
    Не очень владею терминологией паттернов, но предположу, раз больше желающих нет.

    Фасад скрывает от использующего нюансы реализации. Например, в Laravel используется фасад DB, который позволяет просто отправить SQL-запрос к таблице в подключенной к Ларавели БД. Используя DB, нужно знать только поля этой таблицы. Как она подключена, на каком движке - SQLite/MySQL/Postgres/etc, логины-пароли - все это остается за фасадом.

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

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

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

    Adamos
    @Adamos
    Для начала - забыть про "мастер данные" и считать то, что внес мастер, просто первой версией данных. Добавленные или исправленные - очередная версия. Хранятся все версии, у последней редакции - пометка "активная", по ней и выборка. При удалении ставится отметка об удалении, с активной удаленной активность переходит на предыдущую, при попытке удаления единственной неудаленной версии - отлуп.
    Ответ написан
    Комментировать
  • Как правильно организовать модерацию записей от пользователей?

    Adamos
    @Adamos
    Не экономьте на спичках и просто храните все варианты записей.
    А отображайте - ту, у которой стоит пометка "активная" (это последняя отмодерированная).
    Ответ написан
    Комментировать
  • Как записать данные в CSV файл из php?

    Adamos
    @Adamos
    Прочитать документацию на используемые функции.
    У fputcsv не два аргумента, а шесть.
    Можно выставить такие значения, чтобы даже дебильный Ёксель правильно разобрал.
    Calc, между прочим, таки спрашивает, а не корчит из себя экстрасенса.
    Ответ написан
    Комментировать
  • Функция вызывает сама себя?

    Adamos
    @Adamos
    Это называется - рекурсия. Выполняется та же самая функция, с самой первой строчки, только аргументом к ней будет внутренний массив. Так что она выведет те два числа - 32 и 12 через отбивку и закончит работу, вернувшись в вызвавшую функцию.
    Для человеческого понимания представьте, что на месте рекурсивного вывода на распечатку еще раз положили распечатку той же функции. И если надо - можно накладывать сверху еще сколько угодно листов с такими распечатками. А когда их текст заканчивается - снимать, возвращаясь на то же самое место, откуда был вызов.
    Ответ написан
    4 комментария
  • Как выбрать переменную которая определена в другом файле?

    Adamos
    @Adamos
    Первый шаг в сторону от лапши говнокода.
    # template-parts/_vars.php
    <?php
    function getVars() {
      return [
        'page_reviews' => ['Дрянь', 'Дрянь из дряней', 'О-о-о!']
      ];
    }
    
    # template-parts/reviews.php
    <?php
    function makeReview($vars) {
        echo implode('<br />', $vars['page_reviews']);
    }
    
    # index.php
    <?php
    require_once './template-parts/_vars.php';
    require_once './template-parts/reviews.php';
    makeReview(getVars());
    Ответ написан
    Комментировать
  • Как сделать вывод только тех пользователей, с которыми уже есть переписка?

    Adamos
    @Adamos
    SELECT * FROM nano_user 
    WHERE id IN (SELECT DISTINCT incoming_msg_id FROM messages) 
    OR id IN (SELECT DISTINCT outgoing_msg_id FROM messages)
    ORDER BY id DESC

    Запрос, разумеется, не самый оптимальный.
    Но судя по вопросу - и записей там далеко не миллионы, так что в обозримом будущем этот будет работать и не станет "бутылочным горлышком". Особенно если на идентификаторах в таблице messages проставлены индексы (а они, очевидно, должны быть проставлены, поскольку постоянно идет выборка для конкретного пользователя).
    Ответ написан
    1 комментарий
  • Как обработать php ошибки на клиенте, если доступа к php.ini нет?

    Adamos
    @Adamos
    <script>
    function checkFileSize(){
      if(document.getElementById('fileInput').files[0].size > 52428800) {
        alert('Не пролезет!');
      }
    }
    </script>
    
    <input id="fileInput" type="file" onchange="checkFileSize();" />
    Ответ написан
    Комментировать
  • Когда стоит начинать изучать ООП в PHP?

    Adamos
    @Adamos
    В простеньких приложениях ООП приложить некуда будет.
    Начнется борьба с собой: почему тут надо наворачивать такие сложности, вот же тяп-ляп - и работает.
    ООП - способ упорядочивания сложного, объемного кода.
    Берясь за более сложные задачи на Пыхе, сейчас, имхо, пройти мимо ООП сможет только человек, который защищен законами США от электрического стула (это имеющий IQ ниже 70).
    Ответ написан
    Комментировать
  • Как выводить предупреждения в php?

    Adamos
    @Adamos
    PHP не интерактивен, его нельзя прервать, выдав пользователю запрос и продолжить после ответа.
    В РНР вы можете только проанализировать данные и выдать ответ - все прошло или остались вопросы.
    Остальное делается в браузере, в JS: на форму, куда прикрепляется файл, вешается обработчик, который отправляет его по AJAX в PHP и разбирает ответ. Если в ответе есть вопросы, они выдаются пользователю и данные отправляются снова по тому же AJAX, но уже с ответами пользователя, определяющими поведение РНР при обработке файла.
    Ответ написан
    1 комментарий
  • Как сделать появление второго select при выборе значения в первом html\php?

    Adamos
    @Adamos
    А РНР здесь и ни при чем. Для этого нужен javascript.
    Такая логика называется chained select. Для нее должен работать AJAX-запрос к серверу: в запросе город, в ответе - список серверов. Либо, если список не слишком велик, эти данные можно сразу включить в страницу и просто выбирать нужные по событию изменения первого select.
    Ответ написан
    5 комментариев
  • Вопрос по user-friendly Web-интерфейсу для MySQL?

    Adamos
    @Adamos
    Вам открылась прекрасная возможность слезть с копролитов (Access) и прекратить бардак (копание пользователей в сырых данных без всяких ограничений).
    Можно начать работать не с записями и таблицами, а с данными.
    Нужно только разобраться, какие у вас данные, как с ними работают, и настрогать соответствующий интерфейс поверх любых популярных backend/frontend фреймворков.
    Это не так страшно, на самом деле. Зато потом у вас будет инструмент для работы и новые горизонты понимания, как можно работать, если оторваться от мс-офисных привычек. Нормальные роли и рабочие процессы пользователей, нормальная аналитика для начальства, нормальное хранение данных, наконец, которому не страшен "первый же залетевший дятел"...

    Можно сделать постепенный переход: скажем, в админке сайта сделать CRUD-операции с вашими таблицами (после прописывания во фреймворке соответствующих таблицам моделей такая админка может создаваться на полуавтомате), и туда пока пустить всех. Понемногу пишутся конкретные страницы, с которыми можно работать не на таком низком уровне - и сотрудников постепенно, по мере решения насущных задач, выгоняют из той админки на те страницы.
    Ответ написан
    1 комментарий
  • Ошибка HTTP ERROR 500 при запуске основного файла для установки 1с Битрикс?

    Adamos
    @Adamos
    Проверка сервера официальным скриптом от Битрикса, выдающая все нестыковки в его конфигурации с требованиями CMS.
    Ответ написан
  • Как правильно(!) отредактировать файл из vendor?

    Adamos
    @Adamos
    Если это один класс, в котором вы понятным для себя способом заменяете функционал - можно просто создать в своем коде класс-наследник и использовать его вместо вендорского.
    Но если это кусок целой системы, а вы решили взять и немножко ее поправить - тут нет "правильных" вариантов.
    Папка vendor, по логике современного РНР, вообще не относится к вашему проекту - она должна автоматически подтягиваться под его зависимости. Никаких правок непосредственно в нее не вносится.
    Ответ написан
  • Как перенести длинную строку в коде?

    Adamos
    @Adamos
    $send .= <<<LONGSTRING
    sudo screen -dmS screen_name docker run $user_container $memory_container -d -it \
    --cpus '1' --memory=${mem}m $v1 $v2 $v3 $v4 $v5 -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 \
    $v6 $v7 $v8 $v9 $v10 $v11 $v12 $v13;
    LONGSTRING;
    
    $send .= implode(' ', [
      'sudo screen -dmS screen_name docker run',
      $user_container,
      $memory_container,
      "-d -it --cpus '1'",
      '--memory=' . $mem . 'm',
      $v1, $v2, $v3, $v4, $v5,
      '-e LANG=C.UTF-8 -e LC_ALL=C.UTF-8',
      $v6, $v7, $v8, $v9, $v10, $v11, $v12, $v13
    ]);
    Ответ написан
    Комментировать
  • Как найти совпадения в бд?

    Adamos
    @Adamos
    В базе со стоп-словами должны быть не слова, а маски, где, например, звездочками обозначается, что сверяется только начало слова. В примитиве - скачиваете весь список, превращая маски в регулярки (например, заменяя * на .*) и объединив их в одно общее выражение, делаете preg_match.
    Ответ написан
    Комментировать
  • Зачем задавать приватный модификатор доступа для свойств класса?

    Adamos
    @Adamos
    class VeryOpenOne
    {
    public $property;
    }
    $voo = new VeryOpenOne();
    $name = 'pro' . 'perty';
    $voo->$name = 'Пытаясь отрефакторить тот класс, ' .
      'ты хрен найдешь, что в этой строчке меняется эта переменная. ' .
      'Никакое самое умное IDE не поможет';
    Ответ написан
    1 комментарий
  • /card​/list в WB API?

    Adamos
    @Adamos
    Мучаюсь и не могу понять в чем ошибка уже более недели

    Предлагаете теперь нам помучиться и поугадывать, в чем у вас ошибка?
    private function curl($url, $params = [])
        {
            $curl = curl_init();
            $headers = [
                'accept: application/json',
                'Authorization: ' . $this->tokenV2
            ];
            if(count($params)) {
                $headers[] = 'Content-Type: application/json';
                curl_setopt($curl, CURLOPT_POST, true );
                curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));    
            }
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HEADER, true);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
            curl_setopt($curl, CURLOPT_TIMEOUT, 300);
    
            $response = curl_exec($curl);
            $curlInfo = curl_getinfo($curl);
    
            $responseBodyRaw = substr($response, $curlInfo['header_size']);
            $responseBody = json_decode($responseBodyRaw, true);
            if(json_last_error() !== JSON_ERROR_NONE) {
                $responseBody = $responseBodyRaw;
            }
            unset($response, $responseBodyRaw);
            curl_close($curl);
    
            return $responseBody;
        }
    
        private function queryV25($url, $params)
        {
            return $this->curl($this->urlV2 . $url, $params);
        }
    
        public function getCards()
        {
            return $this->queryV25(
                'card/list',
                [
                    'id' => 1,
                    'jsonrpc' => '2.0',
                    'params' => [
                        'query' => [
                            'limit' => 1000,
                            'offset' => 0,
                            'total' => 0
                        ],
                        'supplierID' => $this->supplierId
                    ]
                ]
            );
        }

    Этот код - работает. Для вашей задачи нужно в запрос добавить фильтр.
    Ответ написан
    Комментировать