2013-07-16 6 views
5

शायद यह सवाल पहले से ही पूछा जा चुका है, लेकिन मुझे वास्तव में यह नहीं पता कि इसे कैसे खोजा जाए:क्या मुझे php के साथ एक अनूठी बाधा जांचनी चाहिए?

मेरे पास पोस्टग्रेस-टेबल "ग्राहक" हैं, और प्रत्येक ग्राहक का अपना अद्वितीय नाम है। इसे प्राप्त करने के लिए, मैंने इस कॉलम में एक अद्वितीय-बाधा जोड़ा।

मैं php के साथ तालिका तक पहुंचता हूं।

जब उपयोगकर्ता अब एक नया ग्राहक बनाने की कोशिश करता है, जो पहले से ही लिया गया है, डेटाबेस कहता है "इंटेग्रिटी कॉन्स्ट्रेंट उल्लंघन", और PHP एक त्रुटि फेंकता है।

मैं क्या करना चाहता हूं एचटीएमएल-इनपुट-फ़ील्ड में एक त्रुटि दिखाने के लिए: "ऐसा होता है जब ग्राहक-नाम पहले ही लिया जाता है"।

मेरा सवाल यह है कि मुझे यह कैसे करना चाहिए।

क्या मुझे पीडीओ-अपवाद पकड़ना चाहिए, जांचें कि क्या त्रुटि-कोड "अद्वितीय विघटन" है, और अपवाद-संदेश के अनुसार एक संदेश प्रदर्शित करने से, या मुझे अतिरिक्त विवरण के साथ डुप्लिकेट नामों की जांच करनी चाहिए एक नई पंक्ति डालने का प्रयास करें?

बेहतर अभ्यास क्या है? एक और एसक्यूएल-कथन बनाना, या त्रुटि-कोड को पकड़ना और विश्लेषण करना।

संपादित करें: मैं लेनदेन का उपयोग कर रहा है, और मैं किसी भी अपवाद को पकड़ने हूँ क्रम में रोलबैक करने के लिए। सवाल यह है कि, अगर मुझे अद्वितीय उल्लंघन का फ़िल्टर करना चाहिए तो वे रोलबैक नहीं लेते हैं।

EDIT2: मैं अपवाद-विधि का उपयोग कर रहा है, मैं क्रम में अपवाद-संदेश का विश्लेषण करने के लिए सुनिश्चित करें कि अद्वितीय-बाधा वास्तव में "नाम" -column के अंतर्गत आता है के लिए होगा।

["23505",7,"FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint <customers_name_unique>\nDETAIL: Schlüssel <(name)=(test)> existiert bereits."] 

स्तंभ के बारे में जानकारी प्राप्त करने के लिए एक ही रास्ता है, तो "customers_name_unique" मौजूद है की जाँच करने के (यह अद्वितीय-बाधा के नाम है) है:

यह सब कुछ मैं अपवाद से मिलता है।

लेकिन जैसा कि आप यह भी देख सकते हैं, संदेश जर्मन में है, इसलिए आउटपुट सिस्टम पर निर्भर करता है/बदल सकता है।

+0

शायद आपको यह देखना चाहिए: http://stackoverflow.com/questions/7719039/php-duplicate-checking-before-insert – jmarceli

उत्तर

2

प्रश्न वास्तव में यहां नहीं है लेकिन मैं आपको जवाब दूंगा।

कुछ असाधारण होने पर अपवाद होते हैं। इसका मतलब है कि आपको उन परिस्थितियों को संभालने के लिए उनका उपयोग नहीं करना चाहिए जो अक्सर हो सकती हैं। यदि आप ऐसा करते हैं तो यह गोटो कोड की तरह है। यदि कोई डुप्लिकेट पंक्ति है तो बेहतर समाधान जांचना बेहतर है। हालांकि, अपवादों के साथ समाधान आसान है इसलिए आपको यह तय करने की ज़रूरत है कि क्या आप कुछ काम करना चाहते हैं या यदि आप कुछ ऐसा करना चाहते हैं जो लिखा जाना चाहिए।

+1

मैं असहमत हूं। "उच्च" स्तर पर सामान्य प्रवाह होना बेहतर होता है और फिर अपवादों को पकड़ना बेहतर होता है। यह तेज़ कोड बना देगा, क्योंकि यदि आप निचले स्तर पर नहीं हैं तो फिर से वही जांच करना होगा। यदि वह सत्यापन सीपीयू भारी है तो आप वास्तव में अक्षम ऐप बना सकते हैं यदि आपके पास कई स्तर हैं (सेवाओं/संग्रहण/कक्षाएं सभी इस मामले में स्तर के रूप में गिनती हैं) –

+1

अपवादों को डिबगिंग में बहुत सी समस्याएं हो सकती हैं। इसके अलावा, अपवाद एक असंगत स्थिति में वस्तुओं को छोड़ देते हैं। यदि आप उन्हें अक्सर उपयोग करते हैं तो आपको बहुत सारी त्रुटियां मिल सकती हैं जो ट्रैक करना मुश्किल होती हैं। Obviosly आप अंततः ब्लॉक का उपयोग कर सकते हैं जो ऐसी स्थितियों को संभालने के लिए बनाया गया था, लेकिन हर कोई इसके बारे में नहीं जानता। यहां तक ​​कि प्रसिद्ध लिनस टोरवाल्ड्स ने कहा कि अपवाद बकवास हैं। इसके अलावा, गूगल में Google ने अपवादों का उपयोग करने से इस्तीफा दे दिया है क्यों Google में चेक करें। यदि आप बुद्धिमानी से उनका उपयोग नहीं करते हैं तो अपवादों के मामले में अपवाद भी बहुत महंगा हो सकते हैं। असहमत होने का आपका अधिकार है लेकिन इसका मतलब यह नहीं है कि आप सही हैं; पी – Robert

0

त्रुटियां खराब हैं, मैं यह जांचना चाहूंगा कि नाम जोड़ने से पहले नाम मौजूद नहीं है या नहीं। वैसे आपको अभी भी जांच करनी चाहिए कि क्या स्थिति में कोई त्रुटि नहीं है, जब समवर्ती स्क्रिप्ट एक ही नाम डालने की कोशिश कर रहे हैं (अस्तित्व की जांच के बीच थोड़ा सा समय है और सम्मिलित है, क्योंकि यह लेनदेन नहीं है)।

1

मैं अपवाद पकड़ूंगा, क्योंकि (सहमति के लिए धन्यवाद) जो वैसे भी हो सकता है, भले ही आप पहले से अतिरिक्त क्वेरी के साथ जांच करें।

0

बचत पर जांचें यदि मौजूद है (एक साधारण क्षेत्र में, आपके मामले में: बाधा कॉलम)। यदि सकारात्मक - उपयोगकर्ता को डुप्लिकेशन के बारे में अधिसूचना दिखाएं। लेकिन डीबी सर्वर को अपवाद वापस करने के लिए मजबूर नहीं करें।

5

आपको पीडीओ अपवाद पकड़ना चाहिए।

यह देखने के लिए डेटाबेस को असफल होने दें और देखें कि रिकॉर्ड पहले से मौजूद है या नहीं।

यह एप्लिकेशन को डेटाबेस में व्यावसायिक तर्क के "कम जागरूक" बनाता है। जब आप अद्वितीय इंडेक्स के बारे में डेटाबेस को बताते हैं जो वास्तव में एक व्यावसायिक तर्क है, और चूंकि डेटाबेस उस विशेष तर्क को संभालने में सक्षम है, तो अन्य परतों (एप्लिकेशन) में एक ही चेक को छोड़ना बेहतर होता है।

जब डेटाबेस परत अपवाद को संभालने में सक्षम होती है तो आप दौड़ की स्थिति से बचते हैं। यदि आपका एप्लिकेशन स्थिरता की जांच कर रहा है तो आप जोखिम उठा सकते हैं कि पहले एप्लिकेशन ने जांच की है कि यह उपलब्ध होने के बाद दूसरा उपयोगकर्ता एक ही रिकॉर्ड जोड़ता है।

+0

स्थिरता-समस्या प्रकट नहीं हो सकती है, क्योंकि मैं डेटाबेस से चेक-बाधा को नहीं हटाऊंगा। एकमात्र समस्या यह होगी कि, दौड़-स्थिति के दुर्लभ मामले में, उपयोगकर्ता को केवल "ग्राहक नाम डुप्लिकेट" के बजाय "अज्ञात त्रुटि" संदेश मिलेगा – maja

+0

यह एक अच्छा है 'गिनती (*) 'लेकिन मैं इसमें कोई संदेह नहीं है क्योंकि वह एक ट्रांसनेशनल स्टोरेज इंजन का उपयोग कर रहा है, जो रोलबैक एक्शन ले सकता है, जिसकी कीमतें 'गिनती (*)' से कम है? समस्या के हिस्से के लिए –

+0

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

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