2011-06-02 10 views
5

मैं JQuery, PHP और PostgreSQL का उपयोग कर एक साधारण लॉगिन/पंजीकरण कार्यक्षमता कोडिंग कर रहा हूं। निम्न कोड एक PHP फ़ाइल से है जो लॉग इन से संबंधित है। जब लॉगिन/पासवर्ड संयोजन गलत होता है तो यह अपवाद फेंकता है।सर्वर अपवाद फेंकता है, क्लाइंट misinterprets सफलता के रूप में

$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.'); 
} 

हालांकि, Jquery फ़ाइल में क्लाइंट-साइड पर सफलता फ़ंक्शन निष्पादित किया जाता है भले ही सर्वर अपवाद फेंकता हो।

 $.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

जब तुम मर जाते हैं uncomment क्या होता है() कहते हैं? – barfoon

+0

ठीक है, HTTP अनुरोध * सफल * किया। कि PHP परत एक अपवाद फेंक दिया बिंदु के अलावा है। अपाचे भाग गया, PHP से कुछ आउटपुट मिला (जो त्रुटि आउटपुट था, लेकिन ओह ठीक है), और इसे क्लाइंट को सफलतापूर्वक वितरित किया। अगर डाकिया आपको यह बताने के लिए एक पत्र देता है कि हत्या के लिए सजा के खिलाफ आपकी आखिरी अपील को अस्वीकार कर दिया गया था, जो वास्तव में बेकार है, लेकिन पत्र अभी भी ठीक है। –

+0

@ टोमालक: हाँ, लेकिन मामला यहां कुछ अलग है। आपके रूपक के आधार पर, यह ऐसा कुछ होगा। आप एक पत्र भेजते हैं कि क्या आपकी अंतिम अपील के लिए अंतिम अपील सफल हुई या नहीं, और कहें कि एक सकारात्मक संदेश हमेशा एक हरे रंग के लिफाफे में लपेटा जाता है और लाल रंग में एक नकारात्मक संदेश होता है, तो आपको एक संदेश के साथ एक हरा लिफाफा मिल जाएगा सफल नहीं हुआ। HTTP सर्वर स्तर पर त्रुटि हमेशा नहीं होती है। Imho एक uncatched अपवाद हमेशा किसी प्रकार का HTTP त्रुटि कोड उत्पन्न करना चाहिए, क्योंकि यह सब के बाद एक त्रुटि है। – fresskoma

उत्तर

4

सबसे पहले: कृपया SQL Injections पर गौर है, क्योंकि आप बहुत जोखिम रहता है ...;)

समस्या है, कि HTTP response code कुछ ऐसा सेट नहीं है जिसे एक त्रुटि के रूप में व्याख्या किया जाता है जब आप एक PHP अपवाद फेंकते हैं। आप कुछ इस तरह इस समाधान करने के लिए कर सकता है:

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

set_exception_handler('exception_handler'); 

यह अपना खुद का एक समारोह है, जो बाहर निकलने से पहले सही HTTP हेडर सेट करने के लिए exception handler सेट हो जाएगा। इस तरह, jQuery अब एक त्रुटि आई है और सफलता के बजाय त्रुटि हैंडलर को कॉल करें।

मैंने स्टेटस कोड के रूप में 400 खराब अनुरोध चुना है, क्योंकि इस मामले में त्रुटि गलत इनपुट के कारण होती है। मैं यह जांचने के लिए subclass your own exception पर सुझाव देना चाहता हूं कि यह वास्तव में क्लाइंट से संबंधित अपवाद है और यदि ऐसा नहीं है, तो इसके बजाय एक सामान्य 500 आंतरिक सर्वर त्रुटि भेजें।

त्रुटि हैंडलर कुछ इस तरह दिखेगा (यदि आप अपने उपवर्ग UserErrorException नाम):

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 अपवाद जावास्क्रिप्ट कैच द्वारा ट्रैपबल नहीं हैं। भाषाएं पूरी तरह से अलग-अलग समय पर निष्पादित कर रही हैं। जेएस केवल आपके अपवाद संदेश को तार भर में देखेगा। जब तक आपका PHP-side अपवाद '200 ओके' के अलावा किसी अन्य चीज़ का HTTP स्थिति कोड भेजने के लिए उपाय नहीं करता है, तो जेएस आने वाले पाठ और 200 ओके कोड की व्याख्या करेगा जिसका अर्थ है कि AJAX अनुरोध सफलतापूर्वक पूरा हो गया है।

1

यदि आप JQuery को यह जानना चाहते हैं कि कोई त्रुटि हुई है, तो आपको अपनी PHP स्क्रिप्ट की प्रतिक्रिया में सही शीर्षलेख सेट करना होगा।

हेडर त्रुटि कोड की एक सूची यहां पाया जा सकता: http://www.jqueryphp.com/http-header-codes/2011/01/

संबंधित मुद्दे