thinkphp中串連oracle時封裝方法無法用的解決辦法

來源:互聯網
上載者:User

最近收集了一些關於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等等。

串連mysql或許沒有問題,但是在oracle中,封裝的方法無法調用時,一定要在model層中加入欄位的定義。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.