Solar连接Oracle存在的问题!
前段时间朋友@东疯 使用Solar连接Oracle,死活都连不上,搞了好久天,所以我也找时间研究了下。看这里:http://wiki.oracle.com/page/PHP+Oracle+FAQ。使用PDO连接Oracle:
try { $dbh = new PDO('oci:dbname=myhost/XE', 'myusername', 'mypassword'); } catch (PDOException $e) { trigger_error("Could not connect to database: ". $e->getMessage(), E_USER_ERROR); }
有三种合法字符串:
- 简易连接
$c = oci_connect('myusername', 'mypassword', 'mymachine.mydomain/MYDB'); $d = new PDO('oci:dbname=myhost/XE', 'myusername', 'mypassword'); //或 $c = oci_connect('myusername', 'mypassword', '127.0.0.1/XE'); $d = new PDO('oci:dbname=127.0.0.1/XE', 'myusername', 'mypassword');
- 一个用户选择的网络服务名通常用来识别的数据库连接。
$c = oci_connect('myusername', 'mypassword', 'MYDB'); $d = new PDO('oci:dbname=MYDB', 'myusername', 'mypassword');
tnsnames.ora文件内容
MYDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.mydomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = MYDB) ) )
- 如果简单连接方法被禁用了,你使用的又是Oracle 8i或9i库,你可以这样做。
$db = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST = mymachine.mydomain)(PORT=1521)) (CONNECT_DATA=(SERVER=DEDICATED) (SERVICE_NAME=MYDB)))"; $c = oci_connect('myusername', 'mypassword', $db); $d = new PDO("oci:dbname=$db", 'myusername', 'mypassword');
看到了吧?这和PHP的PDO连接方式很不一样,所以Solar的Sql\_Oracle\_Adapter类的\_buildDsn应该修改一下:
$info = array( 'host' => '192.168.1.118', 'port' => '1521', 'name' => 'pzblog', // the service id 'user' => 'root', // authenticate as this user 'pass' => '123456', // authenticate with this password ); class Solar_Sql_Adapter_Oracle { protected $_pdo_type = 'oci'; protected function _buildDsn($info) { $dsn = array(); if (! empty($info['host'])) { $dsn[] = 'dbname=//' . $info['host']; } if (! empty($info['port'])) { $dsn[] = ':' . $info['port']; } if (! empty($info['name'])) { $dsn[] = '/' . $info['name']; } return $this->_pdo_type . ':' . implode('', $dsn); } }