您好,登錄后才能下訂單哦!
無法thinkphp中連接oracle如何解決?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
表結(jié)構(gòu)如下:
這個表中有3個字段,ID主鍵,用戶名username和密碼password,因為oracle數(shù)據(jù)庫把表名和字段都是轉(zhuǎn)成大寫的,同時不支持ID主鍵自增,我只有使用另外的方法來實現(xiàn)這個功能,比如:ID自動序列+觸發(fā)器實現(xiàn)ID自增。
ThinkPHP中,Action是控制器,Model是模型,視圖是以模板方式體現(xiàn)的。
首先,說控制器,我只做增加和獲取列表的方法介紹。
其次,說模型,這里才是成功的主要原因。為什么?ThinkPHP是有字段映射的,這個在對MYSQL的支持非常完美,基本不用寫MODEL,但是對ORALCE就不行了,當使用M->add()來添加數(shù)據(jù)時,字段會被$this->_facade()方法過濾掉。這樣生成的SQL語句就是沒法執(zhí)行的,肯定是錯誤的,導致數(shù)據(jù)添加不到數(shù)據(jù)庫中,那么使用select()方法也是一樣被過濾。
再次,當我單步調(diào)試時,斷點被過濾的時候,過濾方法使用到了new出來的MODEL,這個MODEL會有一個字段映射的數(shù)組在里面,這個過濾方法就是和這個字段數(shù)組進行對比,如果不一致就過濾掉,結(jié)果我調(diào)試發(fā)現(xiàn),new出來的MODEL根本沒有把字段映射加進去,數(shù)組直接為空,當然就沒法和添加的數(shù)據(jù)字段一一對應(yīng)了。這就是錯誤的關(guān)鍵。
下面就來說解決方法,其實很簡單,按照基本的MVC結(jié)構(gòu),不管是PHP還是JAVA還是.NET都有這樣的結(jié)構(gòu),那么按照嚴格的標準,MODEL層的代碼是必須寫的,就是要和數(shù)據(jù)庫的字段做映射。但是很多用mysql的,就直接沒有去寫MODEL里面的代碼。這種習慣被用到了oracle中,就出了問題。
5,下面針對我上面的數(shù)據(jù)表寫出我的代碼:
我的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的原因,一直都這么寫的。針對具體的模型進行實例化,嚴格規(guī)定我就要對User表進行操作了。
獲取POST數(shù)據(jù)的代碼就不多解釋了。
復制代碼 代碼如下:
$M_User->create();
這是ThinkPHP的一個方法,很好,可以幫你過濾掉非法的東西,建議使用。
復制代碼 代碼如下:
$Query_Result = $M_User->add($data);
這一段就是數(shù)據(jù)的添加,我習慣指定要添加的數(shù)據(jù),也是因為這一段需要根據(jù)$M_User實例化,并過濾字段。當然了,我們只要做好MODEL的代碼,就不會有問題。下面的代碼就不解釋。官方文檔都有。
我的Model是這樣的:UserModel.class.php
復制代碼 代碼如下:
?protected $fields = array(
'id', 'username', 'password'
);
Model解釋:這才是重點,這有這樣,new出來的$M_User的映射字段數(shù)組才不會為空,這樣才能和POST的數(shù)據(jù)進行對應(yīng),才會讓過濾方法正常識別,不被過濾。
6,經(jīng)過了以上的操作,針對Oracle的數(shù)據(jù)庫操作就完成了,我現(xiàn)在也可以任意使用ThinkPHP提供的方法來操作數(shù)據(jù)了,包括分頁(limit),find(),findAll等等。
連接mysql或許沒有問題,但是在oracle中,封裝的方法無法調(diào)用時,一定要在model層中加入字段的定義。
看完上述內(nèi)容,你們掌握無法thinkphp中連接oracle如何解決的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。