ID: 27672
Updated by: [EMAIL PROTECTED]
Reported By: powerblade at mail dot dk
Status: Open
-Bug Type: *General Issues
+Bug Type: Documentation problem
Operating System: Windows XP
PHP Version: 5CVS-2004-03-24 (dev)
-Assigned To:
+Assigned To: tony2001
New Comment:
you need to pass $stmt to oci_error(); in this case.
so, your code will look like this:
<?
/* ... */
$query = 'XYZZYX'; /* Invalid SQL string */
$stmt = oci_parse($this->connection, $query);
$return = @oci_execute($stmt);
if($return === FALSE)
{
$aError = oci_error($stmt); //$stmt here
throw new DatabaseException("[".$aError['code']."] Can't execute
query. ".$aError['message']);
}
?>
Requalifying as documentation problem and assigning to myself..
Previous Comments:
------------------------------------------------------------------------
[2004-03-24 10:48:26] powerblade at mail dot dk
Not only the documentation.
See my #2.
-----
2) Where is the oracle error message in the exception? I need that
info
for debugging.
-----
If you look in the exception you get:
-----------------------
Fatal error: Uncaught exception 'DatabaseException' with message '[]
Can't execute query. ' in /www/index.php:31 Stack trace: #0 {main}
thrown in /www/index.php on line 31
--------------------------------
The oracle error message and code is not included in the exception.
Even though in the code it threw the exception with the following
statement:
throw new DatabaseException("[".$aError['code']."] Can't execute
query. ".$aError['message']);
The only way to grab the oracle error is to set up a custom error
handler. You can't use oci_error() to retrieve it.
------------------------------------------------------------------------
[2004-03-24 10:40:49] [EMAIL PROTECTED]
Aha, now I see...
It seems to me, that our manual lies about validation.
That's what OCI docs say about oci_parse (OciStmtPrepare() indeed):
--
An application requests a SQL or PL/SQL statement to be prepared for
execution using the OCIStmtPrepare() call and passing it a previously
allocated statement handle. This is a completely local call, requiring
no round trip to the server.
--
oci_parse will return false only if there is some problems with oracle
connection.
The only way to validate query is to execute it.
So, I need to change the documentation.
Right?
------------------------------------------------------------------------
[2004-03-24 10:24:09] powerblade at mail dot dk
Check your output.
1) The error was first detected by oci_execute(). oci_parse() didn't
detect the errornous SQL string.
2) Where is the oracle error message in the exception? I need that info
for debugging.
------------------------------------------------------------------------
[2004-03-24 08:28:48] [EMAIL PROTECTED]
Your code works fine for me.
It returns:
---
Warning: oci_execute() [function.oci-execute.html]: OCIStmtExecute:
ORA-00900: invalid SQL statement in /www/index.php on line 27
Fatal error: Uncaught exception 'DatabaseException' with message '[]
Can't execute query. ' in /www/index.php:31 Stack trace: #0 {main}
thrown in /www/index.php on line 31
---
>oci_parse() - Validates the SQL statement. However this always returns
true so it can't be trusted.
no, this is not true.
it does return false, if something went wrong.
>...and then use oci_error() to get the error, you don't get the error
string it outputs to the screen.
Please, re-check it twice.
This is false too.
And, please, provide more information about your system.
What version of Oracle & Oracle client do you use?
------------------------------------------------------------------------
[2004-03-24 08:14:22] powerblade at mail dot dk
Description:
------------
When executing a statement it goes as this:
oci_parse() - Validates the SQL statement. However this always returns
true so it can't be trusted.
oci_execute() - Executes the query. If anything goes wrong, it simply
outputs it to the screen. If you put a @ infront to avoid the warning
and then use oci_error() to get the error, you don't get the error
string it outputs to the screen.
Reproduce code:
---------------
$query = 'XYZZYX'; /* Invalid SQL string */
$stmt = oci_parse($this->connection, $query);
$aError = oci_error();
if($aError)
{
throw new DatabaseException("[".$aError['code']."] Can't parse
query. ".$aError['message']);
}
$return = oci_execute($stmt);
if($return === FALSE)
{
$aError = @oci_error();
throw new DatabaseException("[".$aError['code']."] Can't execute
query. ".$aError['message']);
}
Expected result:
----------------
Uncaught exception with the string:
[error code] Can't parse query. [error msg]
or
[error code] Can't execute query. [error msg]
Actual result:
--------------
Uncaught exception with the string:
[] Can't execute query []
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=27672&edit=1