Intereting Posts

Передача массива String в PHP как POST

Я пытаюсь передать строковый массив в PHP-скрипт как данные POST, но я не уверен, что делать.

Вот мой код для выполнения PHP-скриптов:

Где я пытаюсь передать массив:

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

Вызвать скрипт 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(); } 

И рассматриваемый PHP-скрипт:

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

Есть идеи? Благодаря !

редактировать

Я пробую следующую, но еще не радость:

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

Это все «Отчет об ошибках» у меня есть …

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

Чтобы передать массив в php в строку запроса, вы должны добавить [] в идентификатор и добавить каждый элемент в отдельную запись, поэтому что-то вроде этого должно работать:

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

теперь $_POST['devices'] на стороне php будет содержать массив.

Я думаю, вам нужно json закодировать ваш массив устройств, чтобы получить строку, которую вы можете передать в BasicNameValuePair (…). В вашем php-коде вам просто нужно использовать json_decode для возврата массива.

 JSONArray devices = new JSONArray(); devices.put(device1); devices.put(device2); devices.put(device3); String json = devices.toString(); nameValuePairs.add(new BasicNameValuePair("devices", devices)); 

В вашем php-коде:

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

Во-первых, вам не хватает одиночных кавычек при доступе к массиву $_POST в PHP. Изменить строку

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

чтобы:

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

Вы должны включить ведение журнала ошибок или вывод сообщений об ошибках PHP для отладки с использованием значения ini display_errors , log_errors , error_reporting чтобы заметить такие ошибки.


Но даже array($_POST['devices']) не будет делать то, что может ожидаться. array(...) является конструкцией инициализации массива в php. Это означает, что вы просто переносите ($ _POST ['devices']) в другой массив.

… хотел бы увидеть выход var_dump($_POST); , Это даст мне шанс помочь дальше ..