2013-04-06 19 views
7

Próbuję przekazać tablicę ciągów do skryptu PHP jako dane POST, ale nie jestem pewien, co zrobić.Przekazywanie tablicy String do PHP jako POST

Oto mój kod do wykonywania skryptów PHP do tej pory:

Gdzie Próbuję przekazać tablicę:

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); 

połączeń skrypt 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(); 
} 

i skrypt PHP w pytaniu:

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

Jakieś pomysły? Dzięki !

Edit

Próbuję następujący ale nadal nie radość:

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); 
} 

ta jest "Raportowanie błędów" wszystko mam ...

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

Jak o 'nameValuePairs.add (nowa BasicNameValuePair ("Urządzenia []", device1));' 'nameValuePairs.add (nowa BasicNameValuePair urządzenia ("[]", device2));' ...? –

+0

@ dev-null-dweller: powinieneś opublikować to jako odpowiedź. –

+0

Teraz spróbuję, dzięki! – TomSelleck

Odpowiedz

19

przekazać tablicę do php w ciągu kwerendy, należy dodać [] na identyfikator i dodać każdy element jak osobnym wejściem, więc coś jak to powinno działać:

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

teraz, $_POST['devices'] na stronie php będzie zawierać tablicę.

+0

Hej, próbuję tego, ale to nie działa, nie wiem jak uzyskać Javę, aby wydrukować błędy PHP, więc otrzymuję komunikat "Błąd wykonania skryptu". Zaktualizowałem swój post za pomocą kodu, który próbuję. – TomSelleck

+0

$ _POST ['devices'], nie jest bardziej poprawną tablicą ($ _ POST ['devices']); ¿? – delive

2

pierwszy, brakuje pojedynczych cudzysłowów podczas uzyskiwania dostępu do tablicy $_POST w PHP. Zmienić linię

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

do:

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

należy włączyć rejestrowanie błędów lub wyjście komunikatów o błędach PHP do debugowania przy użyciu wartości ini display_errors, log_errors, error_reporting aby uzyskać zauważony takich błędów.


Ale nawet array($_POST['devices']) nie zrobi tego, czego można się spodziewać. array(...) to konstrukcja inicjująca tablicę w php. Oznacza to, że po prostu wrap ($ _POST ['devices']) do innej tablicy.

... Chciałbym zobaczyć wyjście var_dump($_POST);. To dałoby mi szansę, aby pomóc dalej.

+0

To nie jest problem, pierwszy działa również, ale rzuca dodatkowe ogłoszenie –

+0

Och, nie widziałem, dzięki! Jak mogę włączyć błędy? – TomSelleck

+1

Możesz ustawić te ustawienia na odpowiednie wartości, używając pliku 'php.ini' (globalnie) lub skryptu, używając funkcji' ini_set ($ key, $ value) '. Zauważ moją aktualizację o 'tablicy (...)' konstrukt – hek2mgl

4

Myślę, że powinieneś kodować swoją tablicę urządzeń, aby otrzymać ciąg znaków, który możesz przekazać do BasicNameValuePair (...). W swoim kodzie php, wystarczy użyć json_decode, aby odzyskać tablicę.

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

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

W kodzie PHP:

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

@ Toma celiak Czy rozwiązałeś to? Mam również ten sam problem. –

+0

co to jest nazwaValuePairs –

Powiązane problemy