PHP Fatal error: Uncaught Error: Call to a member function getTimestamp() on bool


Dram
124

Написал парсер, тестирую. Иногда ловлю ошибку, которую не могу понять.

В начале парсера есть функция

function newDateFormat ($oldFormat){
    $aMonth = [
        '1' => 'января',
        '2' => 'февраля',
        '3' => 'марта',
        '4' => 'апреля',
        '5' => 'мая',
        '6' => 'июня',
        '7' => 'июля',
        '8' => 'августа',
        '9' => 'сентября',
        '10' => 'октября',
        '11' => 'ноября',
        '12' => 'декабря'
    ];
    $FNS_ogrn_assignment_date_Format = DateTime::createFromFormat('d n Y', str_ireplace(array_values($aMonth), array_keys($aMonth), $oldFormat))->getTimestamp();
    return date('d.m.Y', $FNS_ogrn_assignment_date_Format);
}

Далее идет цикл, сразу вверху цикла запрос к сайту который паршу и далее разбираю элементы.

НИже раз 5 вызывается функция newDateFormat. Иногда одна и так же запись может отработать нормально, а иногда вывалиться с ошибкой PHP Fatal error: Uncaught Error: Call to a member function getTimestamp() on bool

Как ее понимать — в функцию передана пустота? Но как такое возможно еще запрос в самом верху цикла? Что тут можно сделать?


Евгений Крупченко
Dram :
иногда

это здесь ключевое на сколько мне видится.

мы лишь видим вырванный откуда-то кусок. неизвестно что за $oldFormat залетает в эту функцию? например?

пока пример есть лишь у меня:

PHP Fatal error: Uncaught Error: Call to a member function getTimestamp() on bool

засылаем в функцию «левак» и вот она ваша ошибка:

PHP Fatal error: Uncaught Error: Call to a member function getTimestamp() on bool

т.е. копать нужно в сторону того что там заходит в функцию.

как вариант добавить лог типа такого:

file_put_contents(‘log.txt’,»$oldFormatn»,FILE_APPEND);

и после очередного пойманного бага, смотрите в лог — наверняка там какой-то мусор иногда залетает


Pr00f

Если метод createFromFormat не может распарсить строку с датой, он возвращает false. Вы же обращаетесь потом сразу к этому значению, вызывая метод getTimestamp.

Добавьте промежуточную переменную и в нее записывайте распарсенную дату, делайте проверку и если дата не false, вызывайте метод getTimestamp

Можно еще посмотреть сообщение с ошибкой, почему не получилось распарсить дату

https://www.php.net/manual/ru/datetime.getlasterrors.php

DateTime::getLastErrors()


Dram
Спасибо за помощь, понял куда копать, буду ловить!

silicoid

смотрите передаваемые данные.
насколько я понял код функции, данные должны быть строго вида «03 марта 2000»
1. дата в 2 знака, для однозначных с ведущим нулем — обязательно
2. месяц с маленькой буквы
3. год в 4 знака

иные представления даты не распарсятся.


Dram
Главное что смущает — вот ловлю я ошибку, смотрю страницу на которой ее поймал, но там дата в нужном формате, запускаю парсер заново и он без ошибок проходит эту же страницу, где только что вывалился с ошибкой. Вот этот момент мне и не понятен. То есть ошибка, то нет… Такое впечатление что как бы не успевает распарситься перед вызовом функции, но это же бред…

Дикий пионер
Dram #:
Главное что смущает — вот ловлю я ошибку, смотрю страницу на которой ее поймал, но там дата в нужном формате, запускаю парсер заново и он без ошибок проходит эту же страницу, где только что вывалился с ошибкой. Вот этот момент мне и не понятен. То есть ошибка, то нет… Такое впечатление что как бы не успевает распарситься перед вызовом функции, но это же бред…

Ну тут вариант один — ведите логи, смотрите что на странице в каждом конкретном случае. В monolog, например, есть вариант логирования, когда если всё ок — логи не пишутся, если в лог попадает ошика — записываются все переданные до этого данные.

Добавить комментарий

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