13 de Maio de 2007

PHP : Gestão de erros

Voltamos à programação em PHP. Tenho estado a desenvolver uma framework para ajudar-me em trabalhos na linguagem de programação de PHP. Na semana passada melhorei a gestão de erros. Quando ocorre um erro, invoco uma função, que chamei error_add, que armazena informação sobre o erro em dois vectores.

O vector errors é uma pilha, com um identificador que associa a outro vector de associações com os dados sobre os erros. Isso permite apresentar um texto de acordo com a língua dos utilizadores (por exemplo, portuguesa) posteriormente, quando as entradas forem processadas e estiver pronto para a geração de XHTML (ou XML), e apontar campos inválidos nos formulários.

Os identificadores separam as suas categorias dos erros por dois pontos. Em error_categories estão essas categorias, que contém sub-categorias até a índices de erros. Isso permite filtrar os erros por categorias.

Eis o código (no original, a função está num ficheiro inc/util.php e as variáveis globais em inc/global.php):

<?php
/* Errors */
$errors = array();
$error_categories = array();
/* Add error to errors pile
* @id   : error id
* @data : error parameters
*/
function error_add( $id, $data = array() )
{
global $errors;
global $error_categories;
//$data['_err_at'] = microtime(true);
$error_n = array_push( $errors, array($id => $data) );
/* add error categories */
$categories = explode( ':', $id );
$error_tree = &$error_categories;
foreach($categories as $category)
{
if( !array_key_exists($category, $error_tree) )
{
$error_tree[$category] = array();
} // if
$error_tree = &$error_tree[$category];
} // foreach
// - associate error id
if( is_array($error_tree) )
{
array_push( $error_tree, $error_n );
} // if
} // error_add
?>
Escrito por PedroAC em 21:43:46 | Link permanente | Comments (0) |

18 de Fevereiro de 2007

Validação automática de dados

Lista de erros

Gosto de guardar uma lista com informações sobre erros, para fazer processamentos posteriores com essas informações. Por exemplo, pode-se apresentar uma lista de avisos no corpo das páginas e marcar os campos inválidos de formulários.

function erro($id = NULL, $tipo = NULL, $dados = NULL)
{
static $erros = array();

// a) devolver a primeiro erro, e retira-o da lista
if($id == NULL)
{
return array_shift($erros);
}

// b) adicionar entrada na lista de erros
array_push($erros, array($id, $tipo, $dados));
}

Validação de dados

Antes de fazer alterações na base-de-dados a partir de entradas dos utilizadores, deve-se validá-las. Em vez de construir várias linhas com instruções condicionais, prefiro indicar essas informações num vector (array) e colocá-lo como argumento numa função que faça automaticamente a validação. Mostro um trecho que procura campos obrigatórios que estão vazios:

foreach($inf_dados as $k=>$v) {
// verificar se há campos obrigatórios vazios
if( array_key_exists('obrigatorio', $inf_dados[$k]) &&
$inf_dados[$k]['obrigatorio'] == true && empty($in_dados[$k]) )
{
erro('obrigatorio-' . $k, 'warning');
++$no_erros;
}
} // if

// ...
} // foreach

 

Ao chamar essa função, são removidas automaticamente as entradas que não pertencem ao contexto, usando o vector para validação. Por isso, na chamada da função, posso usar como argumento a variável $_POST (com todos os valores dos formulários com métodos de envio post), o que poupa trabalho.

// remover entradas que não existem em $inf_dados
foreach( $in_dados as $k=>$v ) {
if( !array_key_exists($k, $inf_dados) )
{
unset($in_data[$k]);
} // if
} // foreach

 

Mais tarde irei enviar um novo artigo mais aprofundado sobre o tema.

Artigo relacionado

Sugestões

Escrito por PedroAC em 19:36:22 | Link permanente | Comments (0) |

23 de Janeiro de 2007

Framework para Web; DAO #1

Há algum tempo que penso fazer uma pequena framework para aplicações Web, e decidi começar pelo Data Access Object. Depois de ter lido artigos de Tony Marston, tive uma ideia diferente sobre programação informática, e decidi refazer o trabalho que tinha feito.

Agora vou implementar uma classe genérica para Data Manipulation Languages baseando em ideias de Marston, começando pelo MySQL, que tenho instalado num Ubuntu. Existem algumas opções de implementação que não concordo, como o parser de SQL (ou melhor, da parte WHERE). Acho que seria boa ideia fazer uma máquina de estado para o efeito, mas não sei seria a eficiência interpretador PHP...

Read more...
Escrito por PedroAC em 21:22:40 | Link permanente | Comments (0) |