cURL en PHP renvoie différentes données dans _FILE et _RETURNTRANSFER

StackOverflow https://stackoverflow.com/questions/104223

  •  01-07-2019
  •  | 
  •  

Question

J'ai remarqué que cURL en PHP renvoie différentes données lorsque la sortie dans un fichier via CURLOPT_FILE est identique à celle qu'il est dit d'envoyer la sortie à une chaîne via CURLOPT_RETURNTRANSFER .

_RETURNTRANSFER semble supprimer les nouvelles lignes et les espaces, comme si vous les analysiez pour les afficher sous forme de code HTML standard. _FILE conserve par contre le fichier exactement comme il était prévu.

J'ai lu la documentation sur php.net mais je n'ai rien trouvé qui puisse résoudre mon problème. Idéalement, j'aimerais que _RETURNTRANSFER renvoie le contenu exact afin d'éliminer un fichier intermédiaire, mais je ne vois aucun moyen de rendre cela possible.

Voici le code que j'utilise. Les données en question sont un fichier CSV avec \ r \ n fins de lignes.

function update_roster() {
  $url         = "http://example.com/";  
  $userID      = "xx";  
  $apikey      = "xxx";  
  $passfields  = "userID=$userID&apikey=$apikey";

  $file = fopen("roster.csv","w+");

  $ch = curl_init();  
  curl_setopt($ch, CURLOPT_POST, 1);  
  curl_setopt($ch, CURLOPT_URL,$url);  
  curl_setopt($ch, CURLOPT_POSTFIELDS, $passfields);  
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FILE, $file);
  $variable_in_question = curl_exec  ($ch);  
  curl_close ($ch);

  fclose($file);
  return $variable_in_question;
  }

Il s’avère que l’erreur n’est pas dans ce qui a été renvoyé, mais dans la façon dont je l’analysais. \ r \ n n’est pas analysé comme je le souhaitais lorsqu’il est mis entre guillemets, le passage aux guillemets doubles a résolu mon problème. Je ne savais pas que cela faisait une différence dans les appels de fonction comme ça.

Cela fonctionne parfaitement: $ cresult = split (" \ r \ n "; $ cresult);

Cela ne veut pas: $ cresult = split ('\ r \ n', $ cresult);

Était-ce utile?

La solution

Il s’avère que l’erreur n’est pas dans ce qui a été renvoyé, mais dans la façon dont je l’analysais. \ r \ n n’est pas analysé comme je l’attendais lorsqu’il est mis entre guillemets, le passage aux guillemets doubles a résolu mon problème. Je ne savais pas que cela faisait une différence dans les appels de fonction comme ça.

Cela fonctionne parfaitement: $ cresult = split (" \ r \ n "; $ cresult);

Cela ne veut pas: $ cresult = split ('\ r \ n', $ cresult);

Autres conseils

Dans la plupart des langages de script (c'est également le cas dans Bash, par exemple), les guillemets simples sont utilisés pour représenter les éléments tels qu'ils sont écrits, alors que les guillemets doubles sont "analysés". (Je ne pense pas que ce soit le mot approprié mais je ne trouve pas mieux).

$str = 'foo';
echo '$str'; // print “$str” to the screen
echo "$str"; // print “foo” to the screen

Cela est vrai pour les variables et les caractères d'échappement.

Je n'ai pas essayé de reproduire le "bogue". (Je pense que nous pouvons considérer cela comme un bug si c'est le comportement réel), mais vous pourriez peut-être vous en sortir.

Le document PHP indique que le comportement par défaut consiste à écrire le résultat dans un fichier et que le fichier par défaut est STDOUT (la fenêtre du navigateur). Ce que vous voulez, c'est obtenir le même résultat que dans un fichier mais dans une variable.

Vous pouvez le faire en utilisant ob_start (); et ob_get_clean (); .

$ch = curl_init(...);
// ...
ob_start();
curl_exec($ch);
$yourResult = ob_get_clean();
curl_close($ch);

Je sais que ce n’est pas vraiment la manière la plus propre (s’il en existe une), mais au moins cela fonctionnerait bien.

(Veuillez m'excuser si mon anglais n'est pas parfait; -) ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top