一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - thinkphp中連接oracle時封裝方法無法用的解決辦法

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

2020-04-16 14:20PHP教程網 PHP教程

本篇文章是對thinkphp中連接oracle時封裝方法無法用的解決方法進行了詳細的分析介紹,需要的朋友參考下

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

其實根據以前問題我做了幾天調試,找到了問題所在,并成功在我自己一個小項目練習中使用正常,那么現在就將我的經驗分享給大家。

1,數據庫的連接及配置文件的內容我就不說了, 上面已經做了解釋。我這里只根據一個數據表的例子來說明我的操作。
2,表結構如下:
thinkphp中連接oracle時封裝方法無法用的解決辦法
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> ]');
        }
}


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層中加入字段的定義。

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: gangbang日本 | 国产综合社区 | 娇妻与公陈峰姚瑶最新版 | 亚洲精品一区二区久久久久 | 日本三级斤| 高清不卡免费一区二区三区 | 欧美男同video| 日韩国产成人精品视频 | 亚洲人成网站在线观看青青 | 狠狠干2017| 欧美精品一区二区在线观看播放 | 久久精品一区二区三区资源网 | 九九99九九精彩网站 | 好大好硬好长好爽a网站 | 婷婷色伊人| 男女做污事 | 午夜久久久久久网站 | 亚洲第一色视频 | 青青青在线免费 | 91在线 一区 二区三区 | 日韩一区二区三区四区区区 | 摔跤成人黄版 | 国产久热香蕉在线观看 | 国产成人精品午夜在线播放 | 金发美女与黑人做爰 | 免费看一级a一片毛片 | 我被黑人彻底征服的全文 | 日本无遮挡吸乳视频看看 | 三级网站午夜三级 | 亚洲成在人线久久综合 | v视影院 | 日本护士handjob | 二次元美女互摸隐私互扒 | 18日本xxxxxxⅹxx96 | 白丝爆动漫羞羞动漫网站 | 欧美整片完整片视频在线 | 久久久久久免费高清电影 | 国产精品视频第一区二区 | 国产自拍啪啪 | 特级毛片免费视频观看 | 深夜免费在线视频 |