$ _POST пусто, отправка значений формы с помощью Ajax - PullRequest
1 голос
/ 01 июля 2011

HTML

<form action='insert.php' method='POST'>
    <p><b>Client:</b><input type='text' name='idclient'/> 
    <p><b>Total:</b><br /><input type='text' name='total'/> 

    <p><input type='submit' value='Save' id="btnSave"/>
    <input type='hidden' value='1' name='submitted' /> 
</form> 

PHP (insert.php)

<?php
    echo file_get_contents('php://input');
    include_once "connect.php"; 

    if ($db_found){
        if (isset($_POST['submitted'])) {
            foreach($_POST AS $key => $value) {
                 $_POST[$key] = mysql_real_escape_string($value);                
            } 

            $sql = "INSERT INTO `mytable` ( `idclient` ,  `total` ,  ) " . 
                       "VALUES(  {$_POST['idclient']} , {$_POST['total']}  ) ";
            mysql_query($sql) or die(mysql_error()); 
        }       
    }
    mysql_close($db_handle);
?>

Это работает нормально, но когда я пытаюсь позвонитьвставка с использованием Ajax функции $ _POST пуста, и я не могу получить доступ к значениям из формы.

Это код Ajax и вызов функции:

<form action="javascript:Save()" method='POST'>

Ajax

function Save()
{                           
  xmlHttp = getXMLHttp(); // returns a new XMLHttpRequest or ActiveXObject
  xmlHttp.onreadystatechange = function(){

    if(xmlHttp.readyState == 4) { 
      document.getElementById("btnSave").value = "Saved";
      document.getElementById("result").innerHTML = xmlHttp.responseText;
    }
    else{
      document.getElementById("btnSave").value = "Saving...";
    }
  }

  xmlHttp.open("POST", "insert.php", true);     
  xmlHttp.send(null);  // Do I need to create and pass a parameter string here?             
}

Выполнение echo file_get_contents('php://input'); действительно $ _POSTпусто и значения параметров не передаются.

Я мог бы объединить значение params в URL-адресе, как это

xmlHttp.open("POST", "insert.php?idclient=123&total=43", true);   

Но есть ли способ использовать $ _POST и воспользоватьсяиз этого?

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Вам необходимо установить тип содержимого на application/x-www-form-urlencoded, чтобы значения отображались в $_POST.

Например xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); (при использовании объекта XMLHttpRequest).

1 голос
/ 02 июля 2011

Исходя из ответов, это то, что я придумал:

var xmlHttp = getXMLHttp(); // returns a new XMLHttpRequest or ActiveXObject

function Save() {
  if(xmlhttp) { 
    xmlhttp.open("POST","insert.php",true); 
    xmlhttp.onreadystatechange  = handleServerResponse;

    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');    
    xmlhttp.send("idclient=" + document.getElementById("idclient").value  
                + "&total=" + document.getElementById("total").value); 
  }
}

function handleServerResponse() {
   if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
        alert("responseText= " + xmlhttp.responseText);
        document.getElementById("btnSave").value = "Saved";
        document.getElementById("result").innerHTML = xmlhttp.responseText; 
     }
     else {
        alert("Error during AJAX call. Please try again");
     }
   }
   else{
    document.getElementById("btnSave").value = "Saving...";
   }
}

Через некоторое время поиска я обнаружил, что определяем как отдельную эту функцию (а не как встроенную в onreadystatechange, как в первоначальном вопросе) заставит его работать.

xmlhttp.onreadystatechange  = handleServerResponse;

Тем не менее, @Daren особо отметил «специальные» входные значения.Например, передача символа '&' в строковом поле приведет к получению неполных значений.

0 голосов
/ 01 июля 2011

Попробуйте это для своей формы:

<form action="javascript:Save();return false;" method='POST'>
    <p><b>Client:</b><input id='client' type='text' name='idclient'/> 
    <p><b>Total:</b><br /><input id='total' type='text' name='total'/> 

    <p><input type='submit' value='Save' id="btnSave"/>
    <input type='hidden' value='1' name='submitted' /> 
</form> 

А затем сделайте ваш звонок так:

    xmlHttp.open("POST", "insert.php", true);
    var postStr = "idclient=" + document.getElementById("client").value + "&total=" + document.getElementById("total").value;
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      xmlHttp.send(postStr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...