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


Konix
Auteur
Réponse acceptée

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

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
Auteur

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) :)