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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Выбрать алфавит и перевести число в систему счисления с базой, равной длине этого алфавита.
    <?php
    const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    
    function encode(int $val, string $alphabet): string
    {
    	if ($val === 0) {
    		return $alphabet[0];
    	}
    	$base = strlen($alphabet);
    	$result = '';
    	while ($val > 0) {
    		$digit = $val % $base;
    		$val = intdiv($val, $base);
    		$result = $alphabet[$digit] . $result;
    	}
    	return $result;
    }
    
    print encode(2452221399229541659, ALPHABET);
    // 2V9coTtB2dB
    Ответ написан
  • Как проверить вхождение диапазона дат в определенный диапазон?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Когда диапазоны НЕ пересекаются? Когда один из них идёт после другого. То есть, первый диапазон заканчивается раньше, чем начинается второй или наоборот, второй заканчивается раньше, чем начинается первый. Запишем формально:
    $isNotOverlapped = $range2start > $range1end || $range1start > $range2end;

    Когда диапазоны пересекаются? Очевидно, что нам просто нужна инверсия предыдущего условия.
    $isOverlapped = !($range2start > $range1end || $range1start > $range2end);

    Но, если вспомнить булеву алгебру, то !(A || B) = !A && !B. Значит можем записать:
    $isOverlapped = $range2start <= $range1end && $range1start <= $range2end;
    Ответ написан
  • Что за способ форматирования использует этот код?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В PHP подчёркивание - допустимый символ в имени функции.
    __(...) - вызов функции.
    По остальным вопросам - RTFM: sprintf
    Ответ написан
    Комментировать
  • Как исправить "ord(): Passing null to parameter #1 ($character) of type string is deprecated"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас метод get() может вернуть null, а ord() в этом случае выдаст предупреждение.
    Первый вариант решения, самый быстрый - проверять вернувшееся значение
    $get = $this->get() ?? "\x00";
    Второй - отказаться от ord() и заменить числовую константу ORD_LF на строковую с нужным значением, вместо 10 использовать "\x0A". Придётся просмотреть все места, где константа используется.
    Третий - вместо null возвращать символ с кодом 0, то есть "\x00". Но надо проверить другие места использования get() и заменить в них проверку на null.
    Ответ написан
    1 комментарий
  • Как победить: "DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не передавать параметр datetime, или передавать его значением по умолчанию
    new DateTime(timezone: $gmt);
    neq DateTime('now', $gmt);
    Ответ написан
    1 комментарий
  • Почему в Yii2-виджетах нельзя вызывать обычные PHP-функции(включая preg_replace_all)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В PHP нет стандартной функции preg_replace_all.
    Четвёртый параметр preg_replace указывает, сколько замен произвести. По умолчанию в нём -1, то есть заменить всу вхождения.
    Ответ написан
    1 комментарий
  • Правильно ли я делаю json-rpc запрос?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Запрос сам по себе правильный. А вот ответ нет.
    Ответ должен быть таким:
    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": 54321
    }

    Ну и должна быть проверка пришедшего запроса на читаемость и соответствие стандарту. По уму, должна быть единая точка входа в api, которая вызывает запрошенный метод (getCurrencies).
    Ответ написан
    3 комментария
  • Как сделать вебсокет?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы не понимаете сути вебсокетов.
    Сервер вебсокета должен работать как демон, постоянно слушая порт. Клиент подключается не к какому-то конкретному файлу, а непосредственно к открытому порту.
    Посмотрите готовый фреймворк для реализации вебсокет-сервера: workerman
    Ответ написан
    4 комментария
  • Две версии php на одном сайте без домена на одном ip на одном порту в разных папках?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Откуда вы взяли такой синтаксис VirtualHost?
    <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>

    https://httpd.apache.org/docs/2.4/mod/core.html#vi...
    Вам надо делить на основе Directory, как-то так:
    <VirtualHost 192.168.1.1:80>
        ServerAdmin admin@8080
        ServerName 192.168.1.1
        DocumentRoot /var/www
        ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
        <Directory "/var/www/8080">
            DirectoryIndex 7.php
            SetHandler "proxy:fcgi://127.0.0.1:8080
            AddHandler php74-fcgi .php
            Action php74-fcgi /cgi-bin/php74.fcgi
        </Directory>
        <Directory>
            DirectoryIndex 8.php
            SetHandler "proxy:fcgi://127.0.0.1:8082
            AddHandler php82-fcgi .php
            Action php82-fcgi /cgi-bin/php82.fcgi
        </Directory>
        ErrorLog /var/log/httpd/8080.log
        CustomLog /var/log/httpd/8080.log combined
    </VirtualHost>
    Ответ написан
    Комментировать
  • Как правильно сформировать запрос в MySql, не вижу ошибки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вообще-то ошибка показывает на совершенно другую проблему.
    В вашем коде:
    FROM " . DB_PREFIX . "product_to_category ptc LEFT JOIN  . DB_PREFIX . "category_description"

    Тот же фрагмент в тексте ошибки:
    FROM oc_product_to_category ptcoc_category_description

    Куда делся LEFT JOIN oc_?

    А проблема с пустым $product_id решается элементарно. Достаточно предварительно проверять переменную и заменять её на фиктивное значение, например -1.
    Ответ написан
    Комментировать
  • Правильно ли я понимаю смысл статических и не статических объектов (this self)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. $this указывает на текущий экземпляр класса, в контексте которого был вызван метод. Но доступ к нестатическим свойствам и методам возможен для любого экземпляра (к публичным из любого контекста, к приватным и защищённым изнутри класса).
    2. self используется для доступа к классу, в котором описан метод, static для доступа к классу, в котором вызван метод, parent для доступа к родительскому классу.
    4. В нестатических классах C# не запрещено создавать статические методы. Если эти статические методы в классе нужны, то ничто не мешает их создать.
    Ответ написан
    Комментировать
  • Хороша ли архитектура моего кода? Информация цепляется по API?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Я бы сделал как-то так. Но не претендую на истину в последней инстанции.
    spoiler
    class API
    {
        public function getProduct(int $productId): Product
        {
            $product = $this->request(...); // Получение данных из API
            return Product::from($product)
        {
    }
    
    class Product
    {
        private int $id;
        private string $title;
        // прочие свойства
    
        public function getId(): int
        {
            return $this->id;
        }
        
        public function getTitle(): int
        {
            return $this->title;
        }
    
        // прочие геттеры
    
        // сеттеры, если нужны
     
        public static function from(object $source): self
        {
            $product = new static();
            $product->id = $source->id;
            $product->title = $source->title;
            // заполнение свойств
            return $product;
        }
    }
    
    ...
    $api = new API($login, $password);
    $product = $api->getProduct(325);

    Хотя, для современных версий PHP можно описать преобразование из json с помощью атрибутов и сделать трейт с функцией from, которая будет парсить полученный из API объект согласно этим атрибутам. Плюс аналогичный трейт, реализующий JsonSerializable::jsonSerialize по атрибутам.
    Ответ написан
    Комментировать
  • Как отправить email на php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Во-первых, mail может быть заблокирован у хостера. Во-вторых, даже если mail и работает, то с очень большой вероятностью письмо, отправленное через него, попадёт в спам.
    Используйте PHPMailer и отправляйте письма через SMTP от реального пользователя реального почтового сервера.
    Ответ написан
    2 комментария
  • Почему нулевая дата выводится некорректно?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что нулевой месяц - это на один месяц раньше первого месяца, и нулевой день тоже на один день раньше первого дня. Вот и получается:
    0000-01-01 00:00:00 минус 1 месяц = -0001-12-01 00:00:00
    -0001-12-01 00:00:00 минус 1 день = -0001-11-30 00:00:00
    Ответ написан
    Комментировать
  • Почему я не могу объявить аргумент метода типа потомка от аргумента родительского класса?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Комментировать
  • Достать объект из фигурных скобок?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В PHP такой синтаксис не используется. Есть ассоциативные массивы, но у них другой синтаксис:
    $foo = ['order' => '100668327'];
    echo $foo['order'];
    или
    $foo = (object)['order' => '100668327'];
    echo $foo->order;

    Если речь о полученном откуда-то JSON, то его надо декодировать через json_decode.
    $foo = json_decode('{"order":"100668327"}');
    echo $foo->order;
    или
    $foo = json_decode('{"order":"100668327"}', true);
    echo $foo['order'];
    Ответ написан
    1 комментарий
  • Как вставить несколько строк с помощью именованных плейсхолдеров (PDO)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    RTFM: foreach
    $data = [
      ['id' => 1, 'field1' => 'Вася'],
      ['id' => 2, 'field1' => 'Петя'],
      ['id' => 3, 'field1' => 'Миша']
    ];
    foreach ($data as $row) {
        $stmt->execute($row);
    }
    или
    $data = [
      1 => 'Вася',
      2 => 'Петя',
      3 => 'Миша'
    ];
    foreach ($data as $id => $field1) {
        $stmt->execute(['id' => $id, 'field1' => $field1]);
    }
    Ответ написан
    Комментировать
  • Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value ошибка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас в форме нет элемента с name="id". Ссылка на обработчик формы тоже такого элемента не содержит. Соответственно, в $_REQUEST['id'] ничего нет.
    Вообще, у вас в логах ещё и предупреждения должны быть о доступе к несуществующему элементу массива.
    Ответ написан
    Комментировать
  • Как правильно передавать параметры при новом создании экземпляра?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Такое, конечно, можно сделать через статическое свойство со списком экземпляров класса, но зачем нужен такой изврат? В каких реальных целях его применять?
    class A
    {
        private static array $instances = [];
        public readonly int $value;
      
        public function __construct(?int $value = null)
        {
            if ($value !== null) {
                $this->value = $value;
                static::$instances[] = $this;
            }
        }
    
        public function summ(): int
        {
            return array_reduce(
                static::$instances,
                fn($acc, $cur) => $acc + $cur->value,
                0
            );
        }
    }
    
    new A(2);
    new A(3);
    $summ = (new A())->summ();
    print $summ; // 5
    Ответ написан
    Комментировать
  • Почему может зависать сайт на PHP до закрытия всех вкладок?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Поведение очень похоже на блокировку файла сессий.
    При запуске скрипта открывается сессия (session_start), файл блокируется. При попытке открыть ту же сессию в другом скрипте будет ожидание освобождения файла сессии.
    Решение - в начале скрипта, особенно долго выполняющегося, открывать сессию, забирать из неё все нужные данные и сразу закрывать сессию (session_write_close). При необходимости изменить данные в сессии открывать её снова, менять данные и тут же закрывать.
    Как вариант - переносить хранение сессий в базу данных.
    Ответ написан
    1 комментарий