It seems in 4.3 (and probably other versions), if you call OCIError twice it will fail on the second time (with an empty array). This used to work on previous versions but no longer.
So my prior example of doing if (OCIError won't work and you have to do it like the other contributed example:
$r = @OCIExecute($selectw,OCI_DEFAULT);
if (!$r)
{
$erra=OCIError($selectw);
print "Error: ${erra['code']} ${erra['message']}";
}
oci_error
(PHP 5, PECL oci8 >= 1.1.0)
oci_error — Liefert den letzten Fehler
Beschreibung
Liefert den zuletzt gefundenen Fehler.
Parameter-Liste
- source
-
Der Parameter ist, bei den meisten Fehlern, der am besten geeignete Ressourcen-Handler. Bei Verbindungsfehlern mit oci_connect(), oci_new_connect() oder oci_pconnect() keinen Parameter mitgeben.
Rückgabewerte
Wenn kein Fehler gefunden wurde, liefert oci_error() FALSE zurück. Ein Fehler wird von oci_error() als assoziatives Array zurückgegeben. In diesem Array enthält code den Oracle-Errorcode und message den Oracle-Fehlertext.
Changelog
| Version | Beschreibung |
|---|---|
| 4.3 | Im Rückgabe-Array sind nun offset und sqltext enthalten, die die Fehlerstelle anzeigen und den ursprünglichen SQL-Text, der den Fehler verusacht hat, beinhalten. |
Beispiele
Beispiel #1 Zeigt die Oracle-Fehlermeldung nach einem Verbindungsfehler an
$conn = @oci_connect("scott", "tiger", "mydb");
if (!$conn) {
$e = oci_error(); // Bei oci_connect-Fehler ohne Handler
echo htmlentities($e['message']);
}
Beispiel #2 Zeigt die Oracle-Fehlermeldung nach einem Parse-Error an
$stmt = @oci_parse($conn, "select ' from dual"); // Fehlerhafte Quottierung
if (!$stmt) {
$e = oci_error($conn); // Bei oci_parse-Fehler mit Verbindungs-Handler
echo htmlentities($e['message']);
}
Beispiel #3 Zeigt die Oracle-Fehlermeldung und das problematische Statement nach einem Ausführungsfehler
$r = oci_execute($stmt);
if (!$r) {
$e = oci_error($stmt); // Bei oci_execute-Fehler mit Statement-Handle
echo htmlentities($e['message']);
echo "<pre>";
echo htmlentities($e['sqltext']);
printf("\n%".($e['offset']+1)."s", "^");
echo "</pre>";
}
Anmerkungen
Hinweis: In der PHP-Versionen vor 5.0.0 muss man ocierror() benutzen. Den Namen kann man immer noch nutzen. Er wurde als Alias für oci_error() für die Abwärtskompatibilität erhalten. Dieses ist allerdings veraltet und wird nicht empfohlen.
oci_error
03-May-2004 06:45
04-Nov-2003 09:29
Here's an example of how to get the offset from an Oracle statement that errored:
<?
$conn = OCILogon ("user", "password", "database");
$statement = OCIParse ($conn, "select foo, bar from t1 where id = 1");
OCIExecute ($statement, OCI_DEFAULT);
$error = OCIError ($statement);
if ($error["offset"]) {
$sqltext = substr ($error["sqltext"], 0, $error["offset"]) .
'*' .
substr ($error["sqltext"], $error["offset"]);
echo $sqltext;
}
?>
Presuming the column "foo" doesn't exist in the table "t1", the above code will produce the following:
PHP Warning: OCIStmtExecute: ORA-00904: "FOO": invalid identifier
in test.php on line 7
select *foo, bar from table where id = 1
Note the asterisk next to the word "foo".
This example may seem overly simple, and the error location obvious, but when you have an enormous query, you'll quickly find this functionality very useful.
Daniel Ceregatti
