[firebase-br] Receber Exception de SP com Select

Washington washington.ams em gmail.com
Qui Fev 2 14:06:08 -03 2017


Obrigado Carlos Andrade

Tb vari a net atrás de uma explicação e solução, mas não encontrei nada.

Vou verificar como implementar

Muito obrigado e abraço.

Atenciosamente

#######################
Washington A. Muller da Silva
http://wvoleibol.blogspot.com
washington.ams em gmail.com
#######################
-----Mensagem Original----- 
From: Carlos Andrade
Sent: Thursday, February 2, 2017 1:50 PM
To: lista em firebase.com.br
Subject: Re: [firebase-br] Receber Exception de SP com Select

Washingon, sei que a pergunta foi direcionada ao nosso amigo Gladiston,
mas resolvi colaborar um pouco, pois a um tempo já perdi algumas noites
de sono procurando uma solução pra isso. As exceptions vindas do FB, eu
trato no PHP da seguinte forma:

Meu script de conexão "cnx.php" é exatamente assim:

<?php
class Cnx {
   var $link;
   var $result;
   var $conectou;

   function connect($ajax = true) {
     require 'config.php';
     try {
       $this->link = ibase_connect("$bd_host","$bd_user","$bd_pass","UTF8");

       $this->conectou = true;
       if (!$this->link){
         $this->conectou = false;
         throw new Exception('Falha ao conectar com o Servidor. Tente
novamente mais tarde!');
       }
     }
     catch (Exception $e) {
       if ($ajax)
         echo $e->getMessage();
       else
         echo '<script
type="text/javascript">alert("'.$e->getMessage().'");</script>';
     }
   }

     function sql($query, $ajax = true){
     require 'config.php';
     $this->connect($ajax);
     if ($this->conectou) {;
       try {
             if ($this->result=@ibase_query($query)){ //O "@" previni
que os erros da query sejam mostradas em mensagens de erro do php, pois
vc já está tratado no bloco catch
                 $this->disconnect();
                 return $this->result;
             } else {
                 $errmsg = ibase_errmsg();
                 $this->disconnect();
                 //Aqui as exceptions criadas serão tratadas. Todas
criei começando com "ERRO_". Por ex: ERRO_001, ERRO_002, etc... O texto
da mensagem da exception, começa com "*" e termina com "." só para poder
pegar a posição inicial e final da mensagem. Por ex: "CREATE EXCEPTION
ERRO_001 '*Registro inexistente.';"
                 if (strripos($errmsg,'ERRO_')) {
                     $errmsg =
substr($errmsg,strpos($errmsg,'*'),strpos($errmsg,'.'));
                     $errmsg = substr($errmsg,1,strpos($errmsg,'.')+1);
                 } else
                 //Fim
                 //Aqui, você pode tratar para cada tipo de erro comum,
você pode ir incrementando aos poucos em cada condição "if"
                 if (strripos($errmsg,'Table unknown')) {
                     $errmsg = substr($errmsg,strpos($errmsg,'Table
unknown ')+14,strlen($errmsg));
                     $errmsg = substr($errmsg,0,strpos($errmsg,'At
line')-1);
                     $errmsg = 'Tabela desconhecida: '.$errmsg;
                 } else
                 if (strripos($errmsg,'Column unknown')) {
                     $errmsg = substr($errmsg,strpos($errmsg,'Column
unknown ')+15,strlen($errmsg));
                     $errmsg = substr($errmsg,0,strpos($errmsg,'At
line')-1);
                     $errmsg = 'Coluna desconhecida: '.$errmsg;
                 } else
                 if (strripos($errmsg,'PRIMARY or UNIQUE KEY')) {
                     if (strripos($errmsg,'UNQ_NEWSLETTER_EMAIL')) {
                         $errmsg = 'Email já cadastrado.';
                     }
                 }
                 //Fim
                 throw new Exception($errmsg);
             }
       }
       catch (Exception $e) {
         if ($ajax)
           echo $e->getMessage();
         else
           echo '<script
type="text/javascript">alert("'.$e->getMessage().'");</script>';
       }
     }
     }

     function disconnect(){
       return ibase_close($this->link);
     }
}
?>

E para execute uma query, faço como abaixo:

<?php
   require 'cnx.php';
   $mycnx = new Cnx;
   $r = $mycnx->sql("update PRODUTOS set...",true); //Último parâmetro,
informo "true" se a chamada deste script for por ajax
   if ($mycnx->conectou) {
     if ($r) {
       echo 'Produto atualzado com sucesso.';
     }
   }
?>

Se houver alguma exception vinda do banco de dados, a classe irá tratar
e se for alguma que você personalizou como "ERRO_001", a mensagem
mostrada será exatamente a que você criou no FB. Só não consegui receber
as exceptions através de "select" chamando uma procedure, mas nosso
amigo Gladiston já deu uma solução.


Em 02/02/2017 11:02, Washington escreveu:
> Caro Gladiston
>
> Iniciei um projeto com php + firebird e não sei como tratar a mensagem de 
> um
> exception.
>
> A exception e mostrada, mas mostra na tela a mensagem e junto o comando
> exception.
>
> Como resolver isto, poderias me informar, caso você saiba ?
>
> Atenciosamente


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: 
http://www.firebase.com.br/pesquisa_lista.html 





Mais detalhes sobre a lista de discussão lista