2008-09-06 9 views
10

मैं एक MySQL तालिका से निपट रहा हूं जो जॉबनाम कॉलम को अद्वितीय के रूप में परिभाषित करता है। यदि कोई जॉब नाम का उपयोग कर डेटाबेस में एक नई नौकरी को सहेजने का प्रयास करता है जो पहले से ही डेटाबेस में है, तो MySQL एक चेतावनी फेंकता है।क्या मैं PHP के साथ MySQL चेतावनी का पता लगा सकता हूं और संभाल सकता हूं?

मैं अपनी PHP स्क्रिप्ट में एक त्रुटि की तरह, इस चेतावनी का पता लगाने में सक्षम होना चाहता हूं और उचित तरीके से इसका निपटारा कर सकता हूं। आदर्श रूप में मैं जानना चाहता हूं कि किस प्रकार की चेतावनी MySQL फेंक दी गई है ताकि मैं इसे संभालने के लिए कोड को शाखा बना सकूं।

क्या यह संभव है? यदि नहीं, तो ऐसा इसलिए है क्योंकि MySQL में यह क्षमता नहीं है, PHP में यह क्षमता नहीं है, या दोनों?

उत्तर

10

PHP को मूल रूप से "ध्वजांकित" होने की चेतावनियों के लिए mysql/mysqli ड्राइवर में परिवर्तन की आवश्यकता होगी, जो स्पष्ट रूप से इस प्रश्न के दायरे से बाहर है। ताकि आप ध्यान से जब बारे में सोचने की जरूरत हो सकती है,

$warningCountResult = mysql_query("SELECT @@warning_count"); 
if ($warningCountResult) { 
    $warningCount = mysql_fetch_row($warningCountResult); 
    if ($warningCount[0] > 0) { 
     //Have warnings 
     $warningDetailResult = mysql_query("SHOW WARNINGS"); 
     if ($warningDetailResult) { 
      while ($warning = mysql_fetch_assoc(warningDetailResult) { 
       //Process it 
      } 
     } 
    }//Else no warnings 
} 

जाहिर है इस en-जन लागू करने के लिए घोर रूप से महंगा होने जा रहा है: इसके बजाय आप मूल रूप से हर क्वेरी आप चेतावनियों के लिए डेटाबेस पर बनाने की जाँच करने करने जा रहे हैं और चेतावनियां कैसे उत्पन्न हो सकती हैं (जो आपको उन्मूलन करने के लिए प्रतिक्रिया दे सकती है)।

संदर्भ के लिए

, MySQL SHOW WARNINGS

बेशक

, आप SELECT @@warning_count, जो आप निष्पादन प्रति एक प्रश्न की बचत होगी के लिए प्रारंभिक क्वेरी के साथ बांटना सकता है, लेकिन मैं पंडिताऊ संपूर्णता के लिए यह भी शामिल थे।

+0

या MySQLi ड्राइवर का उपयोग करें, जिसमें एक चेतावनी_count संपत्ति है। http://php.net/manual/en/mysqli.warning-count.php –

4

सबसे पहले, आपको turn warnings off होना चाहिए ताकि आपके आगंतुक आपकी MySQL त्रुटियां न देखें। दूसरा, जब आप mysql_query() पर कॉल करते हैं, तो आपको यह देखने के लिए जांच करनी चाहिए कि यह झूठी हुई है या नहीं। यदि ऐसा हुआ, तो क्या पता चला कि यह पता लगाने के लिए mysql_errno() पर कॉल करें। this page पर त्रुटि कोड पर लौटाई गई संख्या से मिलान करें।

यह इस तरह दिखता है आप देख रहे हैं त्रुटि संख्या है:

Error: 1169 SQLSTATE: 23000 (ER_DUP_UNIQUE)

Message: Can't write, because of unique constraint, to table '%s'

+5

अगर मुझे गलत नहीं लगता है तो वह चेतावनियों के बारे में पूछ रहा है, त्रुटियों में नहीं। एक चेतावनी अभी भी क्वेरी को पार करने की अनुमति देती है और इसलिए 'mysql_query'' झूठी 'वापस नहीं आती है। PHP के सीमित चेतावनी समर्थन के लिए iAn का उत्तर देखें। – Andrew

0

errno कार्यों मैं अब जो एहसास अपनी स्थिति में लागू नहीं है के बारे में सामान को हटाने के लिए अपडेट किया गया ...

UPDATE कथन के लिए MySQL में से एक चीज से सावधान रहें: mysqli_affected_rows()WHERE खंड मिलान पंक्तियों के बावजूद शून्य लौटाएगा, लेकिन SET खंड वास्तव में डेटा मानों को परिवर्तित नहीं करता था। मैं केवल इसका जिक्र करता हूं क्योंकि उस व्यवहार ने एक सिस्टम में एक बग का कारण बना दिया है जिसे मैंने एक बार देखा था - प्रोग्रामर ने अद्यतन के बाद त्रुटियों की जांच करने के लिए वापसी मूल्य का उपयोग किया था, शून्य मानते हुए कि कुछ त्रुटि हुई थी। इसका मतलब यह था कि उपयोगकर्ता ने अपडेट बटन पर क्लिक करने से पहले कोई मौजूदा मान नहीं बदला।

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

0

पर निर्भर करता है कि तुम क्या प्रयोग कर रहे हैं ढांचा, मैं तुम्हें jobname के लिए अपने आप की जाँच करें और फार्म के लिए सत्यापन के बाकी के साथ में उपयोगकर्ता के लिए उचित जानकारी बनाने के लिए एक प्रश्न कर सुझाव देते हैं (यदि हो तो)।

जॉब नामों की संख्या के आधार पर, आप उस नाम को नाम भेज सकते हैं जिसमें फॉर्म शामिल है और उपयोग किए जाने वाले उपयोग को बताने के लिए जावास्क्रिप्ट का उपयोग करें।

यदि यह आपको समझ में नहीं आता है, तो मेरे विचार को पूरा करने के लिए यह है: अपने प्रोग्राम और/या उपयोगकर्ता को अवैध चीजों को करने की कोशिश करने के लिए डिज़ाइन न करें और त्रुटियों को पकड़ें जब वे करते हैं और इसे संभालते हैं। यह बहुत बेहतर है, imho, त्रुटियों को बनाने के लिए अपने सिस्टम को डिजाइन करने के लिए। त्रुटियों को वास्तविक बग में रखें :)

0

आप mysqli कथन त्रुटि संख्या का उपयोग कर अद्वितीय कुंजी उल्लंघनों का पता लगा सकते हैं। Mysqli कथन त्रुटि 1062 देता है, जो ER_DUP_ENTRY है। आप त्रुटि 1062 की तलाश कर सकते हैं और उपयुक्त त्रुटि संदेश प्रिंट कर सकते हैं। यदि आप अपने कॉलम (jobName) को अपने त्रुटि संदेश के हिस्से के रूप में भी मुद्रित करना चाहते हैं तो आपको कथन त्रुटि स्ट्रिंग को पार्स करना चाहिए।

 
    if($stmt = $mysqli->prepare($sql)){ 
      $stmt->bind_param("sss", 
      $name, 
      $identKey, 
      $domain); 


      $stmt->execute(); 
      if($mysqli->affected_rows != 1) { 
         //This will return errorno 1062 
       trigger_error('mysql error >> '.$stmt->errno .'::' .$stmt->error, E_USER_ERROR); 
       exit(1); 
      } 
      $stmt->close(); 
     } else { 

      trigger_error('mysql error >> '. $mysqli->errno.'::'.$mysqli->error,E_USER_ERROR); 
     } 
0

चेतावनियां प्राप्त करना संभव है, और mysql के साथ mysqli के साथ एक और अधिक कुशल तरीके से संभव है। दबा चेतावनी पर

$mysqli->query($query); 

if ($mysqli->warning_count) { 
    if ($result = $mysqli->query("SHOW WARNINGS")) { 
     $row = $result->fetch_row(); 
     printf("%s (%d): %s\n", $row[0], $row[1], $row[2]); 
     $result->close(); 
    } 
} 
0

नोट::

यहाँ कोड संपत्ति mysqli-> warning_count के लिए php.net पर मैनुअल page पर सुझाव दिया है आम तौर पर, यह किया जा रहा से चेतावनी को रोकने के लिए एक अच्छा विचार नहीं है प्रदर्शित होता है क्योंकि आप कुछ महत्वपूर्ण याद कर रहे हैं। अगर आपको किसी कारण से चेतावनी छिपाना चाहिए, तो आप कथन के सामने @ साइन इन करके इसे व्यक्तिगत आधार पर कर सकते हैं। इस तरह आपको सभी चेतावनी रिपोर्टिंग को बंद करने की आवश्यकता नहीं है और इसे एक विशिष्ट उदाहरण तक सीमित कर सकते हैं।

उदाहरण:

// this suppresses warnings that might result if there is no field titled "field" in the result 
$field_value = @mysql_result($result, 0, "field"); 
+1

ऐसा लगता है जैसे उपयोगकर्ता त्रुटि को पकड़ने में सक्षम होना चाहता है, इसे दबाएं नहीं। – pgreen2

+0

'ini_set ('display_errors', 0) का उपयोग करना एक बेहतर विचार है; '(बेहतर अभी तक, इसे अपने php.ini में डालें), इस तरह उपयोगकर्ता किसी भी ऐसे सुरक्षा को नहीं देख पाएंगे जो सुरक्षा जोखिम पैदा कर सके। इसके साथ-साथ, मैं यह सुनिश्चित करने की अनुशंसा करता हूं कि 'error_log' एक लिखने योग्य फ़ाइल पर सेट है और' error_reporting = -1' सेट करें ताकि प्रत्येक संभावित समस्या ज्ञात हो। –

3
ini_set('mysql.trace_mode', 1) 

आप के लिए क्या देख रहे हो सकता है।

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