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;
}
आपके उत्तर के लिए धन्यवाद। फिर भी आपका जवाब केवल इस मामले के लिए अच्छा है कि किसी को केवल डीबग उद्देश्यों के लिए त्रुटि संदेशों की आवश्यकता है। वास्तविक दुनिया के आवेदन में, किसी को निर्णय लेने के लिए त्रुटि संदेशों पर भरोसा करने में सक्षम होना चाहिए (त्रुटि के अनुसार अलग व्यवहार, या संदेश को इस तरह अनुवाद करें कि यह अंतिम उपयोगकर्ता के लिए समझ में आता है)। यही कारण है कि मुझे एक पूर्ण जवाब की आवश्यकता थी और एक उपहार देने की पेशकश की। –
इस सवाल के बारे में रूट प्लेटफॉर्म बग यह है कि 'odbc_errormsg() 'खुशी से पिछले कथन से संदेश वापस कर सकता है। समस्या यह पता लगाने के लिए नहीं है कि आपकी क्वेरी सफल हुई है (यह आसान है), समस्या यह सुनिश्चित करना है कि त्रुटि संदेश पिछली क्वेरी से संबंधित नहीं है।जब तक मैं कुछ याद नहीं कर रहा हूं, तब तक आपका कोड हल करने के लिए कुछ भी नहीं करता है। –
इस दृष्टिकोण में, हम पता लगा सकते हैं कि पिछले कथन से एक एआरआर संदेश है या नहीं। उदाहरण के लिए, कहें, हम तीन प्रश्न निष्पादित कर रहे हैं। पहला सफल है, दूसरा विफल रहता है और "असफल संदेश 1" देता है। और तीसरा भी "विफल संदेश 1" वापसी में विफल रहता है। इस दृष्टिकोण से, हम सीख सकते हैं कि "असफल संदेश 1" क्वेरी 2 से संबंधित है। – isa