2016年12月8日 星期四

求php攻城屍在面對oracleDB時內心的陰影面積

前言

雖然小編寫php行之有年,而且最近還轉戰前端工程,但我還是沒有放棄php的~~~~(其實只是剛好專案需要)
在完全不知道要怎麼著手,大部分網路神人的教導又沒辦法完全解決問題的時候,真的很苦惱啊.......所以這邊就是我完成了連線並且成功取到資料的一篇筆記,先說小編完全不了解其運作原理,只知道怎麼做到,所以請各位鞭小力一點 = =

經過小編不怕死嘗試,就算library是12c,也一樣可以連線11g的版本

環境設定

所以直接無腦入門了,裝了appserv最新的版本,把php切換到7(appserv裡面有一支PHPVersion Switch可以做到切換,不然預設是跑php5)
(小編因為個人需求所以用appserv會簡單些,如果用習慣xampp或其他的也是可以,可以跑php就好)

切換好PHP版本後,開始修改php.ini,尋找oci,會找到
;extension = php_oci8_12c.dll
;extension = php_pdo_oci.dll
把前面的分號拿掉並儲存

instant client

只靠PHP原生的DLL是無法連線oracl的,需要而外引入dll,所以這時必須上oracle官網載instant client,因為windows的php目前只有32位元版,所以這裡也必須載32位元版,這時看你剛剛修改的php.ini檔內容可以知道你要抓哪個版本的instant client (小編這時是抓12版)。

下載完解壓縮在C:\,會有個資料夾叫 instantclient_12_1,根據網路上的說法,必須把這個資料夾設定在系統環境變數內,並重新啟動電腦。但小編試過,不知道為什麼總是出不來,模組無法讀取,出現錯誤訊息:call undefined function oci_connect()....。最後乾脆把資料夾內的東西全數複製到php\ext & apache\bin兩個資料夾中。然後apache restart就抓到oci_connect function了
(php連線測試程式碼會附在最後)


語系

可以連線後,小編又遇到一個問題,錯誤訊息:
ora-12705: cannot access nls data files or invalid environment specified 
上網看資料大概是語系問題吧,這時你必須知道oracle主機上 NLS_LANG 的設定是什麼
根據網友說法,開啟 regedit.exe 找到 HKEY/SOFTWARE/ORACLE 可以看到字串 NLS_LANG值為NA,直接刪掉他就好了
不知道是不是因為作業系統的關係,小編的路徑是HKEY/SOFTWARE/Wow6432Node/ORACLE,如果都找不到,直接ctrl+F找NLS_LANG也可以,小編也是這樣找到的。另外小編的解決方式是填入跟主機樣的的設定。
設定完之後記得重新啟動apache,然後你就會看到你畫面上出現success!
(主機是linux,只要下指令: unset NLS_LANG 似乎就可以解決,或是 set NLS_LANG=xxxxxxxx)

這時你必須取得host、port(預設1521)、SID(或SERVICE NAME、SERVER),當然還有帳號密碼。
因為要填寫connect string,詳細規格看PHP官網oracle官網就很清楚了
程式碼如下
<?php
$db = "(DESCRIPTION=
            (ADDRESS_LIST =
                (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xx.xx)(PORT = 1521))
            )
            (CONNECT_DATA=
                (SID=xxxx)
            )
        )";

$conn = oci_connect("user_id","password",$db);

if(!$conn){
    echo "db access error: ";
    print_r(oci_error());
    exit;
}
else
{
echo "success!";
}
?>

小結

跟網路上許多人隨隨便便就弄上3、5天甚至1、2個禮拜的人來說,小編算花很短的時間了,特別在主機又不是我可以輕易操作的情況下,小編還是活過來了,所以正在為oracle所苦的各位,一定可以撐過來。藉由這次機緣才了解到oracle真的是博大精深阿,據說還有db以外的用法,不過......有機會再來研究拉= =(逃) 還有它真的很貴= =一套破百萬來著,所以各位如果接到用oracle的案子,不要怕,盡量開價吧~~小編我就是沒有做好功課,亂開價嗚嗚~ ><"

另外提個小小的意外,我在取資料時,要輸出json,卻一直無法輸出,原來是json_encode不接受big5格式......所以必須自己寫程式去轉碼。好吧,這種小事情還是自己動手寫一支吧。

<?php
function convertEncoding($data) { 
return is_array($data)?
array_map(function($val){
return convertEncoding($val);
}, $data):
mb_convert_encoding($data, "UTF-8", "BIG-5"); 
}
?>

沒有留言:

張貼留言