诀窍重置odbc_error()

时间:2011-12-21 08:26:36

标签: php odbc

我已经了解到odbc_execute()在返回FALSE时并不总是触发正确的ODBC错误(至少在Oracle驱动程序中没有),我无法完全信任odbc_error()odbc_errormsg()。由于odbc_error()返回空字符串,因此在没有先前错误时很容易检测到这种情况。但是,当它返回一些东西时,我不知道它是否属于最后一次失败的操作,或者它是前一个错误的遗留物。

最简单的解决方案是在出现错误时重置 odbc_error()odbc_errormsg()函数,以便下次调用从头开始,但我找不到支持这样做的方式。你能找到办法吗?

背景:我正在使用封装数据库调用的类来增强遗留应用程序。这就是为什么我需要尽可能地使所有东西都是通用的。

3 个答案:

答案 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的错误。