JQuery.ajax method = "post", но $_POST пуст

$.ajax({
    method: "post"
    , url: "save.php"
    , data: "id=453&action=test" 
    , beforeSend: function(){

    } 
    , complete: function(){ 
    }  
    , success: function(html){ 
        $("#mydiv").append(html);        
    }
});

Я установил тип метода как пост, но в Save.php. Я просто получаю значения либо в $_GET, либо $_REQUEST, но не в $_POST.

Моя форма выглядит так:

<form method="post" id="myform" action="save.php">

Он не работал, огляделся здесь и в Google, попробовал добавить enctype

<form method="post" id="myform" action="save.php" enctype="application/x-www-form-urlencoded">

но все еще $_POST пусто?

Как мне заставить работать?

Ответ 1

Вместо method: "post" вам нужно использовать type: "POST"

Итак, это должно работать без каких-либо изменений в вашей форме HTML:

$.ajax({
    type: "POST"
    , url: "save.php"
    , data: "id=453&action=test" 
    , beforeSend: function(){

    } 
    , complete: function(){ 
    }  
    , success: function(html){ 
        $("#mydiv").append(html);        
    }
});

Не знаю, почему это не работает, но это работает для меня:

save.php

<?php
print_r($_POST);

file.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title>Example</title>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
        $(function() {
            $('input').click(function() {
                $.ajax({
                    type: "POST"
                    , url: "save.php"
                    , data: "id=453&action=test" 
                    , beforeSend: function(){

                    } 
                    , complete: function(){ 
                    }  
                    , success: function(html){ 
                        alert(html);        
                    }
                });
            });
        });
    </script>
</head>

<body>
    <div id="main"><input type="button" value="Click me"></div>
</body>
</html>

Ваша ошибка должна лежать где-то в другом месте.

Ответ 2

У меня возникали проблемы с потерями переменных в миксе и обнаружил, что при использовании условий перезаписи для внешней перенаправления dir/foo.php в dir/foo Apache вообще отказывался от запроса POST и перенаправлял.

Поэтому при написании JavasSript вы должны ссылаться на файл таким образом, чтобы он мог обойти любое внешнее перенаправление.

например. Отбросьте имя расширения в строке с помощью JavaScript.

Запись

url: "dir/foo"

вместо

url: "dir/foo.php"

Я надеюсь, что это поможет другим, кто нашел эту страницу, как я.

Ответ 3

Почему бы не вызвать jQuery.post() напрямую?

$.post("save.php",
  $("#myform").serialize(),
  function(html) { 
    $("#mydiv").append(html);        
  },
  "html"
);

Что касается jQuery.ajax(), переход на type: "POST" вместо method: "POST" приведет к правильному запросу POST:

$.ajax({
        type: "POST",
        url: "test.mhtml",
        data: $("#myform").serialize(),
        success: function(html){ 
                $('#mydiv').html(html);
        }
});

Это отображается в журналах Apache как:

::1 - - - [30/Oct/2009:09:44:42 -0700] "POST /test.php HTTP/1.1" 200 9 "http://localhost:10501/test.mhtml" "(sic)"

Возможная альтернативная проблема:
Я нашел fooobar.com/questions/81069/..., осматривая вашу проблему. Может быть, это не jQuery, который дает вам неприятности, это PHP? В верхнем голосовавшем ответе есть несколько предложений по обеспечению того, что PHP не вмешивается, а второй самый высокий ответ предлагает некоторый код, чтобы увидеть, действительно ли запрос является POST или нет:

<?php
  if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo 'POSTed';
  }
?>

Ответ 4

** Добавьте код кода в свой код до успеха **

beforeSend: function(xhr){xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")}

Ответ 5

У меня были похожие проблемы с $(form).ajaxSubmit().

Инструменты браузера указывали, что я успешно выдал POST. На сервере $_SERVER['REQUEST_METHOD'] также указывал POST, и все же переменная $_POST в PHP возвращалась как array(0) { }. Проблема для меня заключалась в том, что я на самом деле отправлял пустую форму. Как только в форме появились данные, в $_POST появилось что-то (как и следовало ожидать!), Но что более важно, if ($_POST) {... } начал возвращать true.

Ответ 6

В моем случае решение добавляло недостающую .serialize() в data линии заявления Ajax:

data: $("#form").serialize()