odbc_error有時會變得混亂。執行的sql字符串和錯誤信息可能會有所不同。爲了防止這種情況,我們可以將所有執行的sqls保存在一個數組中,並且在所有執行完成後,我們可以檢查錯誤消息是什麼。
首先我們定義一個executedSQL類將舉行的執行sql語句的信息:
class executedSQL
{
public sql;
public result;
public error;
public message;
}
這個類將持有的所有SQL信息及其結果,並返回的消息。
如果我們使用一個類來連接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;
}
}
如果我們執行sql語句:
$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);
這將打印的所有SQL及其結果。在這一點上,我們可以看到執行的SQL及其相關的錯誤消息。所以從字面上看,我們不會重置odbc_error,但我們會更加清楚。如果錯誤消息重複兩次,則更適合於它屬於之前執行的SQL。這樣調試變得更容易。
來源
2014-12-11 09:14:46
isa
感謝您的回答。然而,你的答案只適用於只爲調試目的需要錯誤消息的情況。在真實世界的應用程序中,應該能夠依靠錯誤消息來做出決定(根據錯誤採取不同的行爲,或者以對最終用戶有意義的方式來翻譯消息)。這就是爲什麼我需要一個徹底的答案,並提供賞金。 – 2014-12-12 19:57:02
這個問題的根本問題在於'odbc_errormsg()'可以愉快地從前面的語句中返回消息。問題不在於檢測您的查詢是否成功(這很容易),問題是要確保錯誤消息不屬於先前的查詢。除非我錯過了一些東西,否則你的代碼無法解決這個問題。 – 2014-12-17 15:42:00
在這種方法中,我們可以檢測是否來自前一個語句的錯誤消息。例如,我們正在執行三個查詢。第一個成功,第二個失敗並返回「失敗消息1」。第三個也失敗返回「失敗消息1」。通過這種方法,我們可以知道「失敗消息1」屬於查詢2. – isa 2014-12-18 11:38:29