1. 程式人生 > php教程 > ThinkPHP 連線Oracle資料庫的詳細教程(2)_PHP教程

ThinkPHP 連線Oracle資料庫的詳細教程(2)_PHP教程

最近收集了一些關於THinkPHP連線Oracle資料庫的問題,有很多朋友按照連線mysql的方法來操作,導致有一些方法在Oreale中無法正常使用。比如說:findAll,Select方法無法使用,獲取不到需要的資料。Create和add方法無法建立和寫入資料到資料庫中。

其實根據以前問題我做了幾天除錯,找到了問題所在,併成功在我自己一個小專案練習中使用正常,那麼現在就將我的經驗分享給大家。

1,資料庫的連線及配置檔案的內容我就不說了, 上面已經做了解釋。我這裡只根據一個數據表的例子來說明我的操作。

2,表結構如下:

ThinkPHP 連線Oracle資料庫的詳細教程(2)_PHP教程


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,    下面針對我上面的資料表寫出我的程式碼:

我的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> ]'); }}