thinkphp5支持oracle嗎

thinkphp5支持oracle嗎

首先,我們知道php是完全支持oracle的,那么作為php框架的thinkphp5也是完全可以支持oracle的。

thinkphp5如何連接oracle?

數據庫:ray

表的結構:ray_user

CREATE?TABLE?IF?NOT?EXISTS?ray_user?( user_id?int(11)?unsigned?NOT?NULL?AUTO_INCREMENT, user_name?varchar(10)?NOT?NULL, user_pwd?varchar(40)?NOT?NULL, PRIMARY?KEY?(user_id) )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8?AUTO_INCREMENT=18?;

轉存表中的數據:ray_user

立即學習PHP免費學習筆記(深入)”;

INSERT?INTO?ray_user?(user_id,?user_name,?user_pwd)?VALUES (1,?‘updatename’,?‘ray’), (2,?‘testname’,?‘testpwd’),

1、mysql環境下的CURD操作

數據庫配置database.php

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> //?+----------------------------------------------------------------------  return?[ ???//?數據庫類型 ???'type'????????????=&gt;?'mysql', ???//?服務器地址 ???'hostname'????????=&gt;?'127.0.0.1', ???//?數據庫名 ???'database'????????=&gt;?'ray', ???//?用戶名 ???'username'????????=&gt;?'root', ???//?密碼 ???'password'????????=&gt;?'',?//?你的密碼 ???//?端口 ???'hostport'????????=&gt;?'3306', ???//?連接dsn ???'dsn'?????????????=&gt;?'', ???//?數據庫連接參數 ???'params'??????????=&gt;?[], ???//?數據庫編碼默認采用utf8 ???'charset'?????????=&gt;?'utf8', ???//?數據庫表前綴 ???'prefix'??????????=&gt;?'ray_', ???//?數據庫調試模式 ???'debug'???????????=&gt;?true, ???//?數據庫部署方式:0?集中式(單一服務器),1?分布式(主從服務器) ???'deploy'??????????=&gt;?0, ???//?數據庫讀寫是否分離?主從式有效 ???'rw_separate'?????=&gt;?false, ???//?讀寫分離后?主服務器數量 ???'master_num'??????=&gt;?1, ???//?指定從服務器序號 ???'slave_no'????????=&gt;?'', ???//?是否嚴格檢查字段是否存在 ???'fields_strict'???=&gt;?true, ???//?數據集返回類型 ???'resultset_type'??=&gt;?'array', ???//?自動寫入時間戳字段 ???'auto_timestamp'??=&gt;?false, ???//?時間字段取出后的默認時間格式 ???'datetime_format'?=&gt;?'Y-m-d?H:i:s', ???//?是否需要進行SQL性能分析 ???'sql_explain'?????=&gt;?false, ];

控制器User.php

<?php namespace appindexcontroller;  use thinkController; use appindexmodelUser as US;  class User extends Controller { public function index() {     $obj_user = new US;     // 查找     $data = $obj_user->operateUser("find",null,"1"); ????var_dump($data); ????//?更新 ????$updateData?=?[ ????????'user_name'?=&gt;?'updatename' ????]; ????$result?=?$obj_user-&gt;operateUser("update",$updateData,"1"); ????var_dump($result); ????//?新增 ????$insertData?=?[ ????????'user_name'?=&gt;?'testname', ????????'user_pwd'?=&gt;?'testpwd' ????]; ????$result?=?$obj_user-&gt;operateUser("insert",$insertData); ????var_dump($result); ????//?刪除 ????$result?=?$obj_user-&gt;operateUser("delete",null,'2'); ????var_dump($result); } }

模型User.php

<?php namespace appindexmodel;  use thinkModel;  class User extends Model { public function operateUser($directive,$data = null,$user_id = null) {     if($directive == "find" && $user_id != null) {         return User::where(&#39;user_id&#39;,$user_id)->find(); ????}?else?if($directive?==?"insert"?&amp;&amp;?$data?!=?null)?{ ????????return?User::save($data)???1?:?0; ????}?else?if($directive?==?"update"?&amp;&amp;?$data?!=?null?&amp;&amp;?$user_id?!=?null)?{ ????????return?User::where('user_id',$user_id)-&gt;find()-&gt;save($data)???1?:?0; ????}?else?if($directive?==?"delete"?&amp;&amp;?$user_id?!=?null)?{ ????????return?User::where('user_id',$user_id)-&gt;delete()???1?:?0; ????}?else?{ ????????return?null; ????} } }

2、oracle環境下的CURD操作

數據庫配置文件database.php

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> //?+----------------------------------------------------------------------  return?[ ???//?數據庫類型 ???'type'????????????=&gt;?'thinkoracleConnection', ???//?服務器地址 ???'hostname'????????=&gt;?'127.0.0.1', ???//?數據庫名 ???'database'????????=&gt;?'orcl', ???//?用戶名 ???'username'????????=&gt;?'Scott', ???//?密碼 ???'password'????????=&gt;?'',?//?你的密碼 ???//?端口 ???'hostport'????????=&gt;?'1521', ???//?連接dsn ???'dsn'?????????????=&gt;?'', ???//?數據庫連接參數 ???'params'??????????=&gt;?[], ???//?數據庫編碼默認采用utf8 ???'charset'?????????=&gt;?'utf8', ???//?數據庫表前綴 ???'prefix'??????????=&gt;?'ray_', ???//?數據庫調試模式 ???'debug'???????????=&gt;?true, ???//?數據庫部署方式:0?集中式(單一服務器),1?分布式(主從服務器) ???'deploy'??????????=&gt;?0, ???//?數據庫讀寫是否分離?主從式有效 ???'rw_separate'?????=&gt;?false, ???//?讀寫分離后?主服務器數量 ???'master_num'??????=&gt;?1, ???//?指定從服務器序號 ???'slave_no'????????=&gt;?'', ???//?是否嚴格檢查字段是否存在 ???'fields_strict'???=&gt;?true, ???//?數據集返回類型 ???'resultset_type'??=&gt;?'array', ???//?自動寫入時間戳字段 ???'auto_timestamp'??=&gt;?false, ???//?時間字段取出后的默認時間格式 ???'datetime_format'?=&gt;?'Y-m-d?H:i:s', ???//?是否需要進行SQL性能分析 ???'sql_explain'?????=&gt;?false, ];

3、根據指定ID查詢記錄

由于Oracle表名和字段名均需加上雙引號,故改寫thinkphplibrarydbBuilder.php中的parseSqlTable和parseWhereItem方法。改寫完成后根據ID查詢記錄OK。

???... /** ????*?將SQL語句中的__TABLE_NAME__字符串替換成帶前綴的表名(小寫) ????*?@access?protected ????*?@param?string?$sql?sql語句 ????*?@return?string ????*/ ???protected?function?parseSqlTable($sql) ???{ ????????return?'"'.?strtoupper($this-&gt;query-&gt;parseSqlTable($sql)).'"';?////?前后加上雙引號并將表明設置為大寫 ???}  ...... ?????//?where子單元分析 ???protected?function?parseWhereItem($field,?$val,?$rule?=?'',?$options?=?[],?$binds?=?[],?$bindName?=?null) ???{ ???????//?字段分析 ???????$key?=?$field???'"'.?$this-&gt;parseKey($field,?$options,?true)?.'"'?:?'';?////前后加上雙引號  ???????//?查詢規則和條件 ???????if?(!is_array($val))?{ ???????????$val?=?is_null($val)???['null',?'']?:?['=',?$val]; ???????} ???????list($exp,?$value)?=?$val; ???????...

改寫了控制器和模型層方法:

控制器Users.php

<?php namespace appindexcontroller;  use thinkController; use appindexmodelUsers as US;  class Users extends Controller {     public function index() {         // 查詢         $obj_users = new US;         $data = $obj_users->operateUser("find",null,"1"); ????????var_dump($data); ????????//?更新 ????????$updateData?=?[ ????????????'NAME'?=&gt;?"updateora", ????????????'PWD'?=&gt;?"newpwd" ????????]; ????????$result?=?$obj_users-&gt;operateUser("update",$updateData,"1"); ????????var_dump($result); ????????//?插入 ????????$insertData?=?[ ????????????'NAME'?=&gt;?'testname', ????????????'PWD'?=&gt;?'testpwd' ????????]; ????????$result?=?$obj_users-&gt;operateUser("insert",$insertData); ????????var_dump($result); ????????//?刪除 ????????$result?=?$obj_users-&gt;operateUser("delete",null,'18'); ????????var_dump($result); ????} }

模型Users.php

<?php namespace appindexmodel;  use thinkModel;  class Users extends Model {     public function operateUser($directive,$data = null,$ID = null) {         if($directive == "find" && $ID != null) {             return Users::where(&#39;ID&#39;,$ID)->find(); ????????}?else?if($directive?==?"insert"?&amp;&amp;?$data?!=?null)?{ ????????????/*$id?=?Users::getLastInsID('SEQUSERS')-2; ????????????var_dump($id); ????????????$data['ID']?=?$id;*/ ????????????return?Users::save($data,[],'SEQUSERS')???1?:?0;?//?注意這里傳參 ????????}?else?if($directive?==?"update"?&amp;&amp;?$data?!=?null?&amp;&amp;?$ID?!=?null)?{ ????????????return?Users::where('ID',$ID)-&gt;find()-&gt;save($data)???1?:?0; ????????}?else?if($directive?==?"delete"?&amp;&amp;?$ID?!=?null)?{ ????????????return?Users::where('ID',$ID)-&gt;delete()???1?:?0; ????????}?else?{ ????????????return?null; ????????} ????} }

經測試更新數據通過,接下來是最為頭疼的新增。因為MySQL主鍵自增通過給PK添加A-I屬性即可,而Oracle則需要通過觸發器來實現。下面采用了簡單的實現方法。

觸發器,序列實現Oracle主鍵自增。

CREATE?OR?REPLACE?TRIGGER?TRIUSERS?BEFORE INSERT?ON?SCOTT.USERS?FOR?EACH?ROW WHEN?( new.id?is?null ??????) begin select?SEQUSERS.nextval?into:new.id?from?dual; end;  create?sequence?SEQUSERS minvalue?1 maxvalue?999999999999999999999999999 start?with?1 increment?by?1 nocache;

需要改寫think-oraclesrcConnection.php里面的getLastInsId()方法

/** ?????*?獲取最近插入的ID ?????*?@access?public ?????*?@param?string??$sequence?????自增序列名 ?????*?@return?string ?????*/ ????public?function?getLastInsID($sequence?=?null) ????{ ????????$pdo????=?$this-&gt;linkID-&gt;query("select?{$sequence}.nextval?as?id?from?dual"); ????????$pdo????=?$this-&gt;linkID-&gt;query("select?{$sequence}.currval?as?id?from?dual"); ????????$result?=?$pdo-&gt;fetchColumn(); ????????$pdo????=?$this-&gt;linkID-&gt;query("alter?sequence?{$sequence}?increment?by?-1"); ????????$pdo????=?$this-&gt;linkID-&gt;query("select?{$sequence}.nextval?as?id?from?dual"); ????????$pdo????=?$this-&gt;linkID-&gt;query("alter?sequence?{$sequence}?increment?by?1"); ????????return?$result; ????}

以上內容僅供參考!

推薦教程:thinkphp教程

以上就是thinkphp5支持

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享