Palavra:   

Revista PHP / PHP

Diego Campos

PHP + Oracle

Devido à enorme dificuldade que eu tive pra conseguir fazer um sistema de validação de XML pra atender as regras da ANS, e gravar LOG dessas informações no Oracle utilizando PHP resolvi tentar ajudar outra pessoas, que por vezes desistiram de utilizar o Oracle ou também tem dificuldades.

Antes de entrar nos detalhes da classe de conexão com o BD Oracle, gostaria de agradecer ao colega Carlos Silva, que publicou um artigo aqui mesmo na Revista PHP sobre:

Configurando o PHP para usar com o Oracle - http://www.revistaphp.com.br/artigo.php?id=1

Bem, o primeiro passo foi configurar o PHP para acessar o Oracle, feito isto a próxima pergunta é... como conecto no banco para fazer minhas consultas?

Para isto eu achei um artigo muito legal do Emerson Plácido, http://forum.imasters.uol.com.br/index.php?showtopic=276521, e fiz as minhas adaptações para o meu sistema.

Muitas pessoas costumas fazer um único método para o SELECT e um para UPDATE, DELETE e INSERT, entretanto eu prefiro criar um método para cada um deles. Pois em alguns casos é interessante ter variáveis já predefinias para cada um deles.

Ex:
SQL_Oracle.class.php
  1. <?php
  2.  
  3. /**
  4. * Description of SQL_Oracle
  5. *
  6. * @author Diego Campos
  7. */
  8.  
  9. class SQL_Oracle
  10. {s
  11. private $ora_servidor; // Servidor Oracle
  12. private $ora_user; // Usuario do banco
  13. private $ora_senha; // Senha do banco
  14. private $ora_conecta; //identificador de conexão
  15. public $resultado;
  16.  
  17. //Variaveis do método Select
  18. public $Select;
  19. public $ErroSelect;
  20.  
  21. //Variaveis do método deletar
  22. public $Delete;
  23. public $ConfirmaDelete;
  24. public $ErroDelete;
  25.  
  26. //Variaveis do método Inserir
  27. public $Insert;
  28. public $ConfirmaInsert;
  29. public $ErroInsert;
  30.  
  31. //Variaveis do método Update
  32. public $Update;
  33. public $ConfirmaUpdate;
  34. public $ErroUpdate;ar com Oracle.
  35.  
  36. //Construtor
  37. function __construct()
  38. {
  39. //Define os dados de conexão ao banco de dados
  40. $this->ora_servidor = “meu servidor ex: bdteste”
  41. $this->ora_user = “minha usuario”
  42. $this->ora_senha = “minha senha”;
  43. }
  44.  
  45. //Conecta ao Bando de Dados
  46. public function Conectar()
  47. {
  48. $this->ora_conecta = ocilogon($this->ora_user,$this->ora_senha,$this->ora_servidor);
  49. if(!$this->ora_conecta) {
  50. echo "<p>Não foi possível conectar-se ao servidor Oracle.</p>\n"
  51. .
  52. "<p><strong>Erro Oracle: " . OCIError() . "</strong></p>\n";
  53. exit();
  54. }
  55. }
  56.  
  57. //Selecionar dados
  58. public function Select()
  59. {
  60. try
  61. {
  62. //OCIParse análisa a ”consulta” (identificador de conexão, meuSQL)
  63. $this->resultado = OCIParse($this->ora_conecta, $this->Select);
  64. if(OCIExecute($this->resultado))
  65. {
  66. return $this->resultado;
  67. }
  68. else
  69. {
  70. $erro_select = ("<p>Erro Oracle: " . OCIError() . "</p>");
  71. throw new Exception($erro_select); //Msg de Erro
  72. }
  73. }
  74. catch (Exception $excecao)
  75. {
  76. //Exibe a msg de erro
  77. echo $excecao->getMessage();
  78. }
  79. }
  80.  
  81. //Deletar dados
  82. public function Deletar()
  83. {
  84. //Tenta Deletar, senão exibe msg de erro personalizada
  85. try
  86. {
  87. $this->resultado = OCIParse($this->ora_conecta, $this->Delete);
  88. if(OCIExecute($this->resultado))
  89. {
  90. return $this->resultado;
  91. }
  92. else
  93. {
  94. //$this->ErroDelete = ("<p>Erro Oracle: " . OCIError() . "</p>");
  95. throw new Exception($this->ErroDelete); //Msg de Erro
  96. }
  97. }
  98. catch (Exception $excecao)
  99. {
  100. echo $excecao->getMessage();
  101. }
  102. }
  103.  
  104. //Inserir dados
  105. public function Inserir()
  106. {
  107.  
  108. //Tenta Inserir, senão exibe msg de erro personalizada
  109. try
  110. {
  111. $this->Insert;
  112. $this->ora_conecta;
  113. $this->resultado = OCIParse($this->ora_conecta, $this->Insert);
  114. if(OCIExecute($this->resultado))
  115. {
  116. return $this->resultado;
  117. }
  118. else
  119. {
  120. $this->ErroInsert = ("<p>Erro Oracle: " . OCIError() . "</p>");
  121. //throw new Exception($this->ErroInsert); //Msg de Erro
  122. }
  123. }
  124. catch (Exception $excecao)
  125. {
  126. echo $excecao->getMessage();
  127. }
  128. }
  129.  
  130. //Atualziar dados
  131. public function Update()
  132. {
  133. //Tenta Inserir, senão exibe msg de erro personalizada
  134. try
  135. {
  136. $this->resultado = OCIParse($this->ora_conecta, $this->Update);
  137. if(OCIExecute($this->resultado))
  138. {
  139. return $this->resultado;
  140. }
  141. else
  142. {
  143. //$this->ErroUpdate = ("<p>Erro Oracle: " . OCIError() . "</p>");
  144. throw new Exception($this->ErroUpdate); //Msg de Erro
  145. }
  146. }
  147. catch (Exception $excecao)
  148. {
  149. echo $excecao->getMessage();
  150. }
  151. }
  152.  
  153. //Desconecta do banco de dados
  154. public function Desconectar()
  155. {
  156. return ocilogoff($this->ora_conecta);
  157. }
  158. ?>
Agora um exemplo simples de como utilizar a classe:
  1. <?php
  2. /**
  3. * Description of ConsultaCliente
  4. *
  5. * @author Diego Campos
  6. */
  7.  
  8. require_once("SQL_Oracle.class.php");
  9.  
  10.  
  11. Class ConsultaCliente
  12. {
  13. function __construct()
  14. {
  15. /* */
  16. }
  17. private function Consulta()
  18. {
  19. $id = $_GET["id"];
  20.  
  21. $SQL_Oracle = new SQL_Oracle;
  22. $SQL_Oracle->Conectar();
  23.  
  24. //Monta a query para verificar a quantidade de resultados
  25. $SQL_Oracle->Select = "SELECT COUNT(ID) AS LINHAS ".
  26. "FROM cliente ";
  27.  
  28. //Executa a query
  29. $SQL_Oracle->Select();
  30. OCIFetch($SQL_Oracle->resultado);
  31. $total = OCIResult($SQL_Oracle->resultado,'LINHAS');
  32.  
  33. if($total>0)
  34. {
  35. //Monta a query com os resultados
  36. $SQL_Oracle->Select = "SELECT ID, NOME ".
  37. "FROM cliente ".
  38. "WHERE ID='$id' ".
  39. "ORDER BY NUMLOTE desc";
  40.  
  41. //Executa a query
  42. $SQL_Oracle->Select();
  43.  
  44. //Exibe os resultados
  45. while (OCIFetch($SQL_Oracle->resultado))
  46. {
  47. OCIResult($SQL_Oracle->resultado,'NOME');
  48. }
  49. }
  50. }
  51. }
  52.  
  53. ?>
Se você leu e não entendeu o porquê de utilizar um “select COUNT(id)” antes de fazer o Select definitivo, de uma olhada no tópico “Número de registros de uma consulta” que se encontra nesse link: http://www.raelcunha.com/oracle.php#num_row

Provavelmente não fiz tudo da forma mais elegante possível, mas pra quem ainda esta apredendo a programar em POO acho que foi proveitoso.
Ainda não tive tempo de terminar o livro que comprei: “PHP – Programando com Orientação a Objetos”, mas num futuro próximo pretendo explicar com mais detalhes e de uma forma mais “correta”.

Até a próxima

Opções de Interação