Хитрость для сброса odbc_error () - PullRequest
11 голосов
/ 21 декабря 2011

Я узнал, что odbc_execute() не всегда вызывает правильную ошибку ODBC, когда возвращается FALSE (по крайней мере, с драйвером Oracle), и я не могу полностью доверять odbc_error() или odbc_errormsg(). Эту ситуацию легко обнаружить, когда не было предыдущей ошибки, поскольку odbc_error() возвращает пустую строку. Тем не менее, когда он возвращает что-то, я не знаю, относится ли это к последней неудачной операции или это осталось от предыдущей ошибки.

Самым простым решением было бы сброс функций odbc_error() и odbc_errormsg() при возникновении ошибки, поэтому следующие вызовы будут начинаться с нуля, но я не смог найти поддерживаемый способ сделать это. Можете ли вы найти способ сделать это?

Справочная информация. Я расширяю устаревшее приложение классом, который инкапсулирует вызовы базы данных. Вот почему мне нужно сделать все как можно более общим.

Ответы [ 3 ]

3 голосов
/ 17 декабря 2014

Нет необходимости сбрасывать функцию, которую я решил таким образом:

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 голос
/ 11 декабря 2014

odbc_error иногда сбивает с толку. Выполненная строка sql и сообщение об ошибке могут отличаться. Чтобы предотвратить это, мы можем хранить все выполненные sql в массиве, а после завершения выполнения мы можем проверить сообщения об ошибках.

Сначала давайте определим класс executeSQL, который будет содержать информацию о выполненных 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. Таким образом, отладка становится проще.

0 голосов
/ 23 февраля 2015

Ошибки odbc_errormsg не могут быть сброшены во время сценария. Таким образом, на самом деле простой способ отделить ошибки odbc_errormsg - назначить каждому obdc_connect уникальный идентификатор. Примеры показывают, что $ db = @ odbc_connect ($ somefile, ......), но использует случайные или уникальные имена => $ db900 = @ odbc_connect ($ somefile, ......) или $ myuniquename = @ odbc_connect ( $ somefile, ......) будет отделять сообщения об ошибках. Тогда использование odbc_errormsg ($ myuniquename) вернет ошибку только для этого идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...