2010-01-28 9 views
17

El código adjunto muestra "Aviso: matriz a conversión de cadena en ...". Simplemente mi matriz se maneja en el servidor remoto como una cadena que contiene la palabra "Array". el resto de las variables están bien.Contabilización de una matriz con curl_setopt

¿Cómo puedo pasar mi matriz $anarray sin este problema?

<?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

ver http: // stackoverflow .com/preguntas/3772096/publicación-multidimensional-array-con-php-y-rizo – Julien

Respuesta

24

Uso 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 

A continuación, puede acceder a ella usando normalmente la $_POST superglobal

+3

'serialize' produce datos en un formato completamente equivocado para esta operación –

+1

¿Por qué por qué, ¿por qué haces eso? – sepehr

+2

http_build_query está bien, esos downvotes y comentarios deben estar a una versión anterior de la respuesta –

0

Si $ unArray es una matriz, como sospecho que es, no debe ser. Conviértalo en una cuerda, mediante concatenación o cualquier método apropiado.

Editar: Ver la respuesta de Eric Butera.

+0

Estoy de acuerdo, pero lo que le falta la pregunta de la OP es también cómo son los datos procesados ​​en el servidor remoto. Sin esta información, no se puede decir que json_encode() o serialize() u otra cosa sea el camino a seguir. –

15

La mejor manera de lograr lo que busca es utilizar http_build_query().

+2

De esta manera, cURL generará una solicitud HTTP' application/x-www-form-urlencoded' que está bien, a menos que desee cargar un archivo que requiera una solicitud 'multipart/form-data'. – sepehr

1

De http://www.php.net/manual/en/function.curl-setopt.php descripción de CURLOPT_POSTFIELDS

Los datos completos para publicar en una operación HTTP "POST". Para publicar un archivo, anteponga un nombre de archivo con @ y use la ruta completa. El tipo de archivo puede ser explícitamente especificado siguiendo el nombre del archivo con el tipo en el formato '; type = mimetype'. Este parámetro se puede pasar como una cadena urlencoded como 'para1 = val1 & para2 = val2 & ...' o como una matriz con el nombre del campo como clave y datos de campo como valor. Si value es una matriz, , el encabezado Content-Type se establecerá en multipart/form-data. A partir de PHP 5.2.0, el valor debe ser una matriz si los archivos se pasan a esta opción con el prefijo @.

1

Debido a la naturaleza del protocolo HTTP, y la forma en que funciona la función curl_setopt, $ anarray no se puede pasar directamente como una matriz.

La siguiente declaración:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

toma una serie de parámetros POST y para cada uno de ellos debe ser un nombre de cadena y un valorcadena. En su lugar, está pasando un valor de matriz, por lo que el procesador PHP se ve obligado a convertirlo en una cadena utilizando algún algoritmo incoherente, que incurre en la emisión del aviso mencionado anteriormente ("Array to string conversion in ...").

Por lo tanto, para pasar correctamente esa matriz ($ anarray) al otro lado, usted tiene que encargarse de su codificación (en una cadena), y el otro lado tiene que encargarse de su decodificación (de una cuerda).

Mi enfoque en tales situaciones es JSON. Es lo suficientemente adecuado en casi todos los casos.Todo lo que tiene que hacer es aplicar la siguiente técnica:

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

Y luego, en el otro lado de la conexión que podría recuperar la matriz original de la siguiente manera:

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