1

我注意到 PHP 中的 cURL 在被告知通过 输出到文件时返回不同的数据,CURLOPT_FILE就像在被告知通过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

事实证明,错误不在于返回的内容,而在于我解析它的方式。\r\n 没有按照我在单引号中的预期方式进行解析,切换到双引号解决了我的问题。我不知道这会在这样的函数调用中产生影响。

这工作得很好:$cresult = split("\r\n", $cresult);

这不会:$cresult = split('\r\n', $cresult);

于 2008-09-19T22:23:49.290 回答
1

在大多数脚本语言中(例如,在 Bash 中也是如此),简单的引号用于表示编写的内容,而双引号是“分析的”(我认为这不是合适的词,但我找不到更好的)。

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

对于变量和转义字符也是如此。

于 2008-09-20T13:58:08.543 回答
0

我没有尝试重现“错误”(如果它是实际行为,我认为我们可以将其视为错误),但也许你可以克服它。

PHP Doc 说默认的做法是将结果写入文件,默认文件是 STDOUT(浏览器的窗口)。您想要的是获得与文件中​​但在变量中相同的结果。

您可以使用ob_start();and来做到这一点ob_get_clean();

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

我知道这不是真正的干净方式(如果有的话),但至少它可以正常工作。

(如果我的英语不完美,请原谅;-)...)

于 2008-09-19T19:21:36.340 回答