>  기사  >  PHP 프레임워크  >  thinkphp5는 오라클을 지원하나요?

thinkphp5는 오라클을 지원하나요?

王林
王林원래의
2019-09-12 11:38:563512검색

thinkphp5는 오라클을 지원하나요?

우선, 우리는 PHP가 oracle을 완벽하게 지원한다는 것을 알고 있으며, PHP 프레임워크인 php5도 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

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

1 mysql 환경의 CURD 작업

데이터베이스 구성 데이터베이스.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 [
   // 数据库类型
   &#39;type&#39;            => &#39;mysql&#39;,
   // 服务器地址
   &#39;hostname&#39;        => &#39;127.0.0.1&#39;,
   // 数据库名
   &#39;database&#39;        => &#39;ray&#39;,
   // 用户名
   &#39;username&#39;        => &#39;root&#39;,
   // 密码
   &#39;password&#39;        => &#39;&#39;, // 你的密码
   // 端口
   &#39;hostport&#39;        => &#39;3306&#39;,
   // 连接dsn
   &#39;dsn&#39;             => &#39;&#39;,
   // 数据库连接参数
   &#39;params&#39;          => [],
   // 数据库编码默认采用utf8
   &#39;charset&#39;         => &#39;utf8&#39;,
   // 数据库表前缀
   &#39;prefix&#39;          => &#39;ray_&#39;,
   // 数据库调试模式
   &#39;debug&#39;           => true,
   // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
   &#39;deploy&#39;          => 0,
   // 数据库读写是否分离 主从式有效
   &#39;rw_separate&#39;     => false,
   // 读写分离后 主服务器数量
   &#39;master_num&#39;      => 1,
   // 指定从服务器序号
   &#39;slave_no&#39;        => &#39;&#39;,
   // 是否严格检查字段是否存在
   &#39;fields_strict&#39;   => true,
   // 数据集返回类型
   &#39;resultset_type&#39;  => &#39;array&#39;,
   // 自动写入时间戳字段
   &#39;auto_timestamp&#39;  => false,
   // 时间字段取出后的默认时间格式
   &#39;datetime_format&#39; => &#39;Y-m-d H:i:s&#39;,
   // 是否需要进行SQL性能分析
   &#39;sql_explain&#39;     => false,
];

컨트롤러 사용자 .php

<?php
namespace app\index\controller;

use think\Controller;
use app\index\model\User as US;

class User extends Controller
{
public function index() {
    $obj_user = new US;
    // 查找
    $data = $obj_user->operateUser("find",null,"1");
    var_dump($data);
    // 更新
    $updateData = [
        &#39;user_name&#39; => &#39;updatename&#39;
    ];
    $result = $obj_user->operateUser("update",$updateData,"1");
    var_dump($result);
    // 新增
    $insertData = [
        &#39;user_name&#39; => &#39;testname&#39;,
        &#39;user_pwd&#39; => &#39;testpwd&#39;
    ];
    $result = $obj_user->operateUser("insert",$insertData);
    var_dump($result);
    // 删除
    $result = $obj_user->operateUser("delete",null,&#39;2&#39;);
    var_dump($result);
}
}

Model User.php

<?php
namespace app\index\model;

use think\Model;

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" && $data != null) {
        return User::save($data) ? 1 : 0;
    } else if($directive == "update" && $data != null && $user_id != null) {
        return User::where(&#39;user_id&#39;,$user_id)->find()->save($data) ? 1 : 0;
    } else if($directive == "delete" && $user_id != null) {
        return User::where(&#39;user_id&#39;,$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 [
   // 数据库类型
   &#39;type&#39;            => &#39;\think\oracle\Connection&#39;,
   // 服务器地址
   &#39;hostname&#39;        => &#39;127.0.0.1&#39;,
   // 数据库名
   &#39;database&#39;        => &#39;orcl&#39;,
   // 用户名
   &#39;username&#39;        => &#39;Scott&#39;,
   // 密码
   &#39;password&#39;        => &#39;&#39;, // 你的密码
   // 端口
   &#39;hostport&#39;        => &#39;1521&#39;,
   // 连接dsn
   &#39;dsn&#39;             => &#39;&#39;,
   // 数据库连接参数
   &#39;params&#39;          => [],
   // 数据库编码默认采用utf8
   &#39;charset&#39;         => &#39;utf8&#39;,
   // 数据库表前缀
   &#39;prefix&#39;          => &#39;ray_&#39;,
   // 数据库调试模式
   &#39;debug&#39;           => true,
   // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
   &#39;deploy&#39;          => 0,
   // 数据库读写是否分离 主从式有效
   &#39;rw_separate&#39;     => false,
   // 读写分离后 主服务器数量
   &#39;master_num&#39;      => 1,
   // 指定从服务器序号
   &#39;slave_no&#39;        => &#39;&#39;,
   // 是否严格检查字段是否存在
   &#39;fields_strict&#39;   => true,
   // 数据集返回类型
   &#39;resultset_type&#39;  => &#39;array&#39;,
   // 自动写入时间戳字段
   &#39;auto_timestamp&#39;  => false,
   // 时间字段取出后的默认时间格式
   &#39;datetime_format&#39; => &#39;Y-m-d H:i:s&#39;,
   // 是否需要进行SQL性能分析
   &#39;sql_explain&#39;     => false,
];

3.

Oracle 테이블 이름과 필드 이름은 큰따옴표로 묶어야 하므로 thinkphplibrarydbBuilder.php의 구문 분석 테이블 및 구문 분석 항목 메서드가 다시 작성되었습니다. 재작성이 완료되면 해당 ID를 기준으로 레코드를 조회하고 확인합니다.

   ...
/**
    * 将SQL语句中的__TABLE_NAME__字符串替换成带前缀的表名(小写)
    * @access protected
    * @param string $sql sql语句
    * @return string
    */
   protected function parseSqlTable($sql)
   {
        return &#39;"&#39;. strtoupper($this->query->parseSqlTable($sql)).&#39;"&#39;; //// 前后加上双引号并将表明设置为大写
   }

......
     // where子单元分析
   protected function parseWhereItem($field, $val, $rule = &#39;&#39;, $options = [], $binds = [], $bindName = null)
   {
       // 字段分析
       $key = $field ? &#39;"&#39;. $this->parseKey($field, $options, true) .&#39;"&#39; : &#39;&#39;; ////前后加上双引号

       // 查询规则和条件
       if (!is_array($val)) {
           $val = is_null($val) ? [&#39;null&#39;, &#39;&#39;] : [&#39;=&#39;, $val];
       }
       list($exp, $value) = $val;
       ...

컨트롤러 및 모델 레이어 메서드를 다시 작성했습니다.


Controller Users.php

<?php
namespace app\index\controller;

use think\Controller;
use app\index\model\Users as US;

class Users extends Controller
{
    public function index() {
        // 查询
        $obj_users = new US;
        $data = $obj_users->operateUser("find",null,"1");
        var_dump($data);
        // 更新
        $updateData = [
            &#39;NAME&#39; => "updateora",
            &#39;PWD&#39; => "newpwd"
        ];
        $result = $obj_users->operateUser("update",$updateData,"1");
        var_dump($result);
        // 插入
        $insertData = [
            &#39;NAME&#39; => &#39;testname&#39;,
            &#39;PWD&#39; => &#39;testpwd&#39;
        ];
        $result = $obj_users->operateUser("insert",$insertData);
        var_dump($result);
        // 删除
        $result = $obj_users->operateUser("delete",null,&#39;18&#39;);
        var_dump($result);
    }
}

Model Users.php

<?php
namespace app\index\model;

use think\Model;

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" && $data != null) {
            /*$id = Users::getLastInsID(&#39;SEQUSERS&#39;)-2;
            var_dump($id);
            $data[&#39;ID&#39;] = $id;*/
            return Users::save($data,[],&#39;SEQUSERS&#39;) ? 1 : 0; // 注意这里传参
        } else if($directive == "update" && $data != null && $ID != null) {
            return Users::where(&#39;ID&#39;,$ID)->find()->save($data) ? 1 : 0;
        } else if($directive == "delete" && $ID != null) {
            return Users::where(&#39;ID&#39;,$ID)->delete() ? 1 : 0;
        } else {
            return null;
        }
    }
}

테스트 후 업데이트된 데이터가 통과되었으며 다음 단계는 가장 귀찮은 것 New. MySQL 기본 키는 A-I 속성을 PK에 추가하여 자동 증가할 수 있지만 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

/**
     * 获取最近插入的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;
    }
에서 getLastInsId() 메소드를 다시 작성해야 합니다. 위 내용은 참고용입니다!

추천 튜토리얼:

thinkphp 튜토리얼

위 내용은 thinkphp5는 오라클을 지원하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.