يقوم cURL في PHP بإرجاع بيانات مختلفة في _FILE و_RETURNTRANSFER

StackOverflow https://stackoverflow.com/questions/104223

  •  01-07-2019
  •  | 
  •  

سؤال

لقد لاحظت أن cURL في PHP يُرجع بيانات مختلفة عندما يُطلب منه الإخراج إلى ملف عبر CURLOPT_FILE كما يحدث عندما يُطلب منك إرسال الإخراج إلى سلسلة عبر CURLOPT_RETURNTRANSFER.

_RETURNTRANSFER يبدو أنه يزيل الأسطر الجديدة والمساحات البيضاء الإضافية كما لو كان يتم تحليلها لعرضها كرمز HTML قياسي. _FILE ومن ناحية أخرى يحافظ على الملف تمامًا كما كان مقصودًا.

لقد قرأت الوثائق الموجودة على php.net ولكن لم أجد أي شيء يبدو أنه يحل مشكلتي.من الناحية المثالية، أود أن يكون _RETURNTRANSFER قم بإرجاع المحتويات الدقيقة حتى أتمكن من إزالة ملف وسيط، لكنني لا أرى أي طريقة لجعل ذلك ممكنًا.

هذا هو الرمز الذي أستخدمه.البيانات المعنية هي ملف 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;
  }

وتبين أن الخطأ ليس فيما تم إرجاعه، ولكن في الطريقة التي كنت سأقوم بتحليلها بها. لم يتم تحليله بالطريقة التي توقعتها عند وضعه بين علامات الاقتباس المفردة، وقد أدى التبديل إلى علامات الاقتباس المزدوجة إلى حل مشكلتي.لم أكن أعلم أن هذا أحدث فرقًا داخل استدعاءات الوظائف من هذا القبيل.

هذا يعمل بشكل جيد:$cresult = split("\r\n", $cresult);

لم يحدث ذلك: $cresult = split('\r\n', $cresult);

هل كانت مفيدة؟

المحلول

وتبين أن الخطأ ليس فيما تم إرجاعه، ولكن في الطريقة التي كنت سأقوم بتحليلها بها. لم يتم تحليله بالطريقة التي توقعتها عند وضعه بين علامات الاقتباس المفردة، وقد أدى التبديل إلى علامات الاقتباس المزدوجة إلى حل مشكلتي.لم أكن أعلم أن هذا أحدث فرقًا داخل استدعاءات الوظائف من هذا القبيل.

هذا يعمل بشكل جيد:$cresult = split("\r\n", $cresult);

لم يحدث ذلك: $cresult = split('\r\n', $cresult);

نصائح أخرى

في معظم لغات البرمجة النصية (وهذا صحيح أيضًا في Bash على سبيل المثال)، تُستخدم علامات الاقتباس البسيطة لتمثيل الأشياء كما هي مكتوبة، في حين يتم "تحليل" علامات الاقتباس المزدوجة (لا أعتقد أنها الكلمة المناسبة ولكن لا يمكنني العثور على كلمة أفضل ).

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

وهذا صحيح بالنسبة للمتغيرات والأحرف الهاربة.

لم أحاول إعادة إنتاج "الخطأ" (أعتقد أنه يمكننا اعتبار هذا خطأ إذا كان هذا هو السلوك الفعلي)، ولكن ربما يمكنك التغلب عليه.

يقول PHP Doc أن السلوك الافتراضي هو كتابة النتيجة إلى ملف، وأن الملف الافتراضي هو STDOUT (نافذة المتصفح).ما تريده هو الحصول على نفس النتيجة الموجودة في ملف ولكن في متغير.

يمكنك فعل ذلك باستخدام ob_start(); و ob_get_clean();.

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

أعلم أن هذه ليست الطريقة النظيفة حقًا (إذا كانت هناك طريقة واحدة)، ولكنها على الأقل تعمل بشكل جيد.

(يرجى المعذرة إذا كانت لغتي الإنجليزية ليست مثالية؛-)...)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top