Details
-
Type:
Bug
-
Status:
Resolved
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: 2.0.0-BETA4
-
Fix Version/s: 2.0.0-RC1-RC3
-
Component/s: Drivers
-
Labels:None
-
Environment:PHP Version 5.3.3-1ubuntu9, OCI8 1.4.1, Oracle 10.2.0.4.0
Description
When I am trying to connect to Oracle instance with another charset then specified in my environment variable NLS_LANG I got an error.
$connectionOptions['oracle'] = array(
'driver' => 'oci8',
'dbname' => 'BOOK',
'user' => 'doctrine',
'password' => 'doctrine',
'charset' => 'AL32UTF8',
);
$em = EntityManager::create($connectionOptions['oracle'], $config, $evm);
$em->getConnection()->connect();
Produce error messages:
PHP Warning: oci_error() expects parameter 1 to be resource, boolean given in /www/test/doctrine2/vendor/dbal/lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php on line 149
PHP Fatal error: Uncaught exception 'Doctrine\DBAL\Driver\OCI8\OCI8Exception' in /www/test/doctrine2/vendor/dbal/lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php:42
There is bug in OCI8Connection::errorInfo() and ::errorCode(). When oci_connect failed, it returns a boolean - false. but oci_error() accepts only resource as parameter. Therefor it is neccessary to check, whether $this->_dbh is resource.
When I've fixed the error handling, I've got the right error, why I couldn't connect to Oracle:
PHP Fatal error: Uncaught exception 'Doctrine\DBAL\Driver\OCI8\OCI8Exception' with message 'ORA-12154: TNS:could not resolve the connect identifier specified' in /www/test/doctrine2/vendor/dbal/lib/Doctrine/DBAL/Driver/OCI8/OCI8Exception.php:28
That's because oci_connect accepts as connection string only TNS name, or Oracle Connection string. But ;charset=* in TNS name or connection string is invalid. oci_connect has 4th parameter charset for that purpose.
Fixed in https://github.com/milokmet/dbal/tree/DBAL-60