Почему выдает ошибку при чтении foreach()

227
12 октября 2017, 12:43

Делаю интеграцию с Моя Посылка сервис отслеживания посылок.

WebHook отправляет данные вот в таком формате

{"barcode":"RM924463696CN","carrier":{"code":"upu","name":"Международные почтовые отправления"},"originCountry":{"code":"CN","name":"Китай"},"destinationCountry":{"code":"RU","name":"Россия"},"attributes":{"item":"Мелкий пакет","sender":"???","recipient":"Sizintsev Alexandr Olegovich"},"createdAt":1506582467000,"updatedAt":1507692792000,"deliveringTime":16,"weight":0.13,"events":[{"eventDate":1507667099000,"operation":"Прибыло в сортировочный центр","location":"Москва-Казанский Вокзал ПЖДП","zipCode":"102000"},{"eventDate":1507158839000,"operation":"Покинуло сортировочный центр","location":"Толмачево ММПО","zipCode":"630870"},{"eventDate":1507158838000,"operation":"Передано в доставку по России","location":"Толмачево АОПП ММПО Pi-1","zipCode":"630874"},{"eventDate":1506927240000,"operation":"Arrive customs"},{"eventDate":1506923940000,"operation":"Arrive Russia Transit Station"},{"eventDate":1506912959000,"operation":"Выпущено таможней","location":"Толмачево АОПП ММПО Pi-1","zipCode":"630874"},{"eventDate":1506912899000,"operation":"Приём на таможню","location":"Толмачево АОПП ММПО Pi-1","zipCode":"630874","imported":true},{"eventDate":1506912179000,"operation":"Прибыло в сортировочный центр","location":"Толмачево ММПО","zipCode":"630870"},{"eventDate":1506909599000,"operation":"Прошло регистрацию","location":"Толмачево АОПП ММПО Pi-1","zipCode":"630874"},{"eventDate":1506908579000,"operation":"Прибыло на территорию России","location":"Толмачево АОПП ММПО Pi-6","zipCode":"630872","imported":true},{"eventDate":1506692340000,"operation":"Leaving Airport going to next airport seaport"},{"eventDate":1506691260000,"operation":"Arrive Airport"},{"eventDate":1506614100000,"operation":"Transit Station export customs cleared"},{"eventDate":1506612300000,"operation":"International parcel Transit Station export security scan"},{"eventDate":1506599879000,"operation":"Ожидает отправки из Китая","location":"Китай","zipCode":"CNCGOA"},{"eventDate":1506560460000,"operation":"Leaving center, next station international"},{"eventDate":1506538980000,"operation":"Center customs scan"},{"eventDate":1506539039000,"operation":"Посылка отправлена (внутренний транзит)","operationOrigin":"已封发(国内经转)","location":"郑州"},{"eventDate":1506530040000,"operation":"Center received"},{"eventDate":1506530099000,"operation":"Посылка принята (внутренний транзит)","operationOrigin":"已收寄(国内经转)","location":"郑州"},{"eventDate":1506512099000,"operation":"Принято в отделении связи","location":"Китай","zipCode":"45005000","accepted":true},{"eventDate":1506323220000,"operation":"Получено электронное уведомление о предстоящей посылке","operationOrigin":"Electronic Data Received"}]}

Я данные принимаю PHP таким образом:

$data = json_decode(file_get_contents('php://input')); 
$datetime_add = date('Y-m-d H:i:s', time());
$barcode = checkrequest($data->barcode);                    
$deliveringtime = checkrequest($data->deliveringTime);
$createdat = checkrequest($data->createdAt);
$updatedat = checkrequest($data->updatedAt);
$resultDelivery = $mysqli->query("SELECT * FROM `delivery` WHERE barcode = '$barcode'");
if ($resultDelivery->num_rows <= 0) {
    $deliveryINSERT = $mysqli->query("INSERT INTO delivery (id_cabinet,barcode,deliveringtime,createdat,updatedat,datetime_add) VALUES ('$id_cabinet','$barcode','$deliveringtime','$createdat','$updatedat','$datetime_add')");
    $id_delivery = mysqli_insert_id($mysqli);
} else {
   $rowDelivery = $resultDelivery->fetch_assoc();
   $deliveryUpdate = $mysqli->query("UPDATE delivery SET deliveringtime='$deliveringtime', updatedat='$updatedat' WHERE id_cabinet = '$id_cabinet' and id = '$rowDelivery[id]'");
 $id_delivery = $rowDelivery['id'];
}

foreach ($data->events as $row) {
//echo ''.$row->eventDate.''.$row->operation.''.$row->updatedAt.'<br>';
$eventDate = checkrequest($row->eventDate);
$zipCode = checkrequest($row->zipCode);
$operation = iconv("UTF-8", "windows-1251",checkrequest($row->operation));
$resultDeliveryEvents = $mysqli->query("SELECT * FROM `delivery_events` WHERE eventdate = '$eventDate'");
if ($resultDeliveryEvents->num_rows <= 0) {
    $delivery_eventsINSERT = $mysqli->query("INSERT INTO delivery_events (id_cabinet,id_delivery,barcode,eventdate,operation,zipcode,datetime_add) VALUES ('$id_cabinet','$id_delivery','$barcode','$eventDate','$operation','$zipCode','$datetime_add')");
}
}
echo 'MoyaPosylkaWebhook';

Выдает ошибку PHP Warning: Invalid argument supplied for foreach() in

Хотя я пробовал сначала другим скриптом получить данные от Моя посылка путем запроса и отправить их же в скрипт обработчик, тогда срабатывает...

Что ему нужно непонятно...

P.S. Сервис сделал возможность тестовых отправлений данныйх, поймал данные и посмотрел структуру, оказалось там первый ключ назывался иначе.

Answer 1

Это значит, что в foreach вы передаете пустой массив. Там ничего нет. Если вы перед циклом напишите:

echo '<pre>';
print_r($data);
echo '</pre>';

то сможете посмотреть что там конкретно в данный момент.

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

другим скриптом получить данные от Моя посылка путем запроса и отправить их же в скрипт обработчик, тогда срабатывает...

либо еще как-либо получать данные, чтоб они были в переменной на момент выполнения цикла

READ ALSO
Проблеммы с RedBeanPHP

Проблеммы с RedBeanPHP

При выполнении данного кода выдает ошибку:

269
Сравнение дат. PHP

Сравнение дат. PHP

Не правильно работает условие, при котором сравниваются две даты: текущая и дата уже заданнаяПри выполнении этого условия $date1 > $date2 должно...

211
extractTo - кириллические файлы

extractTo - кириллические файлы

ЗдравствуйтеАрхив не хочет распаковывать кириллические файлы

223
method_exist для трейтов

method_exist для трейтов

В Yii2 есть понятие behaviors, подключение к модели которого добавляет к классу функции, описанные в этом behavior

175