Цикл Foreach & XML-RPC: это должно работать, но это не так, почему? - PullRequest
3 голосов
/ 14 мая 2011

Мне не удалось найти здесь уже отвеченный вопрос, который относится к моей ситуации. Из моего понимания того, что делает этот код, он на самом деле должен работать, но я просто не понимаю, почему это не так.

Я читаю список SKU из текстового файла. Каждый SKU находится на своей линии. Все, что мне нужно сделать, это передать SKU в одиночку моему XML-RPC-запросу и распечатать результаты. Из кода, который я вставил ниже, кажется, что он проходит через SKU, но возвращается только один действительный результат.

Если я пропущу каждый SKU вручную через переменную $ request, я получу действительные результаты. Я тестировал с 5 SKU, но у меня есть 200 на самом деле, поэтому было бы хорошо, если бы я мог заставить это работать. Я даже выложил обучающие видеоролики по Lydia PHP, чтобы понять, не понял ли я что-то, но, похоже, мой код был неправильным.

Я ценю вашу помощь с этим.

<?php

$list = file("skus2.txt");
print_r($list);

foreach ($list as $sku){

  $server_url = "http://xxxx.xxx/webservices/index.php";
  $request = xmlrpc_encode_request("catalog.findProductImagesBySku", array($sku));
  $context = stream_context_create(array(
  'http' => array(
  'method' => "POST",
  'header' => "Content-Type: text/xml",
  'content' => $request)));
   $file = file_get_contents($server_url, false, $context);
   $response = xmlrpc_decode($file);
   print_r ($response);
      }
?>

Я пробовал это во всех смыслах. Я занимаюсь этим часами.

Это то, что я получаю взамен. Как вы можете видеть, что он провалился на первых 4, хотя из оператора печати он получает правильный SKU и успешно работает на последнем SKU. Все SKU действительны, потому что я проверял их по одному.

    Array
(
    [0] => DJ750605

    [1] => TO88116

    [2] => TO1112516

    [3] => TO1112506

    [4] => ENAI200006
)

//start of 1st run of foreach loop
DJ750605

Warning:  file_get_contents(http://xxx/webservices/index.php) [function.file-get-contents]: failed to open stream: HTTP request failed! ...

//start of 2nd run of foreach loop
TO88116

Warning:  file_get_contents(http://xxx/webservices/index.php) [function.file-get-contents]: failed to open stream: HTTP request failed!...


//start of 3rd run of foreach loop
TO1112516

Warning:  file_get_contents(http://xxx/webservices/index.php) [function.file-get-contents]: failed to open stream: HTTP request failed!...


//start of 4th run of foreach loop
TO1112506

Warning:  file_get_contents(http://xxx/webservices/index.php) [function.file-get-contents]: failed to open stream: HTTP request failed!...

//start of 5th run of foreach loop
ENAI200006Array
(
[0] => Array
    (
        [sku] => ENAI200006
        [large_url] => http://xxxENAI200006.JPG
        [medium_url] => http://xxxENAI200006.JPG
        [thumb_url] => http://xxxENAI200006.JPG
        [url] => http://xxxENAI200006.JPG
    )

)

ОБНОВЛЕНИЕ: Рабочий код:)

<code><pre>
<?php

$list = file('skus2.txt', FILE_IGNORE_NEW_LINES);
print_r($list);

foreach ($list as $sku){

$server_url = "http://xxx.com/xxx/webservices/index.php";
$request = xmlrpc_encode_request("catalog.findProductImagesBySku", array($sku));
$context = stream_context_create(array(
'http' => array(
'method' => "POST",
'header' => "Content-Type: text/xml",
'content' => $request)));
$file = file_get_contents($server_url, false, $context);
$response = xmlrpc_decode($file);
print_r ($response);
}
?>

Еще раз спасибо, Ура!

1 Ответ

0 голосов
/ 23 мая 2011

Я с подозрением отношусь к обращению к файлу ('skus2.txt'), как указано в руководстве:

Примечание:

Каждая строка в результирующем массиве будет содержать окончание строки, если только не используется FILE_IGNORE_NEW_LINES, поэтому вам все равно нужно использовать rtrim (), если вы не хотите, чтобы заканчивался конец строки.

Я бы попробовал позвонить так:

$list = file('somefile.txt', FILE_IGNORE_NEW_LINES);

Или даже просто передать массив вручную, чтобы посмотреть, работает ли он, например:

$list = array('TO88116',
              'TO1112516',
              'etc...'
             );

Вы, по крайней мере, уменьшаете объем того, что вы должны отлаживать таким образом.

Good удачи!

...