(Prototip) ile bu ajax ile sorun nedir?

12 Cevap php

Hello i have the next code: php side:

<?php
print_r($_POST);
print_r($_GET);
die();
?>

Javascript:

voteAjax = function(typez, actionz, idz){
    new Ajax.Request(
        'http://localhost/reporeade/Vote/Ajax/?rand='+Math.random()*500000, 
        {asynchronous:true, 
         evalScripts:true,
         method:'post',
         parameters:'contentType='+typez+'&action='+actionz+'&id='+idz 
        });
    return false; 
}

Ve benim html bazı bölümlerinde:

<a class="button" onclick="voteAjax('content','up','89');">

Sen im localhost üzerinde çalışan görebilirsiniz ... i have sorun POST şekilde BAZEN kadar karışık olur ki, ben bir sonraki cevaba zaman% 90 olsun:

Array
(
    [contentType] => content
    [action] => up
    [id] => 89
)

Array
(
    [rand] => 449701.9597706424
)

Ve zamanın diğer% 10 i olsun:

Array
(
)

Array
(
    [rand] => 468905.44804602925
)

Şimdi, ben, her şeyi denedim bilgisayar değişti, (belki localhost sorun olduğunu düşünerek) tam bir url ile bir sunucuda denedim, ve http://localhost/reporeade/Vote/Ajax/?rand= instade kullanarak http://localhost/reporeade/Vote/Ajax?rand= sorun çözülmüş bir yerde okumak ancak her ikisi de ve gerçekten cant ne sonrası kaybolmak kılacak undertand .... herhangi bir fikir denediniz mi?

Edit: Well after playing with all this, i got it working(like it is) in our production server, but in all of our wamp instalations it will not work(well fail like 50% of the time). Its really important for me to solve this so we can keep on developing all the ajax functionality of the product, so...

  • Ben xampp ama bizim çerçeve ile uyumlu çalıştı
  • Ben wamp yerine 2.2 2.0 apache gitmeye çalıştı
  • Ben httpd.conf ve php.ini ayrılmakta konfigürasyonları ile çalıştı

Neden wamp herhangi bir fikir böyle başarısız olur?

Update: I'm sure the problem is the wamp instalation that is not sending the POST correctly some times, any help that would lead to solving this will get the correct answer and the bounty!

12 Cevap

Ben de size Wireshark'da aracılığıyla ağ trafiğini izlemek gerektiğini düşünüyoruz:

  1. Sunucu veya istemci ya da üzerinde başlayın.
  2. Ağ arabirimi yakalama başlayın.
  3. AJAX ve kullanın
  4. Bu yakalama durdurmak başarısız olur ve ne zaman
  5. Eğer isteği bulmanıza yardımcı olmak için Wireshark'da http yazın.
  6. Sağ tıklayın ve "Follow TCP Stream" seçeneğini seçin.

Isteği POST verileri görünmüyor Eğer tarayıcı ile bir şey. Eğer (daha önce söz edilmiştir IE ile birlikte GZip gibi) olası hatalar için HTTP başlıklarını kontrol edebilir.

Belki WAMP kurulum PHP aramak Fast-CGI veya benzer kullandığı, bu nedenle Apache için gerçek PHP modülünü kullanarak değil mi? Doğru ayarlanmamış Bazen bu tür hatalara neden olabilir. Mutlaka ihtiyacınız yoksa ben PHP modülüne geçiş tavsiye veya olası yapılandırma hataları arayın.

Ne WAMP zaten, değil mi? Önceden yapılandırılmış veya özel?

Ben Wireshark yükleme ve sorunu bu şekilde izole görmek için HTTP trafiğini izleme öneririm.

Eğer Prototip başka bir sürümünü denediniz mi? Bana öyle geliyor ki, etkili sunucusu düzgün ayrıştıramıyor geçersiz (kısmen) yaratma isteği sonrası istek gövdesini inşa garip bir hata var. (Http sniffer kavramak kolay) Fiddler kullanın ve tam olarak sunucuya gönderiliyor görmek.

Bu (Prototip kırılmış olur eğer gerçekten garip olurdu itiraf) durumda değilse, PHP (php.ini etkin olmalıdır) yoluyla ham post verileri okumaya çalışın. Eğer onlar $_POST toplama içine doldurulmaz yapamıyorsanız, yerine $_REQUEST deneyin.

Ayrıca, aşağıdaki konu danışmak için deneyin, belki bu durumda: http://bugs.php.net/bug.php?id=41349.

Bu uzun bir atış olup, ancak daha fazla bilgi ve bu yüzden onu ekarte olabilir bunu sormak zorundayım sizin kod daha görmeden: Bu kullanıcı linke çift tıklayarak ve iki hızlı istekleri oluşturma ile ilgili bir şey olabilir mi? (Once upon a time I got bitten by <input type="image" onclick="submit();"> both run the onclick and submitted the form)

function test() {
    voteAjax('content','up','89');
    voteAjax('content','up','89');
}

(Link yukarıda test işlevi çağırmak var)

Normalde bu UI kilitlemek değil çünkü uyumsuz bağlantılarını kullanmak istiyorum, ancak bu size sadece anda bir istek yapmak emin olmak için senkron deneyebilirsiniz bir durumdur. (Nonblocking çözüm isteği işlenirken bir bayrak ya da bağlantı / düğmesini devre dışı bırakmak için)

BTW, ben de prototip bunu URIEncode ve tüm & koyacağız beri, parametre olarak bir nesne yerine bir dize göndermek öneririz doğru yerlerde.

Yerine rastgele, yeni Date () deneyin:

voteAjax = function(typez, actionz, idz){
    new Ajax.Request(
        'http://localhost/reporeade/Vote/Ajax/', 
        {asynchronous:true, 
         evalScripts:true,
         method:'post',
         parameters:'contentType='+typez+'&action='+actionz+'&id='+idz+'&now='+new Date() 
        });

    //alert("params" + typez.toString() + actionz.toString() + idz.toString());
    return false; 
}

Bu deneyin:

voteAjax = function(typez, actionz, idz){
    new Ajax.Request(
        'http://localhost/reporeade/Vote/Ajax/', 
        {
           parameters: {
             contentType: typez,
             action: actionz,
             id: idz,
             rand: new Date()
           }
        });
    return false; 
}

Onlar nedeniyle onlar varsayılan değerleri vardır, necesary olmadığı için ben diğer seçenekleri kaldırdık fark :)

asynchronous:true, 
evalScripts:true,      -----> this one is "evalJS" not "evalScripts" :)
method:'post',

yo burada görebilirsiniz http://www.prototypejs.org/api/ajax/options

onun yardımcı olur umarım!

Ben de, WAMPServer koşuyorum, bu yüzden ben sadece kod çalıştı, ve ben sorunu yeniden - Ben hep POST değerleri olsun. Yüklemek benim Apache 2.2.8 ve PHP 5.2.6 ve ben sadece son prototype.js yakaladı. Benim wampserver yapılandırması oldukça fazla varsayılan.

Fiddler ve / veya Firebug +1. Gönderiliyor ham başlıklarına baktığımızda muhtemelen aydınlatıcı olacak!

Hangi tarayıcıyı kullanıyorsunuz? FF ve IE kullanarak bu başarısız? Ya da yalnızca bir tarayıcı.

Bazen önce ben IE ve Apache gzip modül sorunlar hakkında okuyun. Bu sadece bir sunucu tepkisi çok hızlı oldu, yerel tesislerde meydana gelen oldu. Ancak sizin durum farklıdır.

Diğerleri zaten önerildiği gibi Wireshark kesinlikle denemeye değer. O kadar zor değil. En azından bir hata var hangi tarafın üzerinde bilinen edeceğiz.

Onun bir POST isteği rand parametresini ayarlamak gerek yoksa, POST yardımcı olur belki, önbelleğe değildir.

EDIT gerçekten daha detaylı kod görmeden bu neden ne anlayamıyorum. Ne yapardın olduğunu:

1) Bu gibi parameters özniteliği bir nesne geçen deneyin:

parameters: {
    contentType, typez,
    action: actionz,
    id: idz
}

yerine bir dize:

parameters:'contentType='+typez+'&action='+actionz+'&id='+idz

2) Neden ihtiyacımız var evalScripts? Test amacıyla çıkarın.

Sorun Javascript ile gönderilen parametreleri ile gibi 3) ​​bu defol ayıklama gibi görünüyor, bu yüzden Firebug'ın console.log() derinlemesine bu daha fazla hata ayıklamak için kullanabilirsiniz.

Belki istek geçer bazı bileşen (Php, web sunucusu, güvenlik duvarı, ...) GET parametreleri ile bir POST isteği kullanmanız yaşıyor. Eğer ?rand=... kısmını bırakırsanız bu hiçbir şeyi değiştirmez mi?

Eğer yerine GET kullanırsanız ne olur. Yani, çok URL diğer parametreleri bağlamak olur? Böyle

voteAjax = function(typez, actionz, idz){
    new Ajax.Request(
        'http://localhost/reporeade/Vote/Ajax?'+'contentType='+typez+'&action='+actionz+'&id='+idz+'&now='+new Date(), 
        {asynchronous:true, 
         evalScripts:true,
         method:'post',
         parameters:'' 
        });
    return false; 
}

I think you can use GET.
Hope this help.

Ben böyle Ajax arama yapardım:

voteAjax = function(typez, actionz, idz){
    var rndVal = Math.random()*500000;

    new Ajax.Request( 'http://localhost/reporeade/Vote/Ajax/', {
         method:  'post',
         parameters: {contentType: typez, action: actionz, id: idz, rand: rndVal}, 
         onSuccess:  function(response) {
               //do stuff
         },
         onFailure:  function() {
               alert('Something went wrong.');
         }
        });
     return false;
  }