2008-09-19 6 views
1

J'ai remarqué que cURL dans PHP renvoie des données différentes lorsqu'il est dit de sortir dans un fichier via CURLOPT_FILE comme il le fait quand on lui dit d'envoyer la sortie à une chaîne via CURLOPT_RETURNTRANSFER.cURL dans PHP retourne des données différentes dans _FILE et _RETURNTRANSFER

_RETURNTRANSFER semble dépouiller les retours à la ligne et l'espace blanc supplémentaire comme si l'analyse de l'affichage en code HTML standard. D'autre part, conserve le fichier exactement comme il était prévu.

J'ai lu la documentation sur php.net mais je n'ai rien trouvé qui semble résoudre mon problème. Idéalement, je voudrais que _RETURNTRANSFER retourne le contenu exact afin que je puisse é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 des fins de ligne \ r \ n.

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; 
    } 

fin de compte, l'erreur est pas dans ce qui était de retour, mais la façon dont je vaque à l'analyser. \ r \ n n'est pas analysé comme je l'espérais lorsqu'il est placé entre guillemets simples, le passage à des 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 très bien: $cresult = split("\r\n", $cresult);

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

Répondre

1

fin de compte, l'erreur est pas dans ce qui était de retour, mais la façon dont je vaque à l'analyser. \ r \ n n'est pas analysé comme je l'espérais lorsqu'il est placé entre guillemets simples, le passage à des 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 très bien: $cresult = split("\r\n", $cresult);

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

+0

Oui. PHP interprète les chaînes entre guillemets de manière différente, en effectuant une interpolation de chaîne en plus de gérer correctement les caractères especial (\ r, \ n, \ t). –

0

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

Le Doc PHP dit que le comportement par défaut est d'é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();. Je sais que ce n'est pas vraiment la manière propre (s'il y en a un), mais au moins cela devrait fonctionner correctement.

(S'il vous plaît excusez-moi si mon anglais est pas parfait; -) ...)

1

Dans la plupart des langage de script (il est également vrai dans Bash par exemple), des citations simples sont utilisés pour représenter les choses telles qu'elles sont écrites, alors que les guillemets doubles sont "analysés" (je ne pense pas que ce soit le mot approprié mais je ne peux pas trouver 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 échappés.