2009-10-30 18 views
10
$.ajax({ 
    method: "post" 
    , url: "save.php" 
    , data: "id=453&action=test" 
    , beforeSend: function(){ 

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

mam ustawić typ metody jak w poście, ale ja po prostu Save.php wartości zarówno w $_GET lub $_REQUEST ale nie w $_POST.

Moja postać wygląda następująco:

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

To nie działa, rozejrzał się tutaj i na Google, próbował dodanie enctype

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

ale nadal $_POST pusty?

Jak to działa?

+1

Wystarczy miał podobny problem przy użyciu jQuery plugin za ajaxForm. Rozwiązałem go, upewniając się, że każdy element wejściowy ma atrybut "nazwa". Mój pasował do selektora ID, ale może nie być to konieczne. – jbrain

Odpowiedz

8

Zamiast method: "post" trzeba użyć type: "POST"

Tak to powinno działać bez żadnych zmian do formularza HTML:

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

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

Nie wiem, dlaczego to nie działa, ale działa to dla mnie:

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> 

Twój błąd musi leżeć gdzieś indziej.

+0

nie .. nie działa. – TigerTiger

+0

@Wbdvlpr: otwórz konsolę firebug i sprawdź wysyłane żądania. Możesz zobaczyć, jakiej metody używa (get/post) i jakie parametry są wysyłane do którego adresu URL. A potem stamtąd. – serg

+0

Ale otrzymuję wartości w $ _GET i $ _REQUEST .. ale nie w $ _POST .. jakiś pomysł, jak sprawdzić, czy "gdzieś indziej" jest źle? – TigerTiger

4

Dlaczego nie zadzwonić bezpośrednio pod numer jQuery.post()?

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

W odniesieniu do jQuery.ajax(), zmieniając na type: "POST" zamiast method: "POST" spowoduje prawidłowe POST żądanie:

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

To pokazuje w logach Apache jak:

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

Possible alternatywny numer:
Znalazłem this question on StackOverflow, rozglądając się wokół twojego problemu. Może to nie jQuery daje ci kłopoty, to jest PHP? Górny głosowało odpowiedź ma jakieś sugestie co do zapewnienia, że ​​PHP nie zakłóca, a drugi najwyższy odpowiedź oferuje trochę kodu do sprawdzenia, czy wniosek jest rzeczywiście POST czy nie:

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

co powiesz na beforesend, ukończ, sukces ?? z .post? – TigerTiger

+0

po prostu użyj: $ .post ("save.php", $ ("# myform"). Serialize(), funkcja (dane) {$ (". Msg '). Html (dane);); (3rd arugment jest funkcją oddzwaniania.) – CodeJoust

+0

Edytowałem, aby uwzględnić trzeci i czwarty argument. Trzeci argument to funkcja wywołania zwrotnego dla zwracania informacji, a czwarty argument to typ danych wracających. jQuery zrobi kilka analiz dla ciebie, jeśli zmienisz typ zwracania JSON. –

3

miałem problemy ze zmiennymi zagubienie się w miksie i odkrył, że podczas korzystania z warunków przepisywania do zewnętrznego przekierowania dir/foo.php do dir/foo Apache całkowicie upuścił żądanie POST i przekierowanie.

Tak więc podczas pisania pliku JavaScript należy odwoływać się do pliku w taki sposób, aby mógł on ominąć zewnętrzne przekierowanie.

np.Upuść nazwę rozszerzenia zgodnie z JavaScriptem.

Zapis

url: "dir/foo"

zamiast

url: "dir/foo.php"

Mam nadzieję, że to pomoże innym, którzy znaleźli tę stronę jak ja.

+0

Dziękujemy! Twój komentarz pomógł mi! :) – Zhenya

2

** Dodaj poniżej fragment kodu w kodzie przed sukcesu **

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

po tym w moim $ _POST pojawiły się moje dane! –