2011-12-21 13 views
10

मैंने सीखा है कि odbc_execute() हमेशा एक उचित ODBC त्रुटि ट्रिगर नहीं करता है जब वह रिटर्न FALSE (कम से कम नहीं ओरेकल ड्राइवर के साथ) और मैं पूरी तरह से विश्वास नहीं odbc_error() या odbc_errormsg() कर सकते हैं। पिछली त्रुटि नहीं होने पर यह स्थिति पता लगाना आसान है क्योंकि odbc_error() एक खाली स्ट्रिंग देता है। हालांकि, जब यह कुछ देता है तो मुझे नहीं पता कि यह अंतिम असफल ऑपरेशन से संबंधित है या यह पिछली त्रुटि से बनी हुई है।चाल odbc_error पुनर्स्थापित करने के लिए()

सरल समाधान रीसेटodbc_error() और odbc_errormsg() कार्यों के लिए जब वहाँ एक त्रुटि इसलिए अगली कॉल सिरे से शुरू होता है हो सकता है, लेकिन मैं ऐसा करने के लिए एक समर्थित रास्ता नहीं मिल सका। क्या आप इसे करने का कोई तरीका समझ सकते हैं?

पृष्ठभूमि: मैं एक क्लास के साथ विरासत ऐप बढ़ा रहा हूं जो डेटाबेस कॉल को समाहित करता है। यही कारण है कि मुझे सबकुछ जितना संभव हो उतना सामान्य बनाना होगा।

उत्तर

1

odbc_error कभी-कभी भ्रमित हो जाता है। निष्पादित एसक्यूएल स्ट्रिंग और त्रुटि संदेश अलग हो सकता है। इसे रोकने के लिए, हम सभी निष्पादित एसक्यूएल को सरणी में रख सकते हैं, और सभी निष्पादन समाप्त होने के बाद, हम जांच सकते हैं कि त्रुटि संदेश क्या हैं।

पहले हमें एक executedSQL वर्ग जो निष्पादित SQLs जानकारी का आयोजन करेगा निर्दिष्ट कर सकते हैं:

class executedSQL 
{ 
    public sql; 
    public result; 
    public error; 
    public message; 
} 

इस वर्ग के सभी एसक्यूएल की जानकारी और उनके परिणाम पकड़ और संदेशों लौटे होगा।

हम ODBC डाटाबेस कनेक्ट करने के लिए एक वर्ग का उपयोग करते हैं:

class myODBC 
{ 
    //holds the connection 
    public $connection; 

    //all executed sql string are added to this array as executedSQL object. 
    public $executedSQLs = array(); 


    public function connect() 
    { 
     $this->connection = dbc_connect(" ", " ","") or die(odbc_errormsg()); 
    } 

    public function execute($sql) 
    { 
     $execution = odbc_exec($this->connection, $sql); //execute it 

     //put all the results to executedSQL object 
     $executed = new executedSQL(); 
     $executed->sql = $sql; 
     $executed->result = $execution; 
     $executed->error = odbc_error(); 
     $executed->message = odbc_errormsg(); 

     //push to executedSQLs var. 
     array_push($this->executedSQLs, $executed); 

     return $execution; 
    } 
} 

यदि हम अपने SQLs निष्पादित करें:

$db = new myODBC(); 

$db->connect(); 

$db->execute("select * from table1"); 
$db->execute("this is gonna be failed sql"); 
$db->execute("select * from table2"); 

print_r($db->executedSQLs); 

यह सब SQLs और उनके परिणाम मुद्रित करने के लिए जा रहा है। इस बिंदु पर हम निष्पादित एसक्यूएल और इसके संबंधित त्रुटि संदेश देख सकते हैं। तो सचमुच हम odbc_error को रीसेट नहीं कर रहे हैं लेकिन हम इसे और अधिक स्पष्ट करते हैं। यदि एक त्रुटि संदेश दो बार दोहराया जाता है, तो यह अधिक सक्षम है कि यह पिछले निष्पादित एसक्यूएल से संबंधित है। इस तरह डीबगिंग आसान हो जाता है। स्क्रिप्ट दौरान

function foo($sql){ 
    $res = odbc_exec($this->dbconn, $sql); 
    if (odbc_error() and $res===false) { 
     return $this->catchException(odbc_errormsg($this->dbconn)); 

    } 
    return $res; 
} 
+0

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

+0

इस सवाल के बारे में रूट प्लेटफॉर्म बग यह है कि 'odbc_errormsg() 'खुशी से पिछले कथन से संदेश वापस कर सकता है। समस्या यह पता लगाने के लिए नहीं है कि आपकी क्वेरी सफल हुई है (यह आसान है), समस्या यह सुनिश्चित करना है कि त्रुटि संदेश पिछली क्वेरी से संबंधित नहीं है।जब तक मैं कुछ याद नहीं कर रहा हूं, तब तक आपका कोड हल करने के लिए कुछ भी नहीं करता है। –

+0

इस दृष्टिकोण में, हम पता लगा सकते हैं कि पिछले कथन से एक एआरआर संदेश है या नहीं। उदाहरण के लिए, कहें, हम तीन प्रश्न निष्पादित कर रहे हैं। पहला सफल है, दूसरा विफल रहता है और "असफल संदेश 1" देता है। और तीसरा भी "विफल संदेश 1" वापसी में विफल रहता है। इस दृष्टिकोण से, हम सीख सकते हैं कि "असफल संदेश 1" क्वेरी 2 से संबंधित है। – isa

2

यह समारोह मैं इस तरह से हल पुनर्स्थापित करने के लिए आवश्यक नहीं है। तो, odbc_errormsg त्रुटियों को अलग करने का वास्तव में एक आसान तरीका प्रत्येक obdc_connect को एक अद्वितीय पहचानकर्ता असाइन करना है। उदाहरण $ db = @ odbc_connect ($ somefile, ......) दिखाते हैं लेकिन या तो यादृच्छिक या अद्वितीय नाम => $ db900 = @ odbc_connect ($ somefile, ......) या $ myuniquename = @ odbc_connect ($ somefile, ......) त्रुटि संदेशों को अलग करेगा। फिर odbc_errormsg ($ myuniquename) का उपयोग केवल उस आईडी के लिए त्रुटि लौटाएगा।

+0

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

+0

'$-- catchException()' क्या करता है? –

+0

सार्वजनिक फ़ंक्शन कैच अपवाद ($ odbc_errormsg) { // echo "Funciona en पकड़
"; $ patron_error = "/ SQL \ d + /"; यदि (preg_match ($ patron_error, $ odbc_errormsg, $ coincidencias)) { नया अपवाद ($ coincidencias [0]। ";" $ Odbc_errormsg) फेंक दें; } } अभी के लिए, यह केवल डीबी 2 के त्रुटि संदेशों के साथ उपयोगी है। मुझे उम्मीद है कि php odbc ड्राइवर के साथ किसी अन्य डेटाबेस की त्रुटियों को प्रबंधित करने का एक तरीका खोजें – vteran93

0

odbc_errormsg त्रुटियों को रीसेट नहीं किया जा सकता है:

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