ThinkPHP 連接Oracle資料庫的詳細教程

来源:http://www.cnblogs.com/shouce/archive/2016/04/22/5419841.html
-Advertisement-
Play Games

一、 操作環境搭建系統:Windows7 旗艦版 64位PHP環境:wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24 32位版下載地址:http://www.wampserver.com/en/ ThinkPHP:3.0正式版下載地址:http://th ...


一、 操作環境搭建
系統: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,    下麵針對我上面的數據表寫出我的代碼:

我的Action是這樣的:UserAction.class.php。控制器我只對添加和查找做例子,因此代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 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等等。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2->3->4, you should return the list as 2->1->4->3. Your a ...
  • 1. 第一個問題:時間少了8小時 Log4j 輸出的日誌中,時間比系統時間少了8小時,但是 eclipse 控制台輸出的日誌的時間卻是對的。 log4j配置如下: 有一篇博客講了這個問題:http://peng4602.iteye.com/blog/1844356 但是按照他的方法,沒有作用。 原因 ...
  • json.dumps(datetime.now) 意思是datetime.now不可json序列化,解決辦法是轉化成str或者加一個參數 cls=xxx 詳細見: http://stackoverflow.com/questions/11875770/how-to-overcome-datetime ...
  • gcc
    gcc編譯源文件一步到位的命令就是 實際上這一步包含了四步: 1.預處理 預處理功能主要包括巨集定義,文件包含,條件編譯三部分。分別對應巨集定義命令,文件包含命令,條件編譯命令三部分實現。預處理過程讀入源代碼,檢查包含預處理指令的語句和巨集定義,並對源代碼進行響應的轉換。預處理過程還會刪除程式中的註釋和多 ...
  • 我們在處理文件、瀏覽網頁、編寫程式時,時不時會碰到亂碼的情況。亂碼幾乎總是令人心煩,讓人困惑。希望通過本節和下節文章,你可以自信從容地面對亂碼,恢復亂碼。 談亂碼,我們就要談數據的二進位表示,我們已經在前兩節談過整數和小數的二進位表示,接下了我們將討論字元和文本的二進位表示。 由於內容比較多,我們將 ...
  • 海洋CMS仿非凡影視電影網站整站源碼,響應式佈局,完美支持手機WAP+ipad+PC電腦版 海洋CMS仿非凡影視電影網站整站源碼,響應式佈局,完美支持手機WAP+ip<ignore_js_op> 源碼下載:http://code.662p.com/list/4_1.html 海洋CMS仿非凡影視電影 ...
  • 博主自己搗鼓的介面框架先到這裡 等工作上正式開始使用再後續完善需求 還是繼續學習python、學編程就直接動手寫 就想看看python+selenium的組合 什麼都不多說、先下載安裝 博主這裡已經安裝了pip 所以直接cmd進入python路徑下的Scripts文件目錄下 ...
  • python除了關鍵字(keywords)和內置的類型和函數(builtins),更多的功能是通過libraries(即modules)來提供的。 常用的libraries(modules)如下: 1)python運行時服務 * copy: copy模塊提供了對複合(compound)對象(list ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...