一、 作業環境搭建
系統:Windows7 旗艦版 64位
PHP環境:wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24 32位版
:http://www.wampserver.com/en/
ThinkPHP:3.0正式版
:http://thinkphp.cn/down.html
Oracle:Orcale_11gR2 32位版
:http://www.oracle.com/technetwork/cn/indexes/downloads/index.html
資料庫操作工具:PLSQL Developer 32位
:http://www.allroundautomations.com/plsqldev.html
開發工具:NetBeans IDE 7.1.2
:http://netbeans.org/downloads/index.html 下載單PHP的版本即可
說明:這裡我反覆強調軟體的“位”,是因為這個很重要,一般情況下,我們系統是64位的,那麼最好軟體也用64位的,但是這裡除過系統外,全部選擇32位是有原因的,目的是為了配合PLSQL Developer和WAMP的PHP擴充。因為PLSQL Developer沒有64位版。有的朋友說用64位Oracle資料庫,裝32位用戶端就行,我不想這樣做,如果不喜歡我的操作方式,可以繞道。當然了,如果你不使用PLSQL Developer,而選擇使用Oracle 內建的SQL Developer,那麼你全安裝64位或32都是你自己的事。PHP串連Oracle資料庫需要開啟相應的擴充,這個擴充也需要資料庫用戶端的支援,因為php擴充也需要對應資料庫用戶端的位元。囉嗦完畢。
二、 環境配置
1, 作業系統的安裝我就不說了,Oracle安裝自己解決,NetBeans IDE 7.1.2也自己解決。
2, Wamp的安裝我也不說了,不會的直接從DOS開始重新學習吧。
3, WAMP會把PHP的網頁檔案夾定義在安裝wamp的檔案夾下的www裡面,我是安裝在D盤,所以就是D:\WAMP\www。我們暫時不做別的自訂修改。啟動wamp,系統托盤表徵圖為綠色表示啟動OK。
4, 開啟localhost,看到如下介面,表示環境配置基本OK。為什麼是基本了,因為還沒有對Oracle的配置進行設定。
5, 開啟的PHP擴充菜單,在綠色表徵圖上,左鍵->PHP->PHP擴充,點擊php-oci8的擴充,這時候這個WAMP會重啟,等待重啟後變綠,就表示OK。
6, 再次開啟剛才的localhost頁面,如果找到4的顯示,就表示目前PHP已經支援Oracle了。
注意,我現在用的 wamp和oracle用戶端都是32位,如果其中一個是64位,那麼這個oci的擴充時打不開的,同時自動環境監測頁面也沒有oci8的顯示。在不使用PL/SQL的前提下,必須是32位Oracle和32位WAMP搭配,64位Oracle和64位WAMP搭配,else請繞道。
三、 ThinkPHP配置
1, 把下載好的3.0正式版解壓,項目中只需要ThinkPHP檔案夾,這是核心。
2, 使用IDE建立一個項目,項目的檔案夾為剛才的Wamp下的www檔案夾,如果個人需要自訂別的檔案夾,需要修改apache的設定檔,這裡我不修改。
3, 將Thinkphp檔案夾拷貝到專案檔夾中,建立一個php檔案,命名index.php。
4, IDE中已經有這些檔案的顯示了,開啟index.php,編寫如下內容:
複製代碼 代碼如下:<?php
define('APP_DEBUG', true);
require './ThinkPHP/ThinkPHP.php';
5, 在瀏覽器中開啟localhost/項目名/index.php,Thinkphp會幫你產生好相關檔案和檔案夾。
6, 對設定檔進行操作,找到:Conf檔案夾下config.php檔案,修改如下:複製代碼 代碼如下:<?php
return array(
'DB_TYPE' => 'Oracle', // 資料庫類型
'DB_HOST' => '192.168.0.8', // 伺服器位址
'DB_NAME' => 'orcl', // 資料庫名
'DB_USER' => 'test', // 使用者名稱
'DB_PWD' => 'test', // 密碼
'DB_PORT' => '1521', // 連接埠
);
Oracle資料庫和mysql 的結構不同,一般預設安裝的資料庫名是orcl,如果你使用了多個資料庫監聽,那麼就要根據具體的監聽欄位來設定。比如:我本機資料庫堅挺是Orcl,同時監聽另外一個外網的資料庫,監聽字串為Orcl2,那麼如果你需要串連這個外網資料庫,那麼需要寫的資料庫名就是orcl2。
7, 經過以上的配置,是已經可以串連oracle資料庫了,但是在thinkphp的實際操作中有什麼注意的地方,且接著往下看。
最近收集了一些關於THinkPHP串連Oracle資料庫的問題,有很多朋友按照串連mysql的方法來操作,導致有一些方法在Oreale中無法正常使用。比如說:findAll,Select方法無法使用,擷取不到需要的資料。Create和add方法無法建立和寫入資料到資料庫中。
其實根據以前問題我做了幾天調試,找到了問題所在,並成功在我自己一個小項目練習中使用正常,那麼現在就將我的經驗分享給大家。
1,資料庫的串連及設定檔的內容我就不說了, 上面已經做瞭解釋。我這裡只根據一個資料表的例子來說明我的操作。
2,表結構如下:
3,這個表中有3個欄位,ID主鍵,使用者名稱username和密碼password,因為oracle資料庫把表名和欄位都是轉成大寫的,同時不支援ID主鍵自增,我只有使用另外的方法來實現這個功能,比如:ID自動序列+觸發器實現ID自增。
4, ThinkPHP中,Action是控制器,Model是模型,視圖是以模板方式體現的。
首先,說控制器,我只做增加和擷取列表的方法介紹。
其次,說模型,這裡才是成功的主要原因。為什嗎?ThinkPHP是有欄位對應的,這個在對MYSQL的支援非常完美,基本不用寫MODEL,但是對ORALCE就不行了,當使用M->add()來添加資料時,欄位會被$this->_facade()方法過濾掉。這樣產生的SQL語句就是沒法執行的,肯定是錯誤的,導致資料添加不到資料庫中,那麼使用select()方法也是一樣被過濾。
再次,當我單步調試時,斷點被過濾的時候,過濾方法使用到了new出來的MODEL,這個MODEL會有一個欄位對應的數組在裡面,這個過濾方法就是和這個欄位數組進行對比,如果不一致就過濾掉,結果我調試發現,new出來的MODEL根本沒有把欄位對應加進去,數組直接為空白,當然就沒法和添加的資料欄位一一對應了。這就是錯誤的關鍵。
下面就來說解決方案,其實很簡單,按照基本的MVC結構,不管是PHP還是JAVA還是.NET都有這樣的結構,那麼按照嚴格的標準,MODEL層的代碼是必須寫的,就是要和資料庫的欄位做映射。但是很多用mysql的,就直接沒有去寫MODEL裡面的代碼。這種習慣被用到了oracle中,就出了問題。
5, 下面針對我上面的資料表寫出My Code:
我的Action是這樣的:UserAction.class.php。控制器我只對添加和尋找做例子,因此代碼如下:
複製代碼 代碼如下:public function index() {
header("Content-Type:text/html; charset=utf-8");
$M_User = new UserModel();
$User_List = $M_User->select();
$this->assign('Title', '使用者管理');
$this->assign('UserList', $User_List);
$this->display();
}
//添加使用者提交處理
public function Create_Post() {
$M_User = new UserModel();
$data['username'] = $this->_post('username');
$data['password'] = md5($this->_post('pwd'));
if ($M_User->create()) {
$Query_Result = $M_User->add($data);
if (false !== $Query_Result) {
$this->success('使用者添加成功');
} else {
$this->error('使用者添加錯誤');
}
} else {
header("Content-Type:text/html; charset=utf-8");
exit($M_User->getError() . ' [ <a href="javascript:history.back()">返 回</a> ]');
}
}
Action解釋:
$M_User=new UserModel();
這個方法最好這麼寫,因為做.NET的原因,一直都這麼寫的。針對具體的模型進行執行個體化,嚴格規定我就要對User表進行操作了。
擷取POST資料的代碼就不多解釋了。
$M_User->create();
這是ThinkPHP的一個方法,很好,可以幫你過濾掉非法的東西,建議使用。
$Query_Result = $M_User->add($data);
這一段就是資料的添加,我習慣指定要添加的資料,也是因為這一段需要根據$M_User執行個體化,並過濾欄位。當然了,我們只要做好MODEL的代碼,就不會有問題。下面的代碼就不解釋。官方文檔都有。
我的Model是這樣的:UserModel.class.php
protected $fields = array( 'id', 'username', 'password' );
Model解釋:這才是重點,這有這樣,new出來的$M_User的映射欄位數組才不會為空白,這樣才能和POST的資料進行對應,才會讓過濾方法正常識別,不被過濾。
6,經過了以上的操作,針對Oracle的資料庫操作就完成了,我現在也可以任意使用ThinkPHP提供的方法來操作資料了,包括分頁(limit),find(),findAll等等。
出處 http://www.cnblogs.com/aceliu/