• Почему валидатор не понимает, что функция встроена?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Есть два варианта решения подобной проблемы.
    Первое это указывать слэш перед функцией, указывая на корневой нэймспейс.
    Второе это использовать use function в шапке
    https://www.php.net/manual/ru/language.namespaces....
    Ответ написан
  • Из двух циклов сделать один?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    $result = [];
    foreach($request as $key => $items){
        $res = (!array_key_exists($key, $show)) ? $show[$key] : $items;
        echo $res;
        $result[$key] = $res;
        }
    }
    Ответ написан
  • Узнать тему браузера php?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    нет, php это серверный язык, если только не передается подобное в заголовке или куке
    Ответ написан
    Комментировать
  • PHP, как с помощью curl передать файл на удаленный сервер, обязательно с чанками?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    я бы попробовал поискать примеры работы курла с опциями
    CURLOPT_HEADERFUNCTION
    A callback accepting two parameters. The first is the cURL resource, the second is a string with the header data to be written. The header data must be written by this callback. Return the number of bytes written.

    CURLOPT_READFUNCTION
    A callback accepting three parameters. The first is the cURL resource, the second is a stream resource provided to cURL through the option CURLOPT_INFILE, and the third is the maximum amount of data to be read. The callback must return a string with a length equal or smaller than the amount of data requested, typically by reading it from the passed stream resource. It should return an empty string to signal EOF.

    https://www.php.net/manual/en/function.curl-setopt.php

    что то вроде

    $accesstoken = 'secret';
    //$data = json_decode($data, true);
    $data = ['folder' => './test', 'Name' => '11.json'];
    $taskId = 1;
    $file = Cb::FILES_DIR . '/' . $taskId . '.' . $data['folder'] . '/' . $data['Name'];
    
    $headers = [];
    //$headers[] = 'Content-length: ' . filesize($file);
    $headers[] = 'Content-type: application/json';
    $headers[] = 'Authorization: Basic ' . $accesstoken;
    $headers[] = 'Transfer-Encoding: chunked';
    
    $stream = fopen($file, 'rb');
    $log = fopen("curl.txt", 'a');
    
    $url = 'https://portal5test.cbr.ru/back/rapi2/messages....';
    
    $ch = curl_init($url);
    //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_UPLOAD, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_INFILE, $stream);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_STDERR, $log);
    curl_setopt($ch, CURLOPT_READFUNCTION, static function ($ch, $stream, $length) {
        return fgets($stream, $length);
    });
    
    $result = curl_exec($ch);
    curl_close($ch);

    Ответ написан
  • Как не прикреплять пустой файл при отправке на почту?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    https://qna.habr.com/q/1226466#answer_2258886 вот вам пример, тут сразу будет понятно что вынести под проверку
    Ответ написан
    Комментировать
  • Почему процессор ноутбука сбрасывает частоту при нормальных температурах?

    Compolomus
    @Compolomus
    Комполом-быдлокодер
    Смотрите прижимы со к чипам, возможно там прокладки не 1 и 1.5, а какие нибудь 0.8 и 1.2. Если так, то надо под размять прокладки. Бывает и сам охлад кривой, миллиметр можно и жидкими прокладками выбрать, они по прижиму сами найдут нужную толщину
    Ответ написан
  • Форма обратной связи, как сделать с вложением (прикреплением файлов)?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    $text = 'Message text'; // Текст сообщения
    
    $subject = 'Message subject'; // Тема письма
    
    $email = 'test@mail.ru'; // Адрес электронной почты
    
    $body = '';
    
    // Забираем имя файла и содержимое из файлового поля формы 
    $fileName = $_FILES['file']['name'];
    $fileStream = file_get_contents($_FILES['file']['tmp_name']);
    
    // Специальный сепаратор письма, разделитель частей
    $bound = '_=_Multipart_Boundary_' . substr(md5(uniqid('', true)), 0, 8);
    
    // Заголовок письма
    $header = 'Content-Type: multipart/mixed; boundary="' . $bound . '"' . PHP_EOL . 'X-Mailer: PHP' . PHP_EOL . 'Reply-To: No reply' . PHP_EOL;
    
    // Секция текстовой части
    $body .= '--' . $bound . PHP_EOL .
        'Content-Type: text/plain; charset="UTF-8"' . PHP_EOL .
        'Content-Disposition: inline' . PHP_EOL .
        'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL .
        chunk_split(base64_encode($text)) . PHP_EOL;
    
    // Секция файловой части
    $body .= PHP_EOL . '--' . $bound . PHP_EOL .
        'Content-Type: application/octet-stream; name="' . $fileName . '"' . PHP_EOL .
        'Content-Disposition: attachment;' . PHP_EOL .
        ' filename="' . $fileName . '"' . PHP_EOL .
        'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL . chunk_split(base64_encode($fileStream));
    
    // Конец 
    $body .= '--' . $bound . '--';
    
    mail(
        $email,
        '=?UTF-8?B?' . base64_encode($subject) . '?=',
        $body,
        'MIME-Version: 1.0' . PHP_EOL . $header
    );


    Сама суть, для прикрепления нескольких файлов нужно некоторый код вынести в цикл, вряд ли вам код поможет понять
    поняно ответили, особенно для человека, который в php далекий
    Ответ написан
  • Выдаёт ошибку Fatal error: Uncaught Error: Call to undefined method ADORecordSet_postgres7::ADORecordSet(). Не понимаю, что ей именно не нравится?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Вам нужно зайти во флажок, дополнительно, конфигурация php ваш, добавить строчку в ини extension = php_pgsql
    перезапустить опенсенрвер, желательно обновить опенсервер, phppgadmin там из коробки уже стоит (в дополнительно и pgadmin и myadmin)
    638536912c103287329419.png
    63853713a1261395778190.png
    Ответ написан
    Комментировать
  • Как сформировать запрос к базе данных?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Вам надо две вещи, первое это инструмент для разбора данных с фронта, хотя бы превращение в обычный массив, второе это какой нибудь query builder
    Первое решается элементарно, это обычный массив объектов, второе можно поискать на гитхаб
    пишем простой свой билдер на примере запроса
    допилить напильником
    <?php
    
    $builder = new Builder();
    $query = $builder
            ->table('test')
            ->select(['*'])
            ->where(['field1', 'in', [1,2,3]], ['field2', 'like', '%ab%'])
            ->limit(10, 20)
            ->get();
    $placeholders = $builder->getPlaceholders();
    
    $result = $pdo->prepare($query)->execute($placeholders);
    /* фетч результата */


    <?php
    
    namespace Compolomus\Builder;
    
    use RuntimeException;
    
    final class Builder
    {
        private ?string $table = null;
    
        private array $where = [];
    
        private array $columns = ['*'];
    
        private array $placeholders = [];
    
        private ?string $queryType = null;
    
        public function __construct(?string $table = null)
        {
            if (!is_null($table)) {
                $this->table = $table;
            }
        }
    
        public function table(string $table): Builder
        {
            $this->table = $table;
    
            return $this;
        }
    
        public function count(): Builder
        {
            $this->queryType = 'select count(*)';
    
            return $this;
        }
    
        public function select(?array $columns = null): Builder
        {
            if (!is_null($columns)) {
                $this->columns = $columns;
            }
    
            return $this;
        }
    
        public function limit(int $limit, int $offset = 0): Builder
        {
            /*
             тут собираем строку с лимит и куда нибудь сохраняем
             */
            return $this;
        }
    
        public function where(array $conditions, string $type = 'and'): Builder
        {
            foreach ($conditions as [$field, $condition, $value]) {
                /* тут собираем строку из поля, значения и типа */
                /* вместо значения подставляем плейсхолдер ? для подготовленных выражений */
                $this->placeholders[] = $value;
            }
    
            /* куда то сохраняем собранную строку,
             по типу собираем массив с типом обьединения,
             тут на самом деле всё сложно,
             возможно проще будет создать Where класс и отдать туда обработку
            */
    
            return $this;
        }
    
        /**
         * @throws RuntimeException
         */
        public function get(): string
        {
            if (is_null($this->queryType)) {
                throw new RuntimeException('Undefined query type');
            }
    
            $query = strtoupper($this->queryType);
            /* тут собираем весь запрос из кусочков */
    
            return $query;
        }
    
        public function getPlaceholders(): array
        {
            $placeholders = $this->placeholders;
    
            $this->placeholders = [];
            /* обязательно обнуляем, возможно и весь билдер для следующего запроса */
    
            return $placeholders;
        }
    
    }
    Ответ написан
    Комментировать
  • Не могу сделать аналог вывода простых чисел. В чем проблема?

    Compolomus
    @Compolomus
    Комполом-быдлокодер
    чтоб разобраться как работают вложенные циклы попробуйте напечатать таблицу умножения как на тетрадке сзади, можете даже два варианта где 9 столбиков и где квадратная с цифрами 6376c3a03919f913389813.png
    ну а чтоб преобразовать цикл for в цикл while надо просто оставить середину из цикла for (условие выхода) в while, итератор вынести перед циклом (старт), инкримент поместить в тело цикла
    Ответ написан
    4 комментария
  • Есть ли в php аналог data class kotlin?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Александр Антонов, а где у вас там типы? Один массив и строки я увидел, ну и сам json это строки по сути, можно магии повесить, ваш json после decode массив, его кидаете в конструктор, тупо ключ => значение
    Далее записываете его в свойство, а из свойства магический геттер
    class MyJson
    {
    
        private array $data;
    
        public function __construct(array $array)
        {
            $this->data = $array;
        }
    
        public function __call(string $name, array $arguments)
        {
            $action = substr($name, 0, 3);
            $property = strtolower(substr($name, 3));
            switch ($action) {
                case 'get':
                    return $this->data[$property ] ?? null;
    
                case 'set':
                    $this->data[$property] = $arguments[0];
    
                    break;
            }
        }
    
        public function __set(string $name, $value)
        {
            $this->data[$name] = $value;
        }
    
        public function __get(string $name)
        {
            return array_key_exists($name, $this->data)) ? $this->data[$name] : null;
        }
    
        public function __isset($name): bool
        {
            return isset($this->data[$name]);
        }
    
        public function __unset($name): void
        {
            unset($this->data[$name]);
        }
    }


    $json = new MyJson(json_decode($json, true));
    
    echo $json->name;
    $json->name = 'test';
    echo $json->getName();
    $json->setName('test2');
    echo $json->name;


    Писал с телефона. Могут быть опечатки.
    Почитать тут
    https://www.php.net/manual/ru/language.oop5.magic.php
    Ответ написан
    7 комментариев
  • Выучил синтаксис языка. как использовать его на практике?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    начните с простого, гостевая книга, покроет несколько ключевых навыков, хранение информации, вывод информации, админские приколы, постраничная навигация. работа с формами.
    вариант по сложнее, напишите форум или что то с вложенной структурой.
    напишите регистрацию/авторизацию.
    напишите какой нибудь загруз центр, потренировать загрузку файлов.
    главное не пользовать в этой связке js. потом со временем получиться улучшить по возможности, а сейчас это переусложнение не нужно
    Ответ написан
    2 комментария
  • APACHE htaccess как вывести php текстом?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    RemoveHandler .php .phtml .php3 .php4 .php5 .php6 .phps .cgi .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .py
    AddType application/x-httpd-php-source .php .phtml .php3 .php4 .php5 .php6 .phps .cgi .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .py
    php_flag engine 0

    Вариант 2
    <Files *.php>
    Deny from all
    </Files>
    Ответ написан
  • Как с помощью GraphicsMagick или ImageMagick заменить зеленый фон?

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

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    // исходник маски
    $mask = new Imagick($_SERVER['DOCUMENT_ROOT'] . '/mask.png');
    // меняем прозрачный цвет на оранжевый и черный на прозрачный
    $mask->opaquePaintImage('transparent', 'orange', 10, false, Imagick::CHANNEL_DEFAULT);
    $mask->opaquePaintImage('black', 'transparent', 10, false, Imagick::CHANNEL_DEFAULT);
    //$mask->writeImage($_SERVER['DOCUMENT_ROOT'] . '/prepare-mask.png');
    
    // исходник изображения
    $source = new Imagick($_SERVER['DOCUMENT_ROOT'] . '/image.jpeg');
    // накладываем маску на изображение
    $mask->compositeImage($source, Imagick::COMPOSITE_DSTOVER, 0, 0); //COMPOSITE_DSTATOP
    //$mask->writeImage($_SERVER['DOCUMENT_ROOT'] . '/composite.png');
    
    // меняем оранжевый цвет на прозрачный
    $mask->opaquePaintImage('orange', 'transparent', 10, false, Imagick::CHANNEL_DEFAULT);
    $mask->setImageFormat('png');
    
    //$mask->writeImage($_SERVER['DOCUMENT_ROOT'] . '/result.png');
    
    header('Content-type: image/png');
    echo $mask;

    mask.png
    632b4e17ed639827850623.png
    prepare-mask.png
    632b4e4da878a138015478.png
    image.jpeg
    632b4e7087608919904339.jpeg
    composite.png
    632b4e8c29da3251513049.png
    result.png
    632b4e9f7544d467645939.png
    Ответ написан
    Комментировать
  • Какой самый быстрый способ настроить галлереи с загрузкой и пережатием картинок?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Сделать несколько своих пакетов либо написать самому. Кэш, хранилище, работа с картинками. Под разные проекты и задачи (разные наборы модулей) пишем адаптеры, наверное ещё какой то конфиг свой не помешал бы, тут можно ни одного пакета не писать самому. Взять кучу подобных и на собирать. Точно бы не стал писать сам intervention/image, хотя писал, задач всяких разных много, а всего сразу не предусмотреть. Зависимость от модели или бд тут лишнее, это можно получить в методе модели из хранилища например
    Ответ написан
    Комментировать
  • Почему выдает ошибку при конвертировании файла?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    $dir = realpath('./img');
    
    $ext = ['jpeg', 'jpg'];
    
    $fileSPLObjects =  new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::CHILD_FIRST);
    foreach($fileSPLObjects as $fullFileName => $fileSPLObject ) {
        if ($fileSPLObject->isFile()) {
            $info = new SplFileInfo($fullFileName);    
            if (in_array($info->getExtension(), $ext)) {
                $image = new Imagick($fullFileName);
                $image->setFormat('webp');
                $image->writeImage('webp:' . $fullFileName . '.webp');
                // тут можно удалить старое, unlink($fullFileName);
            }
        }
    }

    Вариант через Imagick, плюс покороче
    Ответ написан
    Комментировать
  • Совместима видеокарта Evga Geforce Rtx 2060 Sc Gaming, 6Gb с Ryzen 5 3400GE и материнской платой MSI B450M-A PRO MAX?

    Compolomus
    @Compolomus
    Комполом-быдлокодер
    Совместима
    Мат плата
    spoiler

    Чипсет AMD
    AMD B450
    Совместимые ядра процессоров AMD
    Vermeer, Renoir, Matisse, Pinnacle Ridge, Summit Ridge, Raven Ridge, Picasso
    Версия PCI Express
    3.0
    Количество слотов PCI-E x16

    Проц
    spoiler

    Product Line
    AMD Ryzen™ 5 Desktop Processors with Radeon™ Vega Graphics
    Former Codename
    "Picasso"
    # of CPU Cores
    4
    # of Threads
    8

    Видео
    spoiler

    Интерфейс подключения
    PCI-E
    Версия PCI Express
    3.0
    Ответ написан
    Комментировать
  • Как сделать загрузку нескольких изображений в базу данных?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    https://qna.habr.com/q/673461#answer_1463090
    З.Ы. поиск нормально находит этот ответ
    Ответ написан
  • Какую книгу выбрать для изучения паттернов проектирования?

    Compolomus
    @Compolomus
    Комполом-быдлокодер
    по патернам сейчас посоветуют одну книгу, но я бы не стал ее читать, может начаться такое, что будете лепить код ради паттернов, переходить стоит, когда явно видится, что паттерн идеально заходит. на самом деле писать более менее код, хватит и SOLID, опять же без фанатизма
    начните с https://refactoring.guru/ru (у меня с впн ток открывается)
    Ответ написан
    1 комментарий