Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的cURL在_FILE和_RETURNTRANSFER中返回不同的数据_Php_Curl - Fatal编程技术网

PHP中的cURL在_FILE和_RETURNTRANSFER中返回不同的数据

PHP中的cURL在_FILE和_RETURNTRANSFER中返回不同的数据,php,curl,Php,Curl,我注意到,PHP中的cURL在被告知通过CURLOPT_file输出到文件时返回不同的数据,就像被告知通过CURLOPT_RETURNTRANSFER将输出发送到字符串时一样 \u RETURNTRANSFER似乎会剥离换行符和额外的空白,就像解析它以显示为标准HTML代码一样\u文件另一方面,保留文件与预期完全一致 我已经阅读了php.net上的文档,但没有找到任何似乎能解决我问题的方法。理想情况下,我希望\u RETURNTRANSFER返回准确的内容,这样我就可以删除一个中间文件,但我看不

我注意到,PHP中的cURL在被告知通过
CURLOPT_file
输出到文件时返回不同的数据,就像被告知通过
CURLOPT_RETURNTRANSFER
将输出发送到字符串时一样

\u RETURNTRANSFER
似乎会剥离换行符和额外的空白,就像解析它以显示为标准HTML代码一样<代码>\u文件另一方面,保留文件与预期完全一致

我已经阅读了php.net上的文档,但没有找到任何似乎能解决我问题的方法。理想情况下,我希望
\u 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) 

我没有尝试复制“bug”(我认为我们可以认为这是一个bug,如果它是实际行为),但也许你可以克服它。 PHP文档说默认的组件是将结果写入一个文件,默认的文件是STDOUT(浏览器的窗口)。您希望得到的结果与文件中的结果相同,但与变量中的结果相同

您可以使用
ob_start()
ob_get_clean()

我知道这并不是一个干净的方法(如果有),但至少它可以很好地工作


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

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

这很好:
$cresult=split(“\r\n,$cresult”)

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

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


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

是。PHP以不同的方式解释双引号中的字符串,除了正确处理特殊(\r\n\t)字符外,还进行字符串插值。
$ch = curl_init(...);
// ...
ob_start();
curl_exec($ch);
$yourResult = ob_get_clean();
curl_close($ch);
$str = 'foo';
echo '$str'; // print “$str” to the screen
echo "$str"; // print “foo” to the screen