PHP ve JavaScript JSON ve json_decode için

3 Cevap php

Ben temelde, jquery.ajax() ile bir PHP komut dosyası için bir JavaScript nesne geçmesine çalışıyorum:

var bigArray = new Object();
//Dode
//Start loop
bigArray[x] = {name: exname, id: exID, order:e, set: setBox, inc: incBox, example: exampleBox, day: i};

Yani hemen hemen bu nesnelerin bir dizi var.

    var anotherTest = $.toJSON(bigArray);
    var ajxFile = "routineajax.php";
    $.ajax({
        type: 'POST',
        processData: false,
        url: ajxFile,
        data: anotherTest,
        success: function(data) {
            $('#result').html(data);
            alert('Load was performed.');
        }
    });
});

PHP tarafı komut

 print_r($_POST);
 $params = json_decode($_POST);
 print_r($params)

Ajax arama geçiyor ve ben Firebug görebilirsiniz, ama print_r($_POST) boş bir dizi geri dönüyor. Da ben $_GET çalıştığını $.ajax fonksiyonu ve PHP script hem de bunu değiştirirseniz. Benim asıl sorun ben bu hata mesajını alıyorum olduğunu:

Uyarı: json_decode () parametre 1 verilen dize, dizi olmasını bekliyor

Ben bu sorunu nasıl düzeltebilirim?


PHP dosyası için bu pasajı ekledikten sonra

  $data = file_get_contents('php://input');
  var_dump($data);
  var_dump(json_decode($data));

Ben bu çıktıyı alıyorum

string'{"0"{"name":"Decline`Abs","id":"54","order":0,"set":"","inc":"","example":"","day":1}}' (length=87)`
  object(stdClass)[2]
      public '0' =>
        object(stdClass)[4]
          public 'name' => string 'Decline Abs' (length=11)
          public 'id' => string '54' (length=2)
          public 'order' => int 0
          public 'set' => string '' (length=0)
          public 'inc' => string '' (length=0)
          public 'example' => string '' (length=0)
          public 'day' => int 1

Yani en azından ben olsa erişmek için nasıl emin değilim, geçiyor, doğru yönde atılmış bir adım!

3 Cevap

Ben sorunu normal POST data key=value&key2=value2 olarak kodlanmış gönderilir ve JSON gibi yolluyorlar olduğunu düşünüyorum. Aşağıdaki gibi ham post veri erişimini deneyin:

$data = file_get_contents('php://input');
var_dump($data);
var_dump(json_decode($data));

İşe yarayıp yaramadığını görmek. Değilse eğer bir şey, o döner ne söz yayınlayın lütfen.


Based on the comment below and additions to the OP.

var_dump ve $data doğru kopyala-yapıştır mı? string'{"0"{"name" bana doğru görünmüyor: Bunu sormamın sebebi bu olduğunu. Bu geçerli bir JSON veya düzgün kodlanmış POST dizesi değil. Bu kopyalanan ve yapıştırılan zaman bazı karakterler kodlanmış var olduğunu olabilir.

Her iki durumda da, şimdi size gereken sonuç alıyoruz. stdClass bunu normal bir nesne sözdizimi kullanarak erişebilirsiniz, içine verileri koyar sadece boş bir konteyner. Bu durumda, çünkü 0 in, $data->{0}->name Bence yapmak gerekiyor. Bunu yaparsanız $data = json_decode($data, true) bir ilişkisel dizi olacak, ve sen $data[0]['name'] olarak POST'ed verilere erişebilir.

Bu keşfetmek tutmak istiyorsanız, size ajax isteği yapmak window.console.dir(data) hemen önce yapmanın sonuçlarını göstermek için yararlı olabilir, ve var_dump(data), sen kaynağını görüntülediğinizde emin olun Sayfanın kopyalayıp yapıştırın. window.console.dir(data) Firebug penceresinde data 's özellikleri (sağ, kundakçı kullanıyorsunuz?) Gösterecektir. Ayrıca Chrome'un ayıklayıcısında çalışır ve belki diğerleri de. Ama dediğim gibi muhtemelen size zaten ne gerek alıyorum, bu yüzden soruşturma gerekli değildir konum gibi görünüyor.

processData true çevirin. Ben senin JSON doğru geçirilir ediliyor inanmıyorum. Ayrıca bir json olarak aracılığıyla gelmeyecek, aksine bunu almak zaman JSON anahtar değer çiftleri $_POST içeriği olacağını unutmayın.

Ayrıca, bigArray değerleri dize kolaylıkla dönüştürülebilen vardır? DOM elemanları falan geçen ediyorsanız, sorunları için gidiyoruz.

Yeterince açık değil mi? json_decode() parametresi bir dize, dizi değil olmasını bekler. Ama $_POST ve $_GET hep diziler. Sen json_decode() bu dizinin bir üyesi iletebilirsiniz.

Bir dizinin içeriğini görmek için, bu pasajı kullanın:

echo "<pre>";
print_r($_GET);
echo "</pre>";