Bonjour,

Je suis tout nouveau et c'est mon premier post :)
Je m'explique, j'ai une API privée et je souhaite avoir des résultats sous forme de tableaux. Merci d'avance.

Ce que je fais

<form method="GET">
<input type="search" name="n" placeholder="xxxxx" required />
<input type="submit" value="Valider"/>
</form>

<?php

if (isset($_GET['n']) AND !empty($_GET['n'])) {
$n =htmlspecialchars($_GET['n']);
$curl = curl_init('xxxxxxxx:xxxx/xxxx/xxxxx/x'.$n.'/xxxx');
curl_setopt_array($curl, [
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 1
]);
$data = curl_exec($curl);
if ($data === false) {
var_dump(curl_error($curl));
}
else {
$shouldProcess = true;
$searchIndex = 0;
$items = [];

while (curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200 AND $shouldProcess) {
  $processedThisLoop = 0;
  $data = json_decode($data, true);
  foreach($data [$searchIndex][0]['status'] as $entries) {
    $items[] = $entries;
    $searchIndex++;
    $processedThisLoop++;
  }

  if($processedThisLoop == 0) {
    $shouldProcess = false;
  }
}
var_dump($items);
}
curl_close($curl);

}

  else {
    $shouldProcess = true;
    $searchIndex = 0;
    $items = [];

    while (curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200 AND $shouldProcess) {
      $processedThisLoop = 0;
      $data = json_decode($data, true);
      foreach($data [$searchIndex][0]['status'] as $entries) {
        $items[] = $entries;
        $searchIndex++;
        $processedThisLoop++;
      }

      if($processedThisLoop == 0) {
        $shouldProcess = false;
      }
    }
    var_dump($items);

Ce que je veux

Parcourir cette API, récupérer certaines données, les réafficher sous forme de tableau.

Ce que j'obtiens

array (0)

1 réponse


Bonjour.
Il aurait été bien que tu présentes correctement le code et que tu nous en montre un un minimum complet et mieux indenté.
Si je reprends le code que tu présentes, que je l'indente mieux et que je le corrige, ça donnerait ça :

if (isset($_GET['n']) AND !empty($_GET['n'])) {
    $n = htmlspecialchars($_GET['n']);
    $curl = curl_init('xxxxxxxx:xxxx/xxxx/xxxxx/x' . $n . '/xxxx');
    curl_setopt_array($curl, [
        CURLOPT_SSL_VERIFYPEER  =>  false,
        CURLOPT_RETURNTRANSFER  =>  true,
        CURLOPT_TIMEOUT         =>  1
    ]);
    $data = curl_exec($curl);
    if ($data === false) {
        var_dump(curl_error($curl));
    } else {
        $shouldProcess = true;
        $searchIndex = 0;
        $items = [];

        while (curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200 AND $shouldProcess) {
          $processedThisLoop = 0;
          $data = json_decode($data, true);
          foreach ($data[$searchIndex][0]['status'] as $entries) {
            $items[] = $entries;
            $searchIndex++;
            $processedThisLoop++;
          }

          if($processedThisLoop == 0) {
            $shouldProcess = false;
          }
        }
        var_dump($items);
    }
    curl_close($curl);
} else {
    $shouldProcess = true;
    $searchIndex = 0;
    $items = [];

    while (curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200 AND $shouldProcess) {
        $processedThisLoop = 0;
        $data = json_decode($data, true);
        foreach ($data[$searchIndex][0]['status'] as $entries) {
            $items[] = $entries;
            $searchIndex++;
            $processedThisLoop++;
        }
        if ($processedThisLoop == 0) {
            $shouldProcess = false;
        }
    }
    var_dump($items);
}

Comme tu peux le voir, dans le else de la première condition, curl n'est pas initialisé, il est donc normal que tu aies un problème, de plus pour améliorer ton code, au lieu d'englober autant de code dans la première partie de ta condition, tu devrais plutôt faire quelque chose comme :

if (!empty($_GET['n'])) {
    $n = htmlspecialchars($_GET['n']);
    $url = 'xxxxxxxx:xxxx/xxxx/xxxxx/x' . $n . '/xxxx';
} else {
    $url = // L'autre constitution de l'url pour curl
}
$curl = curl_init($url);
curl_setopt_array($curl, [
    CURLOPT_SSL_VERIFYPEER  =>  false,
    CURLOPT_RETURNTRANSFER  =>  true,
    CURLOPT_TIMEOUT         =>  1
]);
$data = curl_exec($curl);
if ($data === false) {
    var_ump(curl_error($curl));
} else {
    $shouldProcess = true;
    $searchIndex = 0;
    $items = [];
}

Étant donné que c'est la seule chose qui change entre les deux cas, c'est largement suffisant.
Par contre je ne comprends pas pourquoi tu utilises while au lieu d'une condition, du genre :

if (curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200) {
    $processedThisLoop = 0;
    $data = json_decode($data, true);
    foreach ($data[$searchIndex][0]['status'] as $entries) {
        $items[] = $entries;
        $searchIndex++;
        $processedThisLoop++;
    }
    if ($processedThisLoop == 0) {
        $shouldProcess = false;
    }
    var_dump($items);
}