ID:               27672
 Updated by:       [EMAIL PROTECTED]
 Reported By:      powerblade at mail dot dk
-Status:           Open
+Status:           Assigned
 Bug Type:         Documentation problem
 Operating System: Windows XP
 PHP Version:      5CVS-2004-03-24 (dev)
 Assigned To:      tony2001


Previous Comments:
------------------------------------------------------------------------

[2004-03-24 11:01:13] [EMAIL PROTECTED]

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..

------------------------------------------------------------------------

[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?

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/27672

-- 
Edit this bug report at http://bugs.php.net/?id=27672&edit=1

Reply via email to