Usando o Oracle no Debian + classe em PHP5
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:
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:
functions.class.php:
teste.php:
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 |
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)
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
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)