Pregunta

He notado que cURL en PHP devuelve datos diferentes cuando se le indica que envíe un archivo a través de CURLOPT_FILE como lo hace cuando se le dice que envíe la salida a una cadena a través de CURLOPT_RETURNTRANSFER.

_RETURNTRANSFER parece eliminar las nuevas líneas y los espacios en blanco adicionales como si los analizara para mostrarlos como código HTML estándar. _FILE por otro lado, conserva el archivo exactamente como estaba previsto.

He leído la documentación en php.net pero no encontré nada que parezca resolver mi problema.Idealmente me gustaría tener _RETURNTRANSFER devolver el contenido exacto para poder eliminar un archivo intermedio, pero no veo ninguna manera de hacerlo posible.

Aquí está el código que estoy usando.Los datos en cuestión son un archivo CSV con finales de línea .

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

Resulta que el error no está en lo que se devolvió, sino en la forma en que lo analicé. no se analiza de la manera que esperaba cuando se coloca entre comillas simples, cambiar a comillas dobles resolvió mi problema.No sabía que esto marcaba la diferencia dentro de llamadas a funciones como esa.

Esto funciona bien:$cresult = split("\r\n", $cresult);

Esto no lo hace: $cresult = split('\r\n', $cresult);

¿Fue útil?

Solución

Resulta que el error no está en lo que se devolvió, sino en la forma en que lo analicé. no se analiza de la manera que esperaba cuando se coloca entre comillas simples, cambiar a comillas dobles resolvió mi problema.No sabía que esto marcaba la diferencia dentro de llamadas a funciones como esa.

Esto funciona bien:$cresult = split("\r\n", $cresult);

Esto no lo hace: $cresult = split('\r\n', $cresult);

Otros consejos

En la mayoría de los lenguajes de secuencias de comandos (también es cierto en Bash, por ejemplo), se utilizan comillas simples para representar las cosas tal como están escritas, mientras que las comillas dobles se "analizan" (no creo que sea la palabra apropiada, pero no puedo encontrar otra mejor). ).

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

Es cierto para variables y caracteres de escape.

No intenté reproducir el "error" (creo que podemos considerarlo como un error si es el comportamiento real), pero tal vez puedas superarlo.

El documento PHP dice que la conducta predeterminada es escribir el resultado en un archivo y que el archivo predeterminado es STDOUT (la ventana del navegador).Lo que quieres es obtener el mismo resultado que en un archivo pero en una variable.

Podrías hacer eso usando ob_start(); y ob_get_clean();.

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

Sé que esa no es realmente la forma más limpia (si la hay), pero al menos debería funcionar bien.

(Por favor, disculpe si mi inglés no es perfecto ;-)...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top