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. Таким образом, отладка становится проще.