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