1

CURLOPT_FILEPHP の cURL は、出力を 経由で文字列に送信するように指示されたときと同様に、 経由でファイルに出力するように指示されたときに異なるデータを返すことに気付きましたCURLOPT_RETURNTRANSFER

_RETURNTRANSFER標準の HTML コードとして表示するために解析するかのように、改行と余分な空白を削除するようです。 _FILE一方、意図したとおりにファイルを保存します。

php.net のドキュメントを読みましたが、問題を解決するようなものは見つかりませんでした。理想的には_RETURNTRANSFER、正確な内容を返して中間ファイルを削除できるようにしたいのですが、これを可能にする方法がわかりません。

これが私が使用しているコードです。問題のデータは、\r\n 行末の CSV ファイルです。

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

結局のところ、エラーは返されたものではなく、解析しようとしていた方法にあります。\r\n は、一重引用符で囲んだときに期待どおりに解析されません。二重引用符に切り替えると、問題が解決しました。これがそのような関数呼び出し内で違いを生むことに気づいていませんでした。

これはうまくいきます:$cresult = split("\r\n", $cresult);

これはしません:$cresult = split('\r\n', $cresult);

4

3 に答える 3

1

ほとんどのスクリプト言語(たとえばBashでも当てはまります)では、単純な引用符は書かれているものを表すために使用されますが、二重引用符は「分析」されます(適切な単語ではないと思いますが、うまく見つけることができません) )。

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

これは、変数とエスケープ文字に当てはまります。

于 2008-09-20T13:58:08.543 に答える
1

結局のところ、エラーは返されたものではなく、解析しようとしていた方法にあります。\r\n は、一重引用符で囲んだときに期待どおりに解析されません。二重引用符に切り替えると、問題が解決しました。これがそのような関数呼び出し内で違いを生むことに気づいていませんでした。

これはうまくいきます:$cresult = split("\r\n", $cresult);

これはしません:$cresult = split('\r\n', $cresult);

于 2008-09-19T22:23:49.290 に答える
0

私は「バグ」を再現しようとはしませんでしたが(実際の動作であればバグと見なすことができると思います)、おそらくそれを乗り越えることができます。

PHP Docによると、デフォルトの機能は結果をファイルに書き込むことであり、デフォルトのファイルはSTDOUT(ブラウザのウィンドウ)です。必要なのは、ファイルと同じ結果を変数で取得することです。

ob_start();とを使用してそれを行うことができますob_get_clean();

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

私はそれが本当にきれいな方法ではないことを知っています(もしあれば)、しかし少なくともそれはうまくいくでしょう。

(私の英語が完璧でない場合は失礼します;-) ...)

于 2008-09-19T19:21:36.340 に答える