php封装操作oracle数据类(单例模式)原创

原创
小哥 3年前 (2022-11-11) 阅读数 341 #PHP
文章标签 PHP

说实话mysql使用习惯,然后是整个oracle我真的不习惯。为了避免重复制造轮子,请在此处进行记录。方便以后复制,也希望能帮助有需要的小伙伴。

php 操作oracle数据库类

connect();
    }

    /**
     * @return 获取受影响的行数
     */
    public function getAffectRows(){
        return oci_num_rows($this->stmt);
    }

    /**
     * 获取错误报告提示信息
     * @return
     */
    public function getMessage(){
        return $this->message;
    }

    public function connect(){
        //$tmp_config = $this->configs;
        $this->conn = oci_connect(self::$username,self::$password,self::$connstr,self::$charset);
        if(!$this->conn){
            $this->message = oci_error();
        }
        return $this->conn;
    }

    /**
     * 获取数据库对象
     * @return PhpOci
     */
    public static function getInstance($config=[]){
        if(!empty($config))
        {
            self::$username=$config[username];
            self::$password=$config[password];
            self::$connstr=$config[connstr];
            self::$charset=$config[charset];
        }
        if(self::$instance == false) {
            self::$instance =new self;
        }
        return self::$instance;
    }

    function create_table($sql)
    {
        $this->stmt = oci_parse($this->conn, $sql);
        oci_execute($this->stmt);
        return true;
    }

    function drop_table($sql)
    {
        $this->stmt = oci_parse($this->conn, $sql);
        oci_execute($this->stmt);
        //echo $this->conn . " dropped table

"; return true; }

    function insert_data($sql)
    {
        $this->stmt = oci_parse($this->conn, $sql);
        oci_execute($this->stmt, OCI_DEFAULT);
    }

    function commit()
    {
        oci_commit($this->conn);
    }

    function rollback()
    {
        oci_rollback($this->conn);
    }
    /**
     * 获取数据库数据
     * 返回一个二维数组...
     * @param $sql
     * @return array
     */
    public function findAll($sql)
    {
        $data =[];
        $this->stmt = oci_parse($this->conn, $sql);
        oci_execute($this->stmt, OCI_DEFAULT);
        while(($row = oci_fetch_assoc($this->stmt)) != false) {
            $data[] = $row;
        }
        return $data;
    }

    /***
     * 查询一条数据 返回一维数组
     * @param $sql
     * @return array|mixed
     */
    public function findOne($sql)
    {
        $data =[];
        $this->stmt = oci_parse($this->conn, $sql);
        oci_execute($this->stmt, OCI_DEFAULT);
        while(($row = oci_fetch_assoc($this->stmt)) != false) {
            $data[] = $row;
        }
        if(!empty($data))
        {
            $data = $data[0];
        }

        return $data;
    }

    /**
     * 自动插入数据库语句 拼凑sql
     * @param $data
     * @param $table
     * @return bool
     */
    public function autoInsert($data,$table) {
//      insert into 表名 (字段1,字段2,字段N) values (值1,值2,值N)
//      $data = array(
//          字段1=>值1,
//          字段2=>值2,
//          字段3=>值3,
//      );
        //拼凑insert表名
        $sql = "insert into ".$table." ";

        //Patchwork字段列表部分
        $fields = array_keys($data);//获取所有密钥
        $fields = array_map(function($v){return $v;}, $fields);//用反引号将字段名括起来
        $fields_str = implode(, , $fields);//使用逗号连接
        $sql .= ( . $fields_str . );

        //修补工作值列表部分
        $values = array_map(function($v) {return "".$v."";}, $data);//获取所有值,增加引号中的值
        $values_str = implode(, , $values);//再次使用逗号连接
        $sql .=  values ( . $values_str . );
        //执行该insert语句
        try{
            $this->stmt = oci_parse($this->conn, $sql);
            oci_execute($this->stmt, OCI_DEFAULT);
            $this->commit();
            return true;
        }catch(Exception $e){
            $this->rollback();
            return false;
        }
        //echo $this->conn . " inserted hallo

";

    }

    /**
     * @param $table   要更新的表
     * @param $data    要更新的数据[fields=>value,...]
     * @param $id      根据哪些字段更新  如 id,rowid   要包括的字段$data中
     * @return string  返回成功执行
     */
    public function autoUpdate($table,$data,$id=id){
        $str = "";
        $pk_value = ;
        if(!empty($data)){
            if(isset($data[$id])){
                $pk_value = $data[$id];
                unset($data[$id]);
            }
            foreach($data as $k=>$v){
                $str .= "$k="."".$v."".",";
            }
            $str = substr($str,0,-1);
        }
        $sql="update {$table} set ".$str." where {$id}=".$pk_value."";
        //执行该insert语句
        try{
            $this->stmt = oci_parse($this->conn, $sql);
            oci_execute($this->stmt, OCI_DEFAULT);
            $this->commit();
            return true;
        }catch(Exception $e){
            $this->rollback();
            return false;
        }
    }

    // 调用存储过程函数

    /**
     * @
     * @param $procName 调用存储过程名称
     * @param array $params 输入参数
     * @param array $bindParams 绑定输出参数
     * @return array  code =1 表示成功  其他人则表示失败
     */
    public function callProcedure($procName,$params=[],$bindParams=[]){
        $result = [
            code=>0, //0 表示失败 1 表示成功
            message=>失败,
            output=>[]
        ];
        if($procName == ""){return $result;}
        try{
            $sql = "BEGIN ".$procName."(";
            if(!empty($params))
            {
                foreach ($params as $k=>$v)
                {
                    //拼凑 入参
                    $sql.="{$k}=>{$v},";
                }
            }
            if(!empty($bindParams))
            {
                foreach ($bindParams as $v)
                {
                    //$$v[key] = "";
                    $sql .= "{$v[value]}=>:".$v[value].",";
                }
            }
            $sql = substr($sql,0,strlen($sql)-1)."); END;";
            //var_dump($sql);//exit;
            $this->stmt = OCIParse($this->conn, $sql);//执行绑定
            if(!empty($bindParams))
            {
                foreach ($bindParams as $v)
                {
                    $_key=ex_.$v[key]; //定义输出参数变量 为了避免变量冲突 增加变量前缀
                    $$_key = ;
                    OCIBindByName($this->stmt, ":".$v[value], $$_key ,$v[length]);
                }
            }
            OCIExecute($this->stmt); //结果执行
            if(!empty($bindParams))
            {
                foreach ($bindParams as $v)
                {
                    //获取输出参数结果
                    $_key=ex_.$v[key];
                    $result[output][$v[key]]=$$_key;
                }
            }
            $result[code]=1;
            $result[message]="成功了!";
        }catch(Exception $ex){
            $result[message] = "失败了!".$ex->getMessage();
            $result[code] = 0;
        }
        return $result;
    }

    //释放连接
    public function __destruct(){
        oci_free_statement($this->stmt);
        oci_close($this->conn);
    }

}

调用方法

public function test_change_db()
     {
        // 定义数据连接配置参数
         $config=[
             username=>scott,
             password=>scott,
             connstr=>10.87.230.223/orcl,
             charset=>UTF8
         ];
         $db = JzylbInterfaceTest::getInstance($config);
         $sql = "select  username,ddd. authstr from hr_user ddd where id=10 ";
         $rest = $db->findAll($sql);
         var_dump($rest);exit;
     }

效果

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除