2012-06-08 23 views
21

Chcę przesłać trochę danych w formacie json do php i wykonać jakąś operację w php. Mój problem polega na tym, że nie mogę wysłać danych json przez ajax do mojego pliku php. Proszę mi pomóc, jak mogę to zrobić. Próbowałem w ten sposób ..Wysyłanie JSON do PHP przy użyciu ajax

<script> 
$(function(){ 
$("#add-cart").click(function(){ 
    var bid=$('#bid').val(); 
    var myqty=new Array() 
    var myprice=new Array() 

    qty1=$('#qty10').val(); 
    qty2=$('#qty11').val(); 
    qty3=$('#qty12').val(); 

    price1=$('#price1').val(); 
    price2=$('#price2').val(); 
    price3=$('#price3').val(); 

    var postData = 
       { 
        "bid":bid, 
        "location1":"1","quantity1":qty1,"price1":price1, 
        "location2":"2","quantity2":qty2,"price2":price2, 
        "location3":"3","quantity3":qty3,"price3":price3 
       } 
    var dataString = JSON.stringify(postData); 

    $.ajax({ 
      type: "POST", 
      dataType: "json", 
      url: "add_cart.php", 
      data: {myData:dataString}, 
      contentType: "application/json; charset=utf-8", 
      success: function(data){ 
       alert('Items added'); 
      }, 
      error: function(e){ 
       console.log(e.message); 
      } 
    }); 
}); 
}); 
</script> 

I w PHP używam:

if(isset($_POST['myData'])){ 
$obj = json_decode($_POST['myData']); 
//some php operation 
} 

Kiedy się Dodaj print_r ($ _ POST) w pliku php, pokazuje tablicę (0) {} w Firebug.

+0

Usuń aplikację 'contentType:"/json; charset = utf-8 ",'. –

Odpowiedz

32

Przerwij contentType: "application/json; charset=utf-8",. Nie wysyłasz JSON na serwer, wysyłasz normalne zapytanie POST (zdarza się, że zawiera ciąg JSON).

To powinno dać ci to, co masz.

Rzecz w tym, że nie musisz używać tutaj JSON.stringify lub json_decode. Wystarczy zrobić:

data: {myData:postData}, 

Następnie w PHP:

$obj = $_POST['myData']; 
+0

Co jeśli wysyłam json do serwera ? w jaki sposób go odbieram i dlaczego różni się od MVC.NET? – Ayyash

+0

@Ayyash: Jeśli wysyłałeś JSON, musiałbyś odczytać surowe dane wejściowe (z 'php: // input'). nic nie wiesz o MVC.NET, więc nie mogę na to odpowiedzieć. –

+0

A może jest to problem IIS vs Apache? Używam tej samej funkcji ajax w obu, ale w .NET po prostu pobieram Request.Post, w PHP, który nie działa, ani php: // input z jakiegoś powodu, jedyną rzeczą, która działała była przekazywanie atrybutów ciągów zapytania i za pomocą $ _REQUEST ... to boli – Ayyash

13

To dlatego, że $_POST jest wstępnie wypełniony danymi formularza.

Aby uzyskać dane JSON (lub jakiekolwiek surowe dane wejściowe), należy użyć php://input.

$json = json_decode(file_get_contents("php://input")); 
+0

Gdybym miał to zrobić, nie używałbym jQuery, na przykład, dla innego, robiłbym wszystko ręcznie. –

4

wierzę, możesz spróbować coś takiego:

var postData = 
      { 
       "bid":bid, 
       "location1":"1","quantity1":qty1,"price1":price1, 
       "location2":"2","quantity2":qty2,"price2":price2, 
       "location3":"3","quantity3":qty3,"price3":price3 
      } 
$.ajax({ 
     type: "POST", 
     dataType: "json", 
     url: "add_cart.php", 
     data: postData, 
     success: function(data){ 
      alert('Items added'); 
     }, 
     error: function(e){ 
      console.log(e.message); 
     } 
}); 

kodują json powinno nastąpić automatycznie, a zrzut postu powinien dać ci coś takiego:

array(
    "bid"=>bid, 
    "location1"=>"1", 
    "quantity1"=>qty1, 
    "price1"=>price1, 
    "location2"=>"2", 
    "quantity2"=>qty2, 
    "price2"=>price2, 
    "location3"=>"3", 
    "quantity3"=>qty3, 
    "price3"=>price3 
) 
+0

Przerwij aplikację 'contentType:"/json; charset = utf-8 ",'. Jesteś "POST" jako standardowy łańcuch zapytania, a nie JSON. Następnie 'print_r ($ _ POST)' powinien dać ci tablicę, którą pokazujesz. –

2

po prostu usuń:

... 
//dataType: "json", 
url: "index.php", 
data: {myData:postData}, 
//contentType: "application/json; charset=utf-8", 
... 
+1

Powinieneś prawdopodobnie zachować 'dataType:" json ",', to jest typ danych zwracanych przez serwer. –

+0

tak, to prawda, ale json musi zostać zwrócony, aby uniknąć kolejnego błędu. –

+0

Zakładam, że OP zwraca JSON, ale po prostu tego nie pokazałem. Nie sądzę, że wystąpiłby błąd, gdybyś nic nie zwrócił. Dostaniesz tylko błąd, jeśli to, co powróciłeś, nie będzie JSON. –

1

Próbujesz wysłać tablicę JS z formatem obiektu JS.

Zamiast stosowania

var a = new array(); 
a['something']=... 

try:

var a = new Object(); 
a.something = ... 
6

Aby wysłać JavaScript obj do php przy użyciu json i Ajax:

JS:

var dataPost = { 
    "var": "foo" 
}; 
var dataString = JSON.stringify(dataPost); 

$.ajax({ 
    url: 'server.php', 
    data: {myData: dataString}, 
    type: 'POST', 
    success: function(response) { 
     alert(response); 
    } 
}); 

w obsłudze, że obiekt w php:

$obj = json_decode($_POST["myData"]); 

echo $obj->var; 
Powiązane problemy