[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