Как исправить ошибку при переходе на php8 Битрикс [TypeError] Argument #5 ($day) must be of type ?int, string given (0)?
После перехода выдает такую ошибку
[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, и тогда нужно только подчистить ошибки в шаблонах.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для исправления ошибки при переходе на 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);
4. После приведения переменной $day к типу int, необходимо убедиться, что ее значение соответствует требованиям функции, которая ее принимает. Возможно, потребуется дополнительная обработка данных перед передачей их в функцию.
5. После внесения изменений в код и приведения переменной $day к правильному типу, необходимо протестировать приложение, чтобы убедиться, что ошибка больше не возникает и функционал работает корректно.
6. При необходимости обновить другие части кода, которые могут быть затронуты изменениями в PHP 8 и типах данных. Внимательно изучите все ошибки и предупреждения, которые могут появиться после обновления версии PHP.
Следуя этим шагам, вы сможете исправить ошибку с типом аргумента #5 ($day) и успешно перейти на PHP 8 в вашем проекте на Битрикс. Не забывайте сохранять резервные копии кода перед внесением изменений и тестировать все изменения перед их внедрением в рабочее окружение.