首先,我們知道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'????????????=>?'mysql', ???//?服務器地址 ???'hostname'????????=>?'127.0.0.1', ???//?數據庫名 ???'database'????????=>?'ray', ???//?用戶名 ???'username'????????=>?'root', ???//?密碼 ???'password'????????=>?'',?//?你的密碼 ???//?端口 ???'hostport'????????=>?'3306', ???//?連接dsn ???'dsn'?????????????=>?'', ???//?數據庫連接參數 ???'params'??????????=>?[], ???//?數據庫編碼默認采用utf8 ???'charset'?????????=>?'utf8', ???//?數據庫表前綴 ???'prefix'??????????=>?'ray_', ???//?數據庫調試模式 ???'debug'???????????=>?true, ???//?數據庫部署方式:0?集中式(單一服務器),1?分布式(主從服務器) ???'deploy'??????????=>?0, ???//?數據庫讀寫是否分離?主從式有效 ???'rw_separate'?????=>?false, ???//?讀寫分離后?主服務器數量 ???'master_num'??????=>?1, ???//?指定從服務器序號 ???'slave_no'????????=>?'', ???//?是否嚴格檢查字段是否存在 ???'fields_strict'???=>?true, ???//?數據集返回類型 ???'resultset_type'??=>?'array', ???//?自動寫入時間戳字段 ???'auto_timestamp'??=>?false, ???//?時間字段取出后的默認時間格式 ???'datetime_format'?=>?'Y-m-d?H:i:s', ???//?是否需要進行SQL性能分析 ???'sql_explain'?????=>?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'?=>?'updatename' ????]; ????$result?=?$obj_user->operateUser("update",$updateData,"1"); ????var_dump($result); ????//?新增 ????$insertData?=?[ ????????'user_name'?=>?'testname', ????????'user_pwd'?=>?'testpwd' ????]; ????$result?=?$obj_user->operateUser("insert",$insertData); ????var_dump($result); ????//?刪除 ????$result?=?$obj_user->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('user_id',$user_id)->find(); ????}?else?if($directive?==?"insert"?&&?$data?!=?null)?{ ????????return?User::save($data)???1?:?0; ????}?else?if($directive?==?"update"?&&?$data?!=?null?&&?$user_id?!=?null)?{ ????????return?User::where('user_id',$user_id)->find()->save($data)???1?:?0; ????}?else?if($directive?==?"delete"?&&?$user_id?!=?null)?{ ????????return?User::where('user_id',$user_id)->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'????????????=>?'thinkoracleConnection', ???//?服務器地址 ???'hostname'????????=>?'127.0.0.1', ???//?數據庫名 ???'database'????????=>?'orcl', ???//?用戶名 ???'username'????????=>?'Scott', ???//?密碼 ???'password'????????=>?'',?//?你的密碼 ???//?端口 ???'hostport'????????=>?'1521', ???//?連接dsn ???'dsn'?????????????=>?'', ???//?數據庫連接參數 ???'params'??????????=>?[], ???//?數據庫編碼默認采用utf8 ???'charset'?????????=>?'utf8', ???//?數據庫表前綴 ???'prefix'??????????=>?'ray_', ???//?數據庫調試模式 ???'debug'???????????=>?true, ???//?數據庫部署方式:0?集中式(單一服務器),1?分布式(主從服務器) ???'deploy'??????????=>?0, ???//?數據庫讀寫是否分離?主從式有效 ???'rw_separate'?????=>?false, ???//?讀寫分離后?主服務器數量 ???'master_num'??????=>?1, ???//?指定從服務器序號 ???'slave_no'????????=>?'', ???//?是否嚴格檢查字段是否存在 ???'fields_strict'???=>?true, ???//?數據集返回類型 ???'resultset_type'??=>?'array', ???//?自動寫入時間戳字段 ???'auto_timestamp'??=>?false, ???//?時間字段取出后的默認時間格式 ???'datetime_format'?=>?'Y-m-d?H:i:s', ???//?是否需要進行SQL性能分析 ???'sql_explain'?????=>?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->query->parseSqlTable($sql)).'"';?////?前后加上雙引號并將表明設置為大寫 ???} ...... ?????//?where子單元分析 ???protected?function?parseWhereItem($field,?$val,?$rule?=?'',?$options?=?[],?$binds?=?[],?$bindName?=?null) ???{ ???????//?字段分析 ???????$key?=?$field???'"'.?$this->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'?=>?"updateora", ????????????'PWD'?=>?"newpwd" ????????]; ????????$result?=?$obj_users->operateUser("update",$updateData,"1"); ????????var_dump($result); ????????//?插入 ????????$insertData?=?[ ????????????'NAME'?=>?'testname', ????????????'PWD'?=>?'testpwd' ????????]; ????????$result?=?$obj_users->operateUser("insert",$insertData); ????????var_dump($result); ????????//?刪除 ????????$result?=?$obj_users->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('ID',$ID)->find(); ????????}?else?if($directive?==?"insert"?&&?$data?!=?null)?{ ????????????/*$id?=?Users::getLastInsID('SEQUSERS')-2; ????????????var_dump($id); ????????????$data['ID']?=?$id;*/ ????????????return?Users::save($data,[],'SEQUSERS')???1?:?0;?//?注意這里傳參 ????????}?else?if($directive?==?"update"?&&?$data?!=?null?&&?$ID?!=?null)?{ ????????????return?Users::where('ID',$ID)->find()->save($data)???1?:?0; ????????}?else?if($directive?==?"delete"?&&?$ID?!=?null)?{ ????????????return?Users::where('ID',$ID)->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->linkID->query("select?{$sequence}.nextval?as?id?from?dual"); ????????$pdo????=?$this->linkID->query("select?{$sequence}.currval?as?id?from?dual"); ????????$result?=?$pdo->fetchColumn(); ????????$pdo????=?$this->linkID->query("alter?sequence?{$sequence}?increment?by?-1"); ????????$pdo????=?$this->linkID->query("select?{$sequence}.nextval?as?id?from?dual"); ????????$pdo????=?$this->linkID->query("alter?sequence?{$sequence}?increment?by?1"); ????????return?$result; ????}
以上內容僅供參考!
推薦教程:thinkphp教程
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦