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 — Retourne la dernière erreur Oracle
Description
Retourne la dernière erreur Oracle.
Liste de paramètres
- source
-
Pour la plupart des erreurs, le paramètre source représente une ressource de connexion. Pour les erreurs de connexion avec les fonctions oci_connect(), oci_new_connect() ou oci_pconnect(), ne passez aucun paramètre.
Valeurs de retour
Si aucune erreur n'est trouvée, oci_error() retourne FALSE. oci_error() retourne l'erreur sous la forme d'un tableau associatif. Dans ce tableau, l'élément code contient le numéro d'erreur Oracle et message contient le message d'erreur.
Historique
| Version | Description |
|---|---|
| 4.3 | offset et sqltext seront aussi incluses dans le tableau retourné, pour indiquer la position de l'erreur et la requête en cause. |
Exemples
Exemple #1 Exemple d'affichage d'un message d'erreur Oracle après une erreur de connexion
$conn = @oci_connect("scott", "tiger", "mydb");
if (!$conn) {
$e = oci_error(); // Pour les erreurs oci_connect, aucun paramètre n'est passé
echo htmlentities($e['message']);
}
Exemple #2 Exemple d'affichage d'un message d'erreur Oracle après une erreur d'analyse
$stmt = @oci_parse($conn, "select ' from dual"); // Notez l'erreur de guillemet
if (!$stmt) {
$e = oci_error($conn); // Pour les erreurs oci_parse, on passe la ressource de connexion
echo htmlentities($e['message']);
}
Exemple #3 Exemple d'affichage d'un message d'erreur Oracle après une erreur d'exécution
$r = oci_execute($stmt);
if (!$r) {
$e = oci_error($stmt); // Pour les erreurs oci_execute, on passe la ressource de traitement
echo htmlentities($e['message']);
echo "<pre>";
echo htmlentities($e['sqltext']);
printf("\n%".($e['offset']+1)."s", "^");
echo "</pre>";
}
Notes
Note: Dans les versions de PHP antérieures à la version 5.0.0, vous devez utiliser la fonction ocierror(). Cet ancien nom est toujours utilisable : un alias a été fait vers la fonction oci_error(), pour assurer la compatibilité ascendante. Toutefois, il est recommandé de ne plus l'utiliser.
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
