İki hızlı AJAX çağrıları PHP karıştırır

8 Cevap php

Ben sadece garip bir şey koştu. Ben farklı verileri tutan iki json diziler var. Genellikle sadece bir tanesi veri gerekir, ama her iki dizide veri almak için bir çift ajax arama yapmaya çalıştığınızda, ben de çağrılarda aynı veri ile sonuna kadar.

(PS! Ben url kesip ve type: dizisi 1. kullanıcılara JSON verileri tutan ve dizi 2 evlere JSON veri tutan, ve ben her iki dizide veri almak istiyorsanız söyleyin birkaç satır kaydetmek için.)

$.ajax({
   async:false,
   data:"type=users&id=3,5,6",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //will alert 3 as expected
   }
});

Sonra ikinci çağrı da orada bazı evler almak için yapmak:

$.ajax({
   async:false,
   data:"type=houses&id=2,4",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //alerts 3 as well...
   }
});

Kundakçı ile params ve yanıt baktığımızda, ben params doğru olduğunu görebilirsiniz, ancak yanıt yanlıştır.

Benim PHP ben bile sadece bu yaparken gelirse echo çalıştı:

echo $_GET['id'] . ", " . $_GET['type'];

Istek hem çağrılarda aynı görünmesi yapılan ... Ben ajax arama inbetween bir uyarı koyarsanız, ben (sistem bekler beri) beklenen sonuç almak. Ama senkron olmalarını hem koyarak çağrıları çökmesine yeterli olacağını düşündüm ..?

edit: Ben AJAX işlevi içinde denir php dosyanın bir kopyasını oluşturarak, ve her şeyin beklendiği gibi iş yapar ayrı dosyalara gitmek için çağrı ayarlama denedim. Yani javascript ile yanlış bir şey var oldukça eminim.

Ben ikinci AJAX çağrısından parametreleri kaldırırsanız more edit:, ben hala aynı sonucu alırsınız. Ben params listesi boş olduğunu görebilirsiniz Kundakçı ile talebi baktığımızda, ama cevap yine aynıdır ...

even more edit: kundakçı etrafa, ben keep-alive değeri var connection adında bir başlık olduğunu görebilirsiniz, ve sonra diye bir başlık {[(3) ]} {değeri ile [(4)]}. Ben bu onunla ilgisi olabilir tahmin ediyorum? Olsa, jQuery dokümanlar üzerinde bir şey bulamıyorum ...

source code: Ben sorun üreten bir küçük test case, yaptık:

PHP

echo $_GET['test'];
die();

HTML

<sript>
    $(document).ready(function() {
      $.ajax({
        type:"get",
        url:"bugtest.php",
        data="test=hello",
        success: function(data) {
          $("output").append(data);
        }
      });
      $.ajax({
        type:"get",
        url:"bugtest.php",
        data="test=world!",
        success: function(data) {
          $("output").append(" "+data);
        }
      });
    });
  </script>
  <h1>AJAX bug in Aptana's PHP server?</h1>
  <output></output>

Ben var, hepsi ve aynı şeyi yapar: Onun yerine beklediğiniz hello world! gibi alma, ben almak hello hello ...

8 Cevap

Wether PHP veya JS belirlemek için size Charles isteğinizi izlemek için kullanabilirsiniz (ben nedenini bilmiyorum, aslında kundakçı daha charles fazla güven) ve benzersiz bir değer serverside yaratacaktır sorun

<?php echo uniqid();

Iki istekleri aynı değeri dönerseniz sunucu ile yanlış bir şey başka bu tarayıcı veya jscode var, orada.

her şeyden önce, senkron AJAX çağrıları canlı bir sistemde temelden kötü. Test Tamam, ama, evde çocuklar bunu yapmayın! Neden? Sunucu bir ikinci veya hiç (oldukça muhtemel olan) içinde cevap vermezse, tarayıcı sekmesi olmayan duyarlı olur çünkü. Kötü durumda (eski Mozillas) içinde tüm tarayıcı donacak.

</teaching>

  • Eğer (Mesajlar büyük olasılıkla hiç saklanmaz) GET istekleri göndermek URL'ler, farklı olduğundan önbelleğe alma, sorun olmamalı.

  • Sizin alert() testi istendiği gibi tüm eşyalarımı geri gönderir çünkü, PHP'nin suçu olmadığını, söyler

  • Bu yüzden JavaScript ile kalır:

    • Eğer elle yazılmış kod verirdi, ben onreadystate (yani, yanlış istek nesne üzerinde istenen veri kontrolleri ele fonksiyonu) Eğer isteğin üzerine bir yanlış onay yapmak, tahmin ediyorum

    • Eğer bize söyleyebilir misin, kullanmak which kütüphane? Bana prototip gibi görünüyor.

Alkış,

Eğer URL damgası eklemeyi denemek mi? sadece önbelleğe alma vb önlemek için

 data:"type=houses&id=2,4&"+timestamp

GÜNCELLEME:

ya da sadece Ajax cache:false deneyin

Kullandığınız async:false

Async:

By default, all requests are sent asynchronous (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active.

Çünkü bu geçici engelleme olabilir .. true ayarlayarak deneyebilirsiniz.

POST kullanarak deneyin.

Aslında olması gerekiyordu değil PHP, 2 özdeş istekleri alırsa da o PHP'nin suçu değil; hata size $. ajax arama yapmak ve web sunucusu PHP istek geçirir nerede yer arasında bir yerde olduğunu.

Eğer web sunucusu hakkında biraz daha bilgi verebilir misiniz? Hangisini kullanıyorsunuz? Eğer alıcı veya optimizasyon oluyor orada çeşit var mı? Belki bazı PHP çerçeve veya PHP isteğini önbelleğe hangi "bootstrap" kullanabilir?

Ayrıca bağımsız bir test yapmak için deneyebilirsiniz. Dışarı Ajax kodu soyun ve sadece istek yankıları minimum php komut dosyası kullanabilirsiniz. Eğer aynı hata alırsanız bakın.

Php alınan gönderilen istekleri ve bazı istekleri kopyala-yapıştır veri güzel olurdu.


Ben böyle bir şey görmedim, ben onu ilgili yakalıyor neredeyse eminim. Geçici bir çözüm olarak, sadece birinde hem isteklerini birleştirme olabilir, sen PHP bir script biraz değiştirmek gerekir. Her zaman olabildiğince sunucu olarak birkaç isteklerini yapmak için çalışmalısınız beri de aslında muhtemelen daha iyi bir çözümdür.

Bu veri değişkeni ile bazı Sorunu olduğunu, mümkün mü?

Eğer ikinci isteği değiştirmek olsaydı ne olurdu:

$.ajax({
   async:false,
   data:"type=houses&id=2,4",
   success: function(dataHouse) {
      data = JSON.parse(dataHouse);
      alert(dataHouse.length)
   }
});

İlk ajax çağrısının yanıt sonraki ajax arama koyun:

function nextAjaxCall(){
  $.ajax({
    async:false,
    data:"type=houses&id=2,4",
    success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //alerts 3 as well...
    }
  });
}
$.ajax({
  async:false,
  data:"type=users&id=3,5,6",
  success: function(data) {
    data = JSON.parse(data);
    alert(data.length) //will alert 3 as expected
    nextAjaxCall();
  }
  error: function(){
    //error handling
    nextAjaxCall();
  }
});

İlki başarıyla dönmezse bile ikinci ajax arama emin olun.

JQuery ajax () seçenekleri yanlış: küresel ayarlamayı deneyin.

Evler için bir de kullanıcılar için bir - bu yardımcı olmazsa, iki farklı PHP sayfaları arama deneyin. Eğer bu çalışırsa, en azından sorunu daraltmak yardımcı olmalıdır.

0 saniye bekler bir zaman aşımı ikinci isteği koyarak deneyin.

$.ajax({
   async:false,
   data:"type=users&id=3,5,6",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //will alert 3 as expected
   }
});

setTimeout(function(){$.ajax({
   async:false,
   data:"type=houses&id=2,4",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //alerts 3 as well...
   }
})}, 0);