Domanda

Ho notato che cURL in PHP restituisce dati diversi quando viene detto di generare un file tramite CURLOPT_FILE come quando viene detto di inviare l'output a una stringa tramite CURLOPT_RETURNTRANSFER .

_RETURNTRANSFER sembra rimuovere le righe e lo spazio bianco extra come se lo analizzasse per la visualizzazione come codice HTML standard. _FILE d'altra parte conserva il file esattamente come era previsto.

Ho letto la documentazione su php.net ma non ho trovato nulla che possa risolvere il mio problema. Idealmente, vorrei che _RETURNTRANSFER restituisse il contenuto esatto in modo da poter eliminare un file intermedio, ma non vedo alcun modo per renderlo possibile.

Ecco il codice che sto usando. I dati in questione sono un file CSV con terminazioni di riga \ 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;
  }

Si scopre che l'errore non è in ciò che veniva restituito, ma nel modo in cui stavo per analizzarlo. \ r \ n non viene analizzato come mi aspettavo quando messo tra virgolette singole, passando a virgolette doppie risolto il mio problema. Non ero a conoscenza del fatto che questo ha fatto la differenza all'interno di chiamate di funzione del genere.

Funziona bene: $ cresult = split (" \ r \ n " ;, $ cresult);

Questo non: $ cresult = split ('\ r \ n', $ cresult);

È stato utile?

Soluzione

Si scopre che l'errore non è in ciò che veniva restituito, ma nel modo in cui stavo per analizzarlo. \ r \ n non viene analizzato come mi aspettavo quando messo tra virgolette singole, passando a virgolette doppie risolto il mio problema. Non ero a conoscenza del fatto che questo ha fatto la differenza all'interno di chiamate di funzione del genere.

Funziona bene: $ cresult = split (" \ r \ n " ;, $ cresult);

Questo non: $ cresult = split ('\ r \ n', $ cresult);

Altri suggerimenti

Nella maggior parte delle lingue di scripting (è vero anche in Bash per esempio), le virgolette semplici sono usate per rappresentare le cose mentre sono scritte, mentre le doppie virgolette sono "analizzate". (Non penso che sia la parola appropriata, ma non riesco a trovare di meglio).

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

È vero per variabili e caratteri di escape.

Non ho provato a riprodurre il "quot" bug " (Penso che possiamo considerarlo un bug se si tratta del comportamento effettivo), ma forse potresti superarlo.

Il documento PHP afferma che il comportement predefinito è scrivere il risultato in un file e che il file predefinito è STDOUT (la finestra del browser). Quello che vuoi è ottenere lo stesso risultato che in un file ma in una variabile.

Puoi farlo usando ob_start (); e ob_get_clean (); .

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

So che non è proprio il modo più pulito (se ce n'è uno), ma almeno dovrebbe funzionare bene.

(Per favore, scusami se il mio inglese non è perfetto; -) ...)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top