Veremos e entenderemos como funcionaria então um código básico completo que trataria de uma maneira certa os possíveis erros que ocorressem durante sua execução.
O código
O código que se seguirá é meramente explicativo e por isso talvez não possua utilidade numa situação real.
- Criaremos um código onde será criado um manipulador de arquivos;
- O conteúdo do arquivo será lido;
- Efetuaremos uma conexão com o servidor de banco de dados;
- Esse conteúdo será inserido numa célula de uma tabela de um banco de dados;
- E se tudo ocorrer bem, será exibida a mensagem: Operação efetuada com sucesso;
- Caso ocorra um erro será exibida uma mensagem de erro que será reportada ao programador.
Veja abaixo:
//A CLASSE:
class ArmazenadorDeArquivoEmDB {
protected $db_obj;
protected $db_usuario;
protected $db_senha;
protected $db_dsn;
protected $nomeDoArquivo;
protected $manipuladorDoArquivo;
protected $conteudoDoArquivo;
protected $db_tabela;
protected $db_dbName;
public function __construct($usuario, $senha, $tabela, $db, $servidor) { //Construir objeto
$this->db_usuario = $usuario;
$this->db_senha = $senha;
$this->db_tabela = $tabela;
$this->db_dbName = $db;
$this->db_dsn = $servidor;
}
public function conectar() {
if(!($this->db_obj = @mysql_connect($this->db_dsn, $this->db_usuario, $this->db_senha))) {
throw new DBException("Não foi possível conectar ao banco de dados", 281); //Lembrando que o código de erro não é um parâmetro obrigatório
}
}
public function armazenarArquivoNoDB($nomeDoArquivo) { //O parâmetro requer endereço completo do arquivo
$this->nomeDoArquivo = $nomeDoArquivo;
try {
if (empty($this->db_obj)) { //Se não existir uma conexão aberta com o DB
$this->conectar();
}
} catch ( DBException $e ) { //Caso haja algum erro durante a tentativa de conexão...
throw $e; // ...o "alarme" irá disparar
}
//Iremos abrir o arquivo:
if (!file_exists($nomeDoArquivo)) throw new FopenException($nomeDoArquivo, "O arquivo especificado não existe.", 282);
if (!($this->manipuladorDoArquivo = @fopen($nomeDoArquivo, "r"))) throw new FopenException($nomeDoArquivo, "Não foi possível abrir um manipulador para este arquivo.", 283);
if (!($this->conteudoDoArquivo = @fread($this->manipuladorDoArquivo, intval(sprintf("%u", filesize($nomeDoArquivo)))))) throw new FopenException($nomeDoArquivo, "Não foi possível abrir o conteúdo deste arquivo.", 284); //O 2º parâmetro de fread() possibilita a leitura de arquivos maiores que 2GB
//Armazenaremos agora o conteúdo do arquivo no DB
$sql = 'INSERT INTO `' . $this->db_dbName . '`.`' . $this->db_tabela . '` (`nome`, `conteudo`) VALUES (\'' . $this->nomeDoArquivo . '\', \''. $this->conteudoDoArquivo . '\');';
if(!($insert = @mysql_query($sql))) throw new DBException("Não foi possível inserir o arquivo no banco de dados.", 285);
else echo '<html><head></head><body onload="alert(\'O arquivo foi armazenado com sucesso no banco de dados\')"></body></html>';
}
}
//O OBJETO EM AÇÃO:
$armazenadorDeArquivoEmDB = new ArmazenadorDeArquivoEmDB("usuario", "senha", "tabela", "banco_de_dados", "sevidor"); //Criamos um objeto que armazena um arquivo num banco de dados
try { //Tentiva de conexão
$armazenadorDeArquivoEmDB->armazenarArquivoNoDB("Ergue-te Marcos.txt"); //Aqui entra o nome do arquivo a ser armazenado no DB
} catch ( DBException $e ) {
//Houve um erro relativo ao banco de dados
echo nl2br("<b>{$e->getMessage()}</b>\n<br />Detalhes:\n{$e->__toString()}"); //Exibir string contendo informações sobre a exceção
$gossipy->reportar($e); //A nível exemplificativo, temos este objeto fictício, imaginário, que envia por email informações sobre o erro ao programador
} catch ( FopenException $e ) {
//Houve um erro referente ao arquivo, e podemos dar um tratamento específico a este tipo de exceção!
echo nl2br("<b>{$e->getMessage()}</b>\n<br />Detalhes:\n{$e->__toString()}"); //Exibir string contendo informações sobre a exceção
$gossipy->reportar($e); //A nível exemplificativo, temos este objeto fictício, imaginário, que envia por email informações sobre o erro ao programador
}
Poderíamos ter explorado mais desta fantástica linguagem que é o PHP e ter feito um tratamento de erros mais proveitoso no código acima, mas acho que para fins meramente explicativos e didáticos não é necessário tanta complexidade.
Vocês podem ver que poderíamos ter criado no código acima subclasses de Exception bem mais específicas, a idéia é a mesma de quando criamos as classes "FopenException" e "DBException". Classes mais específicas para a manipulação de exceções relativas ao banco de dados poderiam ser definidas apenas estendendo a classe "DBException", veja:
SQLException extends DBException { }
E cada vez podemos ir tornando as exceções mais específicas (e a manipulação mais precisa).