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

D
На сайте с 28.06.2008
Offline
997
130

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

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

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

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

Евгений Крупченко
На сайте с 27.09.2003
Offline
169
#1
Dram :
иногда

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

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


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

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


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

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

file_put_contents('log.txt',"$oldFormat\n",FILE_APPEND);

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

P0
На сайте с 17.06.2010
Offline
84
#2

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

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

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

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

DateTime::getLastErrors()

D
На сайте с 28.06.2008
Offline
997
#3
Спасибо за помощь, понял куда копать, буду ловить!
S
На сайте с 13.10.2014
Offline
156
#4

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

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

D
На сайте с 28.06.2008
Offline
997
#5
Главное что смущает - вот ловлю я ошибку, смотрю страницу на которой ее поймал, но там дата в нужном формате, запускаю парсер заново и он без ошибок проходит эту же страницу, где только что вывалился с ошибкой. Вот этот момент мне и не понятен. То есть ошибка, то нет... Такое впечатление что как бы не успевает распарситься перед вызовом функции, но это же бред...
ДП
На сайте с 23.11.2009
Offline
193
#6
Dram #:
Главное что смущает - вот ловлю я ошибку, смотрю страницу на которой ее поймал, но там дата в нужном формате, запускаю парсер заново и он без ошибок проходит эту же страницу, где только что вывалился с ошибкой. Вот этот момент мне и не понятен. То есть ошибка, то нет... Такое впечатление что как бы не успевает распарситься перед вызовом функции, но это же бред...
Ну тут вариант один - ведите логи, смотрите что на странице в каждом конкретном случае. В monolog, например, есть вариант логирования, когда если всё ок - логи не пишутся, если в лог попадает ошика - записываются все переданные до этого данные.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий