odbc_error czasami staje się zagmatwany. wykonany ciąg sql i komunikat o błędzie mogą być inne. Aby temu zapobiec, możemy zatrzymać wszystkie wykonane sqls w tablicy i po zakończeniu wszystkich działań możemy sprawdzić, jakie są komunikaty o błędach.
Najpierw zdefiniujmy klasę executedSQL który mocuje wykonywane zapytania SQL informacje:
class executedSQL
{
public sql;
public result;
public error;
public message;
}
Ta klasa będzie posiadać wszystkie sql informacji i ich wynik i wrócił wiadomości.
Jeśli użyjemy klasy połączyć db 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;
}
}
Jeśli wykonujemy nasze zapytania 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);
To będzie drukować wszystkie zapytania SQL i ich rezultaty. W tym momencie możemy zobaczyć wykonany sql i związany z nim komunikat o błędzie. Więc dosłownie nie resetujemy odbc_error, ale robimy to wyraźniej. Jeśli komunikat o błędzie jest powtarzany dwa razy, jest bardziej prawdopodobne, że należy do wcześniej wykonanego sql. W ten sposób debugowanie staje się łatwiejsze.
Dzięki za odpowiedź. Jednak twoja odpowiedź jest tylko dla przypadku, że potrzebujesz komunikatów o błędach tylko do celów debugowania. W aplikacji w świecie rzeczywistym można polegać na komunikatach o błędach, aby podejmować decyzje (inne zachowanie w zależności od błędu lub przetłumaczyć wiadomość w sposób, który ma sens dla użytkownika końcowego). Z tego powodu potrzebowałem dokładnej odpowiedzi i zaoferowałem nagrodę. –
Błąd platformy głównej, o który chodzi w tym pytaniu, polega na tym, że 'odbc_errormsg()' może z powodzeniem zwrócić komunikat z poprzedniej instrukcji. Problemem nie jest wykrycie, czy zapytanie się powiedzie (to proste), problem polega na upewnieniu się, że komunikat o błędzie nie należy do poprzedniego zapytania.O ile czegoś nie brakuje, twój kod nie robi nic, aby to rozwiązać. –
W tym podejściu możemy wykryć, czy wiadomość arror z poprzedniej instrukcji, czy nie. Na przykład powiedzmy, że wykonujemy trzy zapytania. Pierwszy z nich się powiódł, drugi się nie powiedzie i zwraca "komunikat o błędzie 1". I trzecia także nie zwraca "wiadomość o błędzie 1". Dzięki temu podejściu możemy się dowiedzieć, że "komunikat o błędzie 1" należy do zapytania 2. – isa