Ответы пользователя по тегу PHP
  • Как правильно сформировать запрос в 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 комментарий
  • Почему json_decode() возвращает тип данных "строка"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. localStorage хранит только строки.
    2. localStorage.localStorage - строка.
    3. JSON.stringify(localStorage.localStorage) - JSON, кодирующий строку.
    4. json_decode($_POST['obj'], true) декодирует JSON в исходную строку, которая была в localStorage.localStorage.
    Ответ написан
    1 комментарий
  • Почему мне не удаётся совершить второй запрос по Digest?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ stale: true говорит о том, что nonce протух.

    Если в ответе на запрос возвращается параметр nextnonce, то надо сбросить счётчик nc и использовать новое значение nonce. https://datatracker.ietf.org/doc/html/rfc7616#sect...

    Если такого параметра нет, то новый nonce возвращается при ответе 401.

    Да, ещё сервер может прислать вам список методов в qop. И вам надо не просто скопировать присланное значение, а выбрать из этого списка подходящий метод.
    Ответ написан
  • Правильно ли я реализовал сортировку timsort на php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Неверно от начала, до конца.
    https://ru.wikipedia.org/wiki/Timsort
    Ответ написан
    Комментировать
  • Как удалить файл с помощью кнопки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В PHP нет никаких кнопок. Это язык для бэкенда или консоли, без своего графического интерфейса.
    Вам необходимо поднять веб-сервер (apache или nginx) с PHP, создать HTML-страничку с вашей КНОПКОЙ и уже с неё из браузера делать запрос с PHP.
    Ответ написан
  • Отправка в телеграм из json, как реализовать(ошибка в коде)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В $_POST автоматически парсится только стандартная форма HTML или её аналог FormData.
    JSON можно только получить из тела запроса через чтение php://input.
    $json = file_get_contents('php://input');
    $data = json_decode($json);
    Ответ написан
    3 комментария
  • Как сделать расписание постов из дат по времени и выборку среди них?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для MySQL 8:
    WITH
      `slots` (`slot`) AS (
        WITH RECURSIVE
          `dates` (`date`, `add`) AS (
            SELECT CURDATE(), 1
            UNION SELECT `date` + INTERVAL 1 DAY, `add` + 1
              FROM `dates`
              WHERE `add` < 365
          ),
          `hours` (`hour`, `idx`) AS (
            WITH
              `c` (`count`) AS (
                SELECT LENGTH('02:00,05:00,07:00,08:00') - LENGTH(REPLACE('02:00,05:00,07:00,08:00', ',', '')) + 1
              )
            SELECT SUBSTRING_INDEX('02:00,05:00,07:00,08:00', ',', 1), 1
            UNION SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('02:00,05:00,07:00,08:00', ',', `idx` + 1), ',', -1), `idx` + 1 AS `idx`
              FROM `hours`
              JOIN `c`
              WHERE `idx` < `c`.`count`
          )
        SELECT CAST(CONCAT(`date`, ' ', `hour`) AS DATETIME) AS `slot`
          FROM `dates`
          JOIN `hours`
          HAVING `slot` > CURTIME()
      )
    SELECT `s`.`slot`
      FROM `slots` AS `s`
      LEFT JOIN `autoposting_planned` AS `ap` 
        ON `ap`.`datetime` = `s`.`slot`
      WHERE `ap`.`datetime` IS NULL
      ORDER BY `s`.`slot`
      LIMIT 1

    https://www.db-fiddle.com/f/aTfVwgBeBGFZbKmGDobVNv/0
    Ответ написан
    Комментировать
  • Где ошибка в коде?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Жуткий код.
    Для начала - https://habr.com/ru/post/662523/
    Затем, пароль никогда не хранят в БД в открытом виде. Смотрите password_hash и password_verify.
    Ну и напоследок, вы настолько не доверяете базе данных, что перепроверяете полученный от неё результат?
    Ответ написан
    Комментировать
  • Многопоточность в PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Отсортировать оба списка ключей и выполнить поиск параллельным проходом по спискам.
    Ответ написан
  • Не работают JS формы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Could not instantiate mail function
    Что здесь непонятного? Скорее всего, на вашем хостинге запрещена функция mail().
    Ответ написан