+1

Usando o Oracle no Debian + classe em PHP5

criado por Roberta Brandão em 05/05/2011 7:01pm
Devido a grande necessidade de usar o Oracle x Debian x PHP, montei o passo a passo abaixo com exemplos práticos que uso no meu trabalho. Isso ocorreu ao decobrir que os pacotes de instalação do Oracle só funciona em ambiente gráfico. Então, usei o Instant Client (open source) do banco de dados Oracle for Debian.

Para usar o Oracle no Debian façam o seguinte:

1)Faça o download do oracle-instantclient-foo.rpm do site da oracle.
2)Converta o pacote para Debian: alien oracle-instantclient-foo.rpm

3)Instale o package:
dpkg -i oracle-instantclient-foo.deb

4)Ative o oci8 no php e:

Pronto!

Para conectar no oracle pelo php, pode usar a classe que montei:

ora.class.php:
<?php 
##############################
#                            #
# Oracle Class               #
# Created By Roberta Brandao #
# robertanrbrandao@gmail.com #
##############################

class ora_connect{ 
      var $sid, $connection; 
      var $query; 
      var $host; 
      var $total_record,$rec_position; 
      var $total_fields, $field_name;
	 

        function ora_connect($sid_locale){
				global $ORCL_HOST, $ORCL_USER_NAME, $ORCL_PASSWORD, $SID_VALUE;
				require_once($sid_locale.'/sid.inc');
                $this->host=$ORCL_HOST; 
                $this->sid=$SID_VALUE;
                $this->connection = oci_connect($ORCL_USER_NAME,$ORCL_PASSWORD,$this->sid) or die ($this->get_error_msg($this->connection,"Problem while connecting to ".$this->sid." server..."));
           } 


        function db_query($query_str="") 
       { 
           $this->sql=$query_str; 
           $this->rec_position=0; 
          // if($query_str==""){ 
           //   $query_str=$this->query_stmt; 
           //} 
           $this->query = @oci_parse($this->connection, $query_str); 
           oci_execute($this->query)or die($this->get_error_msg($this->query ,"Query Error : ".$query_str)); 
       } 

       function db_query_return($query_str="",$db=""){ 
           if($query_str==""){ 
              $query_str=$this->query_stmt; 
           } 
           $this->query = oci_parse($this->connection, $query_str); 
            if($db=="Default") { 
                   return oci_execute($this->query,OCI_DEFAULT); 
           } else { 
                   return oci_execute($this->query); 
           } 
       } 

    function select($query_str=""){ 
        $this->sql=$query_str; 
        $this->rec_position=0; 
		@oci_execute(oci_parse($this->connection, "ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS'"));
        $this->query = @oci_parse($this->connection, $query_str); 
        oci_execute($this->query)or die($this->get_error_msg($this->query ,"Query Error : ".$query_str)); 
		while($r = @oci_fetch_array($this->query,OCI_ASSOC+OCI_RETURN_LOBS)){
		$result[] = $r;
		}
		
	return $result;
    }

	function onwhile(){
		while($r = @oci_fetch_array($this->query,OCI_ASSOC+OCI_RETURN_LOBS)){
		$result[] = $r;
		}
	return $result;
	}
    
    function db_fetch_val() 
    { 
        $result=$this->db_fetch_array(0); 
        return $result[0]; 
    } 

    function gen_id($table_name='',$field='',$increment='') { 
         if(empty($increment)) { 
             $increment=1; 
         } else { 
             $increment=$increment; 
         } 
        $sql="select nvl(max($field),0) + $increment from $table_name"; 
        $this->db_query($sql); 
        return $this->db_fetch_val(); 
    } 
      
       function db_fetch_array($fetch_type=0,$db="DEFAULT"){ 
        $result=@oci_fetch_array($this->query,OCI_BOTH+OCI_RETURN_NULLS); 
        
           if(!is_array($result)) 
              return false; 
              $this->total_field=OCINumCols($this->query); 
                     if($db=="DEFAULT"){ 
                           foreach($result as $key=>$val){ 
                                   $result[$key]=trim($val); 
                                   $result[$key]=trim(htmlspecialchars($val)); 
                           } 
                     } 
           return $result; 
       } 



       function get_field_name($i){ 
           return OCIColumnName($this->query, $i+1); 
       } 


       function get_num_fields() { 
           return @oci_num_fields($this->query); 
       } 

       function get_field_type($i, $sql=""){ 
               return oci_field_type($this->query, $i+1); 
       } 
        
       function get_field_size($i, $sql=""){ 
               return oci_field_size($this->query, $i+1); 
       } 
        

       function total_record(){ 
          return oci_num_rows($this->query); 
       } 


       function free(){ 
          @oci_free_statement($this->query); 
          @oci_close($this->connection); 
          unset($this); 
       } 


       function db_fetch_tr ($css="",$colname='y',$add='y',$update='y',$delete='y'){ 
          if($css!=""){ 
              $css_val="class=".$css; 
          } 
          if(!empty($colname)) { 
              echo "<tr $css_val>"; 
              for ($i=0; $i< $this->get_num_fields(); $i++) { 
                   echo "<td>".$this->get_field_name($i)."<td>"; 
              } 
              //echo "<td>Update<td>Delete"; 
              echo "</tr>"; 
          } 
          while($result=$this->db_fetch_array(1)){ 
                    echo "<tr $css_val>"; 
                           for ($j=0; $j<$this->get_num_fields(); $j++) { 
                               $cname=$this->get_field_name($j); 
                                   echo "<td>".$result[$cname]." <td>"; 
                           } 
                    echo "</tr>"; 
          } 

       } 


       function get_error_msg($error_no,$msg=""){ 
          $log_msg=NULL; 
          $error_msg="Custom Error : <pre><font color=red>\n\t".ereg_replace(",",",\n\t",$msg)."</font></pre>"; 
          $error_msg.="System generated Error :"; 
          $error_msg.="<font color=red><pre>"; 
                foreach(oci_error($error_no) as $key=>$val){ 
                        $log_msg.="$key :  ".$val."\n"; 
                        $error_msg.="$key : $val \n"; 
                } 

                $error_msg.="</pre></font>"; 
                return $error_msg; 
       } 

       function get_error_msg_array($error_no){ 
          return oci_error($error_no); 
       } 
} 
?>

Crie uma pasta com o mesmo nome do ORCL_SERVICE_NAME e crie o arquivo abaixo nesta pasta: (com isso você tem a mesma classe mas com conectores distintos, sem precisar configurar os TSNames do Oracle.)
sid.inc:
<?php

##############################
#                            #
# SID Config                 #
# Created By Roberta Brandao #
# robertanrbrandao@gmail.com #
##############################

$ORCL_HOST         = '192.168.10.1';
$ORCL_USER_NAME    = 'root';
$ORCL_PASSWORD     = 'root';
$ORCL_SERVICE_NAME = 'TEST';
$ORCL_PORT         = '1521';
$SID_VALUE = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='.$ORCL_HOST.')(PORT='.$ORCL_PORT.')))(CONNECT_DATA=(SERVICE_NAME='.$ORCL_SERVICE_NAME.')))';

?>

functions.class.php:
<?php
##############################
#                            #
# Functions Class            #
# Created By Roberta Brandao #
# robertanrbrandao@gmail.com #
##############################


//start class
class ora_funcs {
	var $conn;

	function ora_funcs($sid){ // inicia uma instancia separada para a funcao
	$this->conn = new ora_connect($sid);
	}

	# search_field(Query, Field_retornado, Tabela, Num de linhas retornado)
	function search_field($query, $field, $table, $rows=0){
	$connfunc = &$this->conn;
	$query = trim($query);
	//$query= addslashes($query);
	$query = "SELECT $field FROM $table where ($query)";
	if($rows!=0){ 
	$query .= " AND ROWNUM <= $rows";
	}
	$connfunc->db_query($query);
	if($connfunc->total_record()>1){ //if num_rows = 0 of the query, return false;
	return $connfunc->onwhile();
	} else {
		return $connfunc->db_fetch_val();
		}

	} //end function search_field


	function close(){
	$connfunc = &$this->conn;
	$connfunc->free();
	}
}
?>

teste.php:
<?php
##############################
#                            #
# Arquivo de Teste           #
# Created By Roberta Brandao #
# robertanrbrandao@gmail.com #
##############################

# declarando classes oracle
include('ora.class.php');
include('functions.class.php');

# instanciando classes
$conn      = new ora_connect('TEST');//carrega classe com o SID TESTE. Note que esta é o nome da pasta onde está o sid.inc.
$ora_funcs = new ora_funcs('CONECTOR2'); //carrega classe de busca avançada. outro sid.inc em outra pasta

$conn  = new ora_connect();
$query = 'select * from tblteste a where a.id not in (10,20,30)'; # <- nao colocar ";" (ponto e virgula) no fim da query.

$result = $conn->select($query);
$conn->free(); //close oracle
unset($conn); //destroi o objeto e libera memoria. (caso necessario)

//print_r($result); // deem uma olhada de como montei o array.

foreach($result as $res){
$ID       = $res['id']; //ou 
$TIPO     = $ora_funcs->search_field("id = '$ID'", 'TIPO', 'CONECTOR2.TABELATESTE2', 1); //envia a query e nao desconecta da instancia
}

$ora_funcs->close(); //fecha a instancia da funcao
unset($ora_funcs);//destroi o objeto e libera memoria. (caso necessario)

?>
Data Autor Changelog Download
05/05/2011 7:01pm Roberta Brandão Versão 1.1 Versão 1.1

Comentários:

Mostrando 1 - 2 de 2 comentários
Marcos, eu criei em artigo, mas ficou tanto tempo aguardando aprovação que desisti e inseri como script
10/06/2011 6:25pm (~13 anos atrás)

Marcos Regis disse:
Bacana.

Talvez fosse mais adequado que este conteúdo fosse tratado como um artigo e colocado na sessão de Artigos para ter mais visibilidade
10/06/2011 1:58pm (~13 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)