我已经了解到odbc_execute()
在返回FALSE
时并不总是触发正确的ODBC错误(至少在Oracle驱动程序中没有),我无法完全信任odbc_error()
或odbc_errormsg()
。由于odbc_error()
返回空字符串,因此在没有先前错误时很容易检测到这种情况。但是,当它返回一些东西时,我不知道它是否属于最后一次失败的操作,或者它是前一个错误的遗留物。
最简单的解决方案是在出现错误时重置 odbc_error()
和odbc_errormsg()
函数,以便下次调用从头开始,但我找不到支持这样做的方式。你能找到办法吗?
背景:我正在使用封装数据库调用的类来增强遗留应用程序。这就是为什么我需要尽可能地使所有东西都是通用的。
答案 0 :(得分:3)
没有必要以这种方式重置我解决的功能:
function foo($sql){
$res = odbc_exec($this->dbconn, $sql);
if (odbc_error () and $res===false ) {
return $this->catchException(odbc_errormsg($this->dbconn));
}
return $res;
}
答案 1 :(得分:1)
odbc_error有时会变得混乱。执行sql字符串和错误信息可能会有所不同。为了防止这种情况,我们可以将所有已执行的sqls保存在一个数组中,并且在所有执行完成后,我们可以检查错误消息是什么。
首先让我们定义一个执行的SQL类,它将保存已执行的sqls信息:
class executedSQL
{
public sql;
public result;
public error;
public message;
}
此类将保存所有sql信息及其结果并返回消息。
如果我们使用类来连接odbc db:
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及其结果。此时我们可以看到执行的sql及其相关的错误消息。所以从字面上看,我们并没有重置odbc_error,但我们更清楚了。如果错误消息重复两次,则更可行的是它属于先前执行的sql。这样调试变得更容易。
答案 2 :(得分:0)
在脚本期间无法重置odbc_errormsg错误。因此,实际上分离odbc_errormsg错误的一种简单方法是为每个obdc_connect分配一个唯一标识符。示例显示$ db = @ odbc_connect($ somefile,......)但使用随机或唯一名称=> $ db900 = @ odbc_connect($ somefile,......)或$ myuniquename = @ odbc_connect($ somefile,......)将分离错误消息。然后使用odbc_errormsg($ myuniquename)将只返回该id的错误。