2015-09-24 3 views
1

Я пытаюсь отправить строку на php-сервер, но по какой-то причине Im не смог прочитать строку на сервере ... Я пробовал много способов набрать ее, но это похоже, я никогда не получал правильный синтаксис. У кого есть подсказки?Отправьте строку на php-сервер и используйте его

var command=""; 
if(document.getElementById("Text_1").value != "" && document.getElementById("Text_2").value != "") 
     { 
      command += " " + document.getElementById("Text_1").value + " " + document.getElementById("Text_2").value; 
     }  

     alert(command); 

     xmlhttp.open("POST", "server.php", false); 
     xmlhttp.setRequestHeader('info', command) 
        //TRIED xmlhttp.setRequestHeader("info, command") 
        //TRIED xmlhttp.setRequestHeader('info', 'command') 
        //TRIED many others sketchy things... 
     xmlhttp.send(); 
     //TRIED xmlhttp.send(command); 
     var output = xmlhttp.responseText; 

на PHP сервере:

<?php 

$parameter = $_POST['command']; 

$output = exec("someexecutable.exe $parameter"); 

echo json_encode($parameter); 
?> 

Для них интересно, если я жёстко $ параметр с правой строки, она работает, так что исполняемый файл не является проблемой. Сервер просто не может получить значение строки в $ _POST.

+0

Что значение команды перед отправкой? Тогда каково значение массива $ _POST? –

+2

Вы * можете * использовать ['escapeshellarg'] (http://php.net/escapeshellarg) в своем' $ parameter'. Я могу сделать довольно неприятные вещи (хуже, чем просто SQL-инъекции), если я могу запускать на вашем сервере произвольные команды! –

+0

Пока значение команды является конкатенацией text_1 и text_2, поэтому я действительно подтвердил, что строка, которую я отправляю, хороша. Для $ _POST я не знаю, поскольку с его серверной стороны я понятия не имел, как проверить это, потому что я не могу использовать такие вещи, как alertbox, чтобы всплывать содержимое. Я попытался просто поймать его на сервере и бросить обратно, чтобы прочитать его на стороне клиента javascript, но он не работает. Он бросил меня назад. Но я получил эту ошибку: Undefined error index: command. – MacGruber

ответ

3

setRequestHeader используется для установки заголовков по запросу. Такие вещи, как Content-type и Content-length.

Необходимо передать данные до send(). Для работы $_POST они должны быть в формате key=val&vey2=val2. На самом деле, в новых браузерах вы можете использовать FormData.

xmlhttp.open("POST", "server.php", false); 

// To emulate a `<form>` POST 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

// To get the response, you need to set a callback 
xmlhttp.onreadystatechange = function(){ 
    // readyState 4 = complete 
    // status = 200 OK 
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){ 
     var output = xmlhttp.responseText; 
    } 
}; 

// Create the Form Data 
var params = new FormData; 
params.append('command', command); 

xmlhttp.send(params); 

P.S. Перед запуском вашей команды вы должны запустить escapeshellarg(). Это может быть хуже, чем просто SQL-инъекция, если люди могут выполнять произвольные команды на вашем сервере.

<?php 
$parameter = escapeshellarg($_POST['command']); 
$output = exec("someexecutable.exe $parameter"); 
?> 

P.P.S. escapeshellarg() сделает вашу команду обработкой всего$_POST['command'] строка как параметр. Если вы этого не хотите, вам понадобится POST массив с вашего JavaScript.

// Create the Form Data 
var params = new FormData; 
params.append('command[]', document.getElementById("Text_1").value); 
params.append('command[]', document.getElementById("Text_2").value); 

xmlhttp.send(params); 

Теперь $_POST['command'] будет массив, поэтому вам придется выполнить команду, как так:

<?php 
$parameters = array_map('escapeshellarg', $_POST['command']); 
$output = exec("someexecutable.exe ".implode(' ', $parameters)); 
?> 
+0

Иисус Христос это работает, вы получили всю благодарность @Rocket Hazmat! – MacGruber

+0

Добро пожаловать :-) –

Смежные вопросы