Warning: Invalid argument supplied for foreach()

Par Konix, il y a 6 ans


Bonjour,

Je cherche a afficher différentes informations concernant la météo sur une page web.
dans le terminal de Visual Code, aucune erreures n'est détécté mais quand j'actualise ma page web, Warning: Invalid argument supplied for foreach() in C:\wamp64\www\TutoPHP\meteo.php on line 10 !!!
J'ai beau chercher, je ne trouve pas l'erreur dans mon code

meteo.php

<?php require_once 'class/OpenWeather.php'; $weather = new OpenWeather('d06a7624b25ddfd1c5074974b8e78dc8'); $forecast = $weather->getForecast('Lyon,fr'); require 'elements/header.php'; ?> <div class="container"> <ul> <?php foreach($forecast as $day): ?> <li><?= $day['date']->format('d/m/Y') ?> <?= $day['description'] ?> <?= $day['temp'] ?>°C </li> <?php endforeach ?> </ul> </div> <?php require 'elements/footer.php' ?>

OpenWeather.php

<?php class OpenWeather { private $apiKey; public function __construct(string $apiKey) { $this->apiKey = $apiKey; } public function getForecast(string $city): ?array { $curl = curl_init("https://samples.openweathermap.org/data/2.5/forecast/daily?q={$city}&appid={$this->apiKey}&units=metric&lang=fr"); curl_setopt_array($curl, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CAINFO => dirname(__DIR__) . DIRECTORY_SEPARATOR . 'cert.cer', CURLOPT_TIMEOUT => 1 ]); $data = curl_exec($curl); if ($data === false || curl_getinfo($curl, CURLINFO_HTTP_CODE) != 200) { return null; } $results = []; $data = json_decode($data, true); foreach($data['list'] as $day) { $results[] = [ 'temp' => $day['temp']['day'], 'description' => $day['weather'][0]['description'], 'date' => new DateTime('@' . $day['dt']) ]; } return $results; } }

Si quelqun a la solution :)

3 réponses

Lartak, il y a 6 ans

Bonsoir.
C'est normal que tu puisse avoir une erreur au niveau de la boucle, étant donné que la méthode getForecast peut retourner null, ce qui n'est pas autorisé pour foreach.
Donc avant de faire la boucle, vérifies que la variable contient bien un tableau, même si celui-ci est vide.
Au passage, Visual Studio Code peut t'indiquer si tu fais certaines erreurs, mais il ne peut pas par exemple t'indiquer si ta base de données ou autre te renvoit bien des données, il ne te faut donc pas te baser que sur l'aide que peut t'apporter l'éditeur, mais faire des tests.
Donc par exemple :

<?php if (!empty($forecast)): ?> <ul> <?php foreach($forecast as $day): ?> <li><?= $day['date']->format('d/m/Y') ?> <?= $day['description'] ?> <?= $day['temp'] ?>°C </li> <?php endforeach; ?> </ul> <?php else: ?> <p>Aucune donnée récupérée.</p> <?php endif; ?>
Konix, il y a 6 ans

J'ai tester ton code et il me renvoie bien "Aucune donnée récupérée" et quand je fait un var_dump($forecast);, il me renvoie null.

étant débutant, je ne sais pas comment corrigé ce problème.

Le proxy peut-il jouer sur mon code ?

si quelqu'un pourrait m'aiguiller (voir même me donner la solution) :)

Konix, il y a 6 ans

Bon ducoup j'ai trouvé la solution, c'était bien le proxy qui jouait.