[firebase-br] Receber Exception de SP com Select

Carlos Andrade krlosgilson em gmail.com
Qui Fev 2 13:50:29 -03 2017


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





Mais detalhes sobre a lista de discussão lista