2010-01-28 8 views
17

Załączony kod zwraca "Uwaga: Tablica do konwersji łańcuchów w ...". Po prostu moja tablica jest obsługiwana na serwerze zdalnym jako ciąg zawierający słowo "Array". pozostałe zmienne są w porządku.Umieszczanie tablicy z curl_setopt

Jak mogę przekazać moją tablicę $anarray bez tego problemu?

<?php 

$data = array(
    'anarray' => $anarray, 
    'var1' => $var1, 
    'var2' => $var2 
); 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "MY_URL"); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

curl_exec($ch); 

?> 
+1

patrz http: // stackoverflow .pl/questions/3772096/posting-multidimensional-array-with-php-and-curl – Julien

Odpowiedz

24

Zastosowanie http_build_query()

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 
// The values of variables will be shown but since we don't have them this is what we get 

Następnie można uzyskać do niego dostęp za pomocą $_POST normalnie superglobalną

+3

'serializować' tworzy dane w całkowicie niewłaściwym formacie dla tej operacji –

+1

Dlaczego dlaczego, dlaczego miałbyś to zrobić? – sepehr

+2

http_build_query jest w porządku, te downwokacje i komentarze muszą być starszą wersją odpowiedzi –

0

Jeśli $ anarray jest tablicą, jak podejrzewam, że jest, to nie powinno być. Zamień go na ciąg znaków, łącząc lub dowolną odpowiednią metodę.

Edytuj: Zobacz odpowiedź Eric Butera.

+0

Zgadzam się, ale brakuje pytania OP o to, jak przetwarzane są dane na serwerze zdalnym. Bez tej informacji nie można powiedzieć, że json_encode() lub serialize() lub coś innego jest drogą do zrobienia. –

15

Najlepszym sposobem, aby osiągnąć to, co jesteś po to, aby wykorzystać http_build_query().

+2

W ten sposób cURL wygeneruje żądanie HTTP' application/x-www-form-urlencoded', które jest w porządku, chyba że chcesz przesłać plik, który wymaga żądania 'multipart/form-data'. – sepehr

1

Od http://www.php.net/manual/en/function.curl-setopt.php opisie CURLOPT_POSTFIELDS

Pełne dane odpowiedzieć w HTTP "POST" operacji. Aby opublikować plik, dodaj nazwę pliku za pomocą @ i użyj pełnej ścieżki. Typ pliku może być wyraźnie określony przez podanie nazwy pliku z typem w formacie "; type = mimetype". Parametr ten może być przekazywany jako ciąg znakowany wenczasowo, taki jak "para1 = val1 & para2 = val2 & ..." lub jako tablica z nazwą pola jako kluczem i danymi pola jako wartością. Jeśli wartością jest tablica, nagłówek Content-Type zostanie ustawiony jako multipart/form-data. Od PHP 5.2.0, wartość musi być tablicą, jeśli pliki są przekazywane do tej opcji z przedrostkiem @.

1

Ze względu na charakter protokołu HTTP oraz sposób działania curl_setopt funkcja $ anarray nie może być przekazana bezpośrednio jako tablica.

następujące oświadczenie:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

pobiera tablicę parametrów POST i dla każdego z nich musi być string name i STRING wartość. Zamiast tego podajesz wartość tablicy, więc procesor PHP jest zmuszony przekształcić go w ciąg znaków przy użyciu jakiegoś lame wbudowanego algorytmu, który powoduje wydanie wcześniej wspomnianego powiadomienia ("Array to string conversion in ...").

Tak więc, aby poprawnie przekazać tę tablicę ($ anarray) na drugą stronę, trzeba samemu zająć się jej kodowaniem (w łańcuch), a druga strona musi zadbać o jej dekodowanie (z ciągu).

Moje podejście w takich sytuacjach to JSON. Jest odpowiedni prawie we wszystkich przypadkach.Wszystko co musisz zrobić, to stosuje się następujące techniki:

$data=array(
    'anarray'=>json_encode($anarray), 
    'var1'=>$var1, 
    'var2'=>$var2 
    ); 

A potem, po drugiej stronie połączenia byś pobrać oryginalnej tablicy następujący sposób:

$anarray=json_decode($_POST['anarray'],true); // true indicates for associative array rather than an object