概述
环境 Apache 2.4.7,PHP 5.5/5.4
Oracle扩展
extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client
extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client
php_pdo_oci.dll;php extension for oracle
注:从stackoverflow上查到,PHP_PDO_OCI是php官方开发的而且开源,PHP_OCI8(类似nysql的mysql和mydqli扩展)则是oracle开发的。PDO是php的数据库操作抽象层,而PHP_PDO_xxx是对应具体数据库的驱动。
如果是Linux可以用ldd 查看PHP_PDO_OCI是依赖哪个版本号的oci,可以安装对应版本号的instant client,并把instant client中oci对应的路径加到 LD_LIBRARY_PATH中。
不管oci8还是pdo都依赖Oracle32位客户端oci.dll文件运行下载
php运行模式 mod_php:即php作为apache的模块,将PHP做为web-server的子进程控制。
配置
如果php是CLI模式的话,可以将对应版本oci.dll放到php.exe同级目录下即可!!!
php的FPM模式没测试。
这里主要解决以mod_php模式,需要有一下扩展
可能会然后再php.ini文件中加入这些扩展,即将前面的 ; 去掉,如下图:
配置好后可能会报错提示:Unable to load dynamic library ‘php_oci8_11g.dll’ - %1 不是有效的 Win32 应用 的问题。
在apache的配置文件httpd.conf添加 LoadFile D:\app\lenovo\instantclient_11_2\instantclient_11_2\oci.dll即可,根据实际路径填写,不可把oci.dll单独拿出来,否则将连接失败,然后重启apache即可。有兴趣可以了解apache配置文件中各参数作用。
php连接
oci8连接
具体参考官方文档。
public function conn(){
$db_user_name='xxx;
$db_pwd='xxx';
$db_host_name='localhost:1521/FPF:DEDICATED';
$conn = oci_connect($db_user_name,$db_pwd,$db_host_name,'utf8');//oci_connect('asgr','asgr','localhost/ORCL');
if (!$conn) {
$e = oci_error();
print htmlentities($e['message']);
$arr_result['result'] = 'false';
echo json_encode($arr_result); //默认为不是黑名单
return;
}
else {
$stid = oci_parse($conn, 'SELECT * FROM test');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
}
}
pdo连接
public function pdo(){
$db_user_name='xxx';
$db_pwd='xxx';
$fpf ='(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = FPF)))';
$conn = new \PDO("oci:dbname=".$fpf,$db_user_name,$db_pwd);
try {
$pdostatement = $conn -> prepare ('select * from test where id =1') ;
$pdostatement->execute();
$list=$pdostatement->fetchall();
var_dump($list);
} catch (PDOException $e){
print_r($conn->errorInfo());
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
thinkphp的ORM连接
public function tpOracle(){
$connection = array(
'db_type' => 'oracle',
'db_user' => 'fpf',
'db_pwd' => 'fpf123456',
'db_host' => '127.0.0.1',
'db_port' => '1521',
'db_name' => 'FPF',
'db_charset' => 'utf8',
//'db_params' => array(), // 非必须
);
$m = M('Test',null,$connection);
$list=$m->select();
dump($list);
}
结果如下图: