Как исправить ошибку при переходе на php8 Битрикс [TypeError] Argument #5 ($day) must be of type ?int, string given (0)?

Ссылка скопирована
PHP
23 марта 2026 1 ответ

После перехода выдает такую ошибку

[TypeError]  mktime(): Argument #5 ($day) must be of type ?int, string given (0) /home/c/crikon8y/ru.reisennachrussland.com/public_html/local/templates/fortuna/components/bitrix/catalog/catalog1/bitrix/catalog.section/.default/template.php:32

[TypeError] mktime(): Argument #5 ($day) must be of type ?int, string given (0) /home/c/crikon8y/ru.reisennachrussland.com/public_html/local/templates/fortuna/components/bitrix/catalog/catalog1/bitrix/catalog.section/.default/template.php:32

Строка кода 32:
$de = mktime(0,0,0,$de[1],$de[0],$de[2]);

Дополнительно:

Прочитать и перевести текст ошибки. Дальше отсчитать пятый аргумент и проверить, что вы в него передаёте. Если число в формате строки, то достаточно просто привести его к int через стандартный каст языка. Если же там реально какая-то строка, то разбираться откуда она берётся в том месте, где должно быть число.

  • Прошу прощения, но найти тех, кто писал это уже нереально, а сама я не могу разобраться

    <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
    /** var array $arParams */
    /** var array $arResult */
    /** @global CMain $APPLICATION */
    /** @global CUser $USER */
    /** @global CDatabase $DB */
    /** var CBitrixComponentTemplate $this */
    /** var string $templateName */
    /** var string $templateFile */
    /** var string $templateFolder */
    /** var string $componentPath */
    /** var CBitrixComponent $component */
    $this->setFrameMode(true);?>

    <?
    $date_begin = htmlspecialchars(@$_GET["date_begin"]);
    if($date_begin == '') $date_begin = date("d.m.Y");
    $date_end = htmlspecialchars(@$_GET["date_end"]);
    $party = htmlspecialchars(@$_GET["party"]);

    $boat = htmlspecialchars(@$_GET["boat"]);
    $rout = htmlspecialchars(@$_GET["rout"]);

    $db = explode(".", $date_begin);
    if(!$db[2]) $db[2] = date("Y", time());
    $db = mktime(0,0,0,$db[1],$db[0],$db[2]);

    if($db == '') $db = 0;

    $de = explode(".", $date_end);
    if(!$de[2]) $de[2] = date("Y", time());
    $de = mktime(0,0,0,$de[1],$de[0],$de[2]);
    if($de == '')$de = 99999*99999;

    вот код с начала

  • Ну, значит, вам рано ещё заниматься переходом на новую версию PHP. Надо либо откатиться назад, либо найти тех, кто разбирается и готов вам помочь (данный сервис для этого не предназначен). Либо всё же начать разбираться - всё необходимое я вам для этого дал.
    "Код с начала" в моём ответе ничего не меняет.

Открываем документацию по mktime(), видим, что эта функция принимает только тип int в качестве аргументов. (впрочем, можно и не ходить в документацию, об этом же прямо в тексте ошибки написано).

Смотрим что в нее передается в коде - три нуля, с ними все хорошо. Дальше какие-то значения из массива $de. Смотрим что там в этом массиве, он создается на пару строк выше:$de = explode(".", $date_end);
Смотрим документацию по функции explode() (если вы забыли, что это одна из строковых функций), и видим, что она возвращает массив строк. (Ну и да, об этом тоже прямо в тексте ошибки написано, что передана строка).

Вспоминаем чем отличается строка от числа и как преобразовать одно в другое.

Было сложно? Нет, не особо. Но таких ошибок в движке битрикса могут быть сотни или тысячи. Вот в чем сложность.

  • таких ошибок в движке битрикса могут быть сотни или тысячи

    Я сначала хотел сказать, что надо тупо Битрикс обновить, но ошибки-то в директории local - это не движок.
    Но то, что починив одну ошибку можно смело ожидать следующую - факт.

  • Алексей Уколов, да, присмотревшись к пути вижу templates/fortuna, то есть это шаблон а не движок.
    Возможно движок свежий, и нормально работает с php8, и тогда нужно только подчистить ошибки в шаблонах.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Роман IT Ответ

Для исправления ошибки при переходе на PHP 8 в Битрикс, которая связана с типом аргумента #5 ($day) в функции, необходимо выполнить следующие шаги:

1. Изучить документацию PHP 8 и ознакомиться с изменениями в типах данных и их объявлении. В PHP 8 были внесены изменения в работу с типами данных, в частности, введены strict типы и усилены проверки типов.

2. Найти место вызова функции, где передается аргумент $day как строка, а не как int. Ошибка сообщает, что ожидается тип ?int (int или null), а передается строка. Необходимо найти место вызова функции и привести переменную $day к типу int.

3. Приведение переменной $day к типу int можно выполнить с помощью явного приведения типов или с использованием функции intval(). Например:

$day = intval($day);

$day = intval($day);

4. После приведения переменной $day к типу int, необходимо убедиться, что ее значение соответствует требованиям функции, которая ее принимает. Возможно, потребуется дополнительная обработка данных перед передачей их в функцию.

5. После внесения изменений в код и приведения переменной $day к правильному типу, необходимо протестировать приложение, чтобы убедиться, что ошибка больше не возникает и функционал работает корректно.

6. При необходимости обновить другие части кода, которые могут быть затронуты изменениями в PHP 8 и типах данных. Внимательно изучите все ошибки и предупреждения, которые могут появиться после обновления версии PHP.

Следуя этим шагам, вы сможете исправить ошибку с типом аргумента #5 ($day) и успешно перейти на PHP 8 в вашем проекте на Битрикс. Не забывайте сохранять резервные копии кода перед внесением изменений и тестировать все изменения перед их внедрением в рабочее окружение.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно