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 分享