2011-06-02 16 views
5

JQuery, PHP ve PostgreSQL kullanarak basit bir giriş/kayıt işlevselliği kodlarım var. Aşağıdaki kod, oturum açmalarla ilgilenen bir PHP dosyasından alınmıştır. Oturum açma/şifre kombinasyonu yanlış olduğunda bir istisna atar.Sunucu istisnai, müşteri yanlış anlamalarını başarı olarak atar

$username = $_POST['username']; 
$password = $_POST['password']; 

$query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; 
$result = pg_query($query) or die('Query failed: ' . pg_last_error()); 
$numResults = pg_num_rows($result); 

if ($numResults == 0) { 
    throw new Exception("Incorrect combination of username and password."); 
    //die('Incorrect combination of username and password.'); 
} 

Ancak jQuery istemci tarafı başarı fonksiyonu dosya sunucu bir istisna atar halde yürütülür.

 $.ajax({ 
     type: "POST", 
     url:"login.php", 
     data: dataString, 
     success: function() { 
//THIS FUNCTION IS EXECUTED.... 
      $('#errorMsg').html('Login is successful!'); 
      $('#errorMsg').show(); 
      $('#usernameTxtBx').val(""); 
      $('#passwordTxtBx').val(""); 
     }, 
     error:function (xhr, ajaxOptions, thrownError){ 
      window.alert(xhr.status); 
      window.alert(thrownError); 
     } 
     }); 
+0

Eğer kalıp yorumsuz ne olur() diyoruz? – barfoon

+0

Eh, HTTP isteği * başarılı oldu *. PHP katmanı bir istisna attı bu nokta dışında. Apache kaçtı, PHP'den bazı çıktılar elde etti (ki bu hata çıktı, ama iyi durumda idi) ve müşteriye başarılı bir şekilde teslim etti. Postacı size cinayetten mahk conmiyete karşı son itirazınız reddedildiğini söyleyen bir mektup gönderiyorsa, bu gerçekten berbat, ancak mektup hala teslim edildi. –

+0

@Tomalak: Evet, ama durum burada bir şekilde farklı. Metaforuna göre, böyle bir şey olurdu. Mahkumiyetiniz için son temyizinizin başarılı olup olmadığını soran bir mektup gönderirsiniz ve pozitif bir mesajın her zaman yeşil bir zarf içinde ve kırmızı bir mesajda bir negatif mesaj olduğunu söylerseniz, o zaman bunu söyleyen bir mesajla yeşil bir zarf alırsınız. başarılı olamadı. Hatalar her zaman HTTP Sunucusu düzeyinde yapılmamalıdır. Unutulmaz bir istisna her zaman bir çeşit HTTP hata kodu üretmelidir, çünkü sonuçta bu bir hatadır. – fresskoma

cevap

4

İlk: oldukça hassas olması nedeniyle, SQL Injections içine bakınız ...;)

problem, HTTP response code, bir PHP Özel Durumunu attığınızda bir hata olarak yorumlanan bir şey ayarlanmamış. Böyle bir şey bu geçici çözüm için yapabileceği:

function exception_handler($exception) { 
    header("HTTP/1.1 400 Bad Request"); 
    echo "Uncaught exception: " , $exception->getMessage(), "\n"; 
} 

set_exception_handler('exception_handler'); 

Bu çıkmadan önce doğru HTTP başlığı setleri kendi bir fonksiyonu için exception handler ayarlayacaktır. Bu şekilde jQuery şimdi bir hata oluştu ve hata işleyicisini başarı yerine çağırır.

Durum bilgisi olarak 400 Hatalı İstek'i seçtim, çünkü bu durumda hatanın hatalı girişten kaynaklanmış gibi görünüyor. Aslında istemciyle ilgili bir özel durum olup olmadığını kontrol etmek için subclass your own exception'a öneriyorum ve değilse, genel bir 500 İç Sunucu Hatası gönderin.

(eğer alt sınıf UserErrorException adında varsa) böyle bir şey olmazdı hata işleyicisi:

function exception_handler($exception) { 
    if($exception instanceof UserErrorException) { 
     header("HTTP/1.1 400 Bad Request"); 
    } else { 
     header("HTTP/1.1 500 Internal Server Error"); 
    } 
    echo "Uncaught exception: " , $exception->getMessage(), "\n"; 
} 

set_exception_handler('exception_handler'); 
3

PHP istisnaları Javascript yakalamaları tarafından TABANCILAR DEĞİLDİR. Diller tamamen farklı zamanlarda yürütülür. JS sadece istisnayı görür MESSAGE tele rastlar. PHP tarafı istisnanız '200 OK' dışında bir durumun HTTP durum kodunu göndermek için gerekli önlemleri almazsa, JS gelen metni ve 200 OK kodunu AJAX isteğinin başarıyla tamamlandığı anlamına gelir.

İlgili konular