2013-04-06 3 views
7

J'essaie de passer un tableau de chaînes à un script PHP en tant que données POST, mais je ne suis pas sûr de ce qu'il faut faire.Passer un tableau de chaînes à PHP comme POST

Voici mon code pour exécuter des scripts PHP jusqu'à présent:

Là où je suis en train de passer le tableau:

nameValuePairs.add(new BasicNameValuePair("message",message)); 
String [] devices = {device1,device2,device3}; 
nameValuePairs.add(new BasicNameValuePair("devices", devices));// <-- Can't pass String[] to BasicNameValuePair 
callPHPScript("notify_devices", nameValuePairs); 

appel script PHP:

public String callPHPScript(String scriptName, List<NameValuePair> parameters) { 
    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("http://localhost/" + scriptName); 
    String line = ""; 
    StringBuilder stringBuilder = new StringBuilder(); 
    try { 
     post.setEntity(new UrlEncodedFormEntity(parameters)); 

     HttpResponse response = client.execute(post); 
     if (response.getStatusLine().getStatusCode() != 200) 
     { 
      System.out.println("DB: Error executing script !"); 
     } 
     else { 
      BufferedReader rd = new BufferedReader(new InputStreamReader(
       response.getEntity().getContent())); 
      line = ""; 
      while ((line = rd.readLine()) != null) { 
       stringBuilder.append(line); 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("DB: Result: " + stringBuilder.toString()); 
    return stringBuilder.toString(); 
} 

Et le script PHP en question:

<?php 
include('tools.php'); 
// Replace with real BROWSER API key from Google APIs 
$apiKey = "123456"; 

// Replace with real client registration IDs 
$registrationIDs = array($_POST[devices]); <-- Where I want to pass array to script 

// Message to be sent 
$message = $_POST['message']; 

// Set POST variables 
$url = 'https://android.googleapis.com/gcm/send'; 

$fields = array(
       'registration_ids' => $registrationIDs, 
       'data'    => array("message" => $message), 
       ); 

$headers = array( 
        'Authorization: key=' . $apiKey, 
        'Content-Type: application/json' 
       ); 

// Open connection 
$ch = curl_init(); 

// Set the url, number of POST vars, POST data 
curl_setopt($ch, CURLOPT_URL, $url); 

curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

// Execute post 
$result = curl_exec($ch); 

// Close connection 
curl_close($ch); 

print_as_json($result); 
?> 

Des idées? Merci !

Modifier

Je suis en train de ce qui suit, mais toujours pas de joie:

public void notifyDevices(Message message) { 

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    List<String> deviceIDsList = new ArrayList<String>(); 
    String [] deviceIDArray; 

    //Get devices to notify 
    List<JSONDeviceProfile> deviceList = getDevicesToNotify(); 

    for(JSONDeviceProfile device : deviceList) { 
     deviceIDsList.add(device.getDeviceId()); 
    } 

    //Array of device IDs 
    deviceIDArray = deviceIDsList.toArray(new String[deviceIDsList.size()]); 
    for(String deviceID : deviceIDArray) { 

     nameValuePairs.add(new BasicNameValuePair("devices[]", deviceID)); 

    } 

    //Call script 
    callPHPScript("GCM.php", nameValuePairs); 
} 

Ceci est d'autant "Signaler une erreur" je ...

 HttpResponse response = client.execute(post); 
     if (response.getStatusLine().getStatusCode() != 200) 
     { 
      System.out.println("DB: Error executing script !"); 
     } 
+1

Que diriez-vous 'nameValuePairs.add (new BasicNameValuePair (" devices [] ", device1));', 'nameValuePairs.add (nouveau BasicNameValuePair (" devices [] ", device2));' ...? –

+0

@ dev-null-dweller: vous devriez publier cela comme une réponse. –

+0

Je vais essayer maintenant, merci! – TomSelleck

Répondre

19

Pour passer un tableau à php dans la chaîne de requête, vous devez ajouter [] à identifiant et ajouter tous les éléments que l'entrée séparée, donc quelque chose comme cela devrait fonctionner:

nameValuePairs.add(new BasicNameValuePair("devices[]", device1)); 
nameValuePairs.add(new BasicNameValuePair("devices[]", device2)); 
nameValuePairs.add(new BasicNameValuePair("devices[]", device3)); 

maintenant, $_POST['devices'] du côté php contiendra un tableau.

+0

Hey, j'essaie cela mais ça ne marche pas, je ne sais pas comment faire pour que Java imprime les erreurs PHP donc je reçois juste un message "Error execution script". J'ai mis à jour mon poste avec le code que j'essaie .. – TomSelleck

+0

$ _POST ['devices'], n'est pas plus correct tableau ($ _ POST ['devices']); ¿? – delive

2

D'abord, il vous manque des guillemets simples lors de l'accès au tableau $_POST en PHP. Modifiez la ligne

$registrationIDs = array($_POST[devices]); 

à:

$registrationIDs = array($_POST['devices']); 

Vous devez activer la journalisation d'erreur ou la sortie des messages d'erreur PHP pour le débogage en utilisant la valeur ini display_errors, log_errors, error_reporting de se faire remarquer de telles erreurs.


Mais même array($_POST['devices']) ne fera pas ce que l'on peut attendre. array(...) est une construction d'initialisation de tableau en PHP. Ce qui signifie que vous venez d'envelopper ($ _POST ['devices']) dans un autre tableau.

... Aimerait voir la sortie de var_dump($_POST);. Cela me donnerait une chance d'aider plus loin ..

+0

Ce n'est pas le problème, le premier fonctionne également, mais jette un avis supplémentaire –

+0

Oh n'a pas vu ça, merci! Comment puis-je tourner les erreurs sur ?? – TomSelleck

+1

Vous pouvez définir ces paramètres aux valeurs appropriées en utilisant le fichier 'php.ini' (globalement) ou par script en utilisant la fonction' ini_set ($ key, $ value) '. Notez ma mise à jour sur la construction 'array (...)' – hek2mgl

4

Je pense que vous devriez json encoder votre tableau de périphériques de sorte que vous obtenez une chaîne que vous pouvez passer à BasicNameValuePair (...). Dans votre code php, il vous suffit d'utiliser json_decode pour récupérer un tableau.

JSONArray devices = new JSONArray(); 
devices.put(device1); 
devices.put(device2); 
devices.put(device3); 

String json = devices.toString(); 
nameValuePairs.add(new BasicNameValuePair("devices", devices)); 

Dans votre code php:

$devices = $_POST['devices']; 
$devices = json_decode($devices); 
+0

@Tom celic Avez-vous résolu ce problème? J'ai aussi le même problème. –

+0

qu'est-ce que nameValuePairs –

Questions connexes