domingo, 20 de janeiro de 2008
Função que escreve uma data por extenso.
#Cria os arrays com os nomes por extensso.
$unidades = array('um','dois','três','quatro','cinco','seis','sete','oito','nove');
$outros = array('onze','doze','treze','quatorze','quinze','dezesseis','dezessete','dezoito','dezenove');
$dezenas = array('dez','vinte','trinta','quarenta','cinquenta','sessenta','setenta','oitenta','noventa');
$centenas = array('cem','duzentos','trezentos','quatrocentos','quinhentos','seicentos','setecentos','oitocentos','novecentos');
$milhares = array('mil');
#Separa o ano em dd, mm, yyyy
$sep = str_split($ANO);
$tam = count($sep);
if ($tam == 4){
#Milhares
$m = $unidades[$sep[0] -1]." mil";
#Centenas
if ($sep[1] <> 0){
$c = " e ".$centenas[$sep[1] - 1];
} else {#se as centenas forem 0
$c = "";
}
#Dezenas
if ($sep[2] <> 0){
if ($sep[2].$sep[3] >= 20){
$d = " e ".$dezenas[$sep[2] - 1];
#Unidades
if ($sep[3] <> 0){
$u = " e ".$unidades[$sep[3] - 1];
} else {
$u = "";
}
} elseif ($sep[2].$sep[3] == 10){
$d = " e ".$dezenas[0];
$u = "";
} else {#se as unidades forem 0
$d = " e ".$outros[$sep[3] -1];
$u = "";
}
} else {#se as dezenas forem 0
$d = "";
#Unidades
if ($sep[3] <> 0){
$u = " e ".$unidades[$sep[3] - 1];
} else {
$u = "";
}
}
}
return $m.$c.$d.$u;
}
#Exemplo:
print(Dta_Extenso("15/08/2007"));
#Saída:
#Quinze de Agosto de dois mil e sete.
#Limitações:
#A data deve estar no formato "dd/mm/yyyy"
#Versões futuras:
#Identifica, dada a data, o dia da semana, utilizando para isso
#congruência módulo M.
terça-feira, 3 de julho de 2007
Como saber se uma string é número ou texto
Algo simples que podemos fazer é o seguinde:
$valor = $_GET['valor']; //ou $_POST['valor']...
if ( $valor / 1 == 0){
header("Location: pagina_de_noticias.php");//redireciona a página
die();
}
O código acima funciona, pois, se dividirmos um texto por 1 (um), o resultado será smpre (zero).
Isso pode ser útil em uma página de notícias por exemplo.
Imagine que vc tenha um link referente a determinada notícia, assim:
< href="ler_noticia.php?id-noticia=15">....
Para evitar fraudes como SQL Injection, é essencial que na página ler_noticia.php, vc coloque o código acima para verificar se realmente o que foi recebido na página foi um número (id) referente a alguma notícia, e não uma instrução maliciosa.
Outra forma de evitar SQL Injection é usar as funções do PHP para limpeza de string.
Abaixo uma simples função que criei com esse objetivo:
function limpa_dados ($frase){
$frase = addslashes(strip_tags($frase));//retiras as tags PHP e HTML e coloca / antes das aspas, ou seja, escapa as aspas ( ', " )
$frase = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$frase);//retira possíveis instruções SQL
$frase = trim($frase);
$simbolos = array('=','OR','AND');//acrescente os símbolos que achar conveniente
foreach ($simbolos as $simbolo){
$frase = str_replace($simbolo,'',$frase);//retira os símbolos nocivos
}
return($frase);
}
$valor_recebido = limpa_dados($_POST['valor']);
No array símbolos, vc pode acrescentar qualquer um que vc achar que possam porventura tentar utilizar para fraudar seu site.
Espero que seja útil pra vc essas dicas.
E não se esqueça que segurança é tão, ou mais importante, que um Designer legal de um site. Apesar das pessoas não verem, lembrarão que o site delas nunca teve problemas com Hackers, Craker e outros filhos da put.... da mesma classe.
segunda-feira, 19 de fevereiro de 2007
Como verificar se o CPF está correto
Primeiramente precisamos conhecer as regras de colocação dos dígitos do CPF.
O CPF é composto por 11 dígitos, 2 pontos e 1 traço que separa os dígito verificadores.
O nº de CPF usa 2 dígitos verificadores para saber se o número é válido ou não. Porém, este é um tipo de código que não mostra onde esta o erro, somente diz que tem algum erro.
A regra de validação do CPF é a seguinte:
Sendo 012.345.678-90 um CPF qualquer, temos que
n1 <- 0
n2 <- 1
n3 <-2
n4 <- 3
n5 <- 4
n6 <- 5
n7 <- 6
n8 <- 7
n9 <- 8
n10 <- 9
n11 <- 0 , são cada número do CPF da esquerda para a direita.
1º > Precisamos somar, multiplicando de n1 a n9 e depois dividir por 11 e obter o resto da divisão, que é o que nos interessa.
SoMa <- (n1 * 10) + (n2 * 9) + (n3 * 8) + (n4 * 7) + (n5 * 6) + (n6 * 5) + (n7 * 4) + (n8 * 3) + (n9 * 2)
ReStO <- SoMa / 11 Pega somente o resto da divisão
2º > Verificamos se o resto é menor que 2, caso seja, o primeiro digito verificador será 0, caso não seja, o primeiro dígito verificador será 11 – ReStO.
SE ReStO < 2 ENTAO
DIGITO_1 <- 0
SENÃO
DIGITO_1 <- ReStO – 11
3º > Vamos agora obter o 2 dígito verificador. Procedemos como acima, alterando portanto, os número s serem multiplicados.
SoMa <- (n1 * 11) + (n2 * 10) + (n3 * 9) + (n4 * 8) + (n5 * 7) + (n6 * 6) + (n7 * 5) + (n8 * 4) + (n9 * 3) + (DIGITO_1 * 2 )
ReStO <-SoMa / 11 Pega somente o resto da divisão
4º > Verificamos se o resto é menor que 2, caso seja, o segundo digito verificador será 0, caso não seja, o dígito verificador será 11 – ReStO.
SE ReStO < 2 ENTAO
DIGITO_2 <- 0
SENÃO
DIGITO_2 <- ReStO – 11
5º > Pronto! Agora é só compararmos os dígitos verificadores obtidos (DIGITO_1 e DIGITO_2) com o número de CPF que queremos validar.
SE DIGITO_1 = n10 ENTAO
SE DIGITO_2 = n11 ENTAO
Escreva “CPF válido!”
SENAO
Escreva “CPF inválido!”
SENAO
Escreva “CPF inválido!”
...............................................................................
O algoritmo completo:
CPF = 012.345.678-90
n1 <- 0
n2 <- 1
n3 <- 2
n4 <- 3
n5 <- 4
n6 <- 5
n7 <- 6
n8 <- 7
n9 <- 8
n10 <- 9
n11 <- 0
//Para o primeiro digito
SoMa <- (n1 * 10) + (n2 * 9) + (n3 * 8) + (n4 * 7) + (n5 * 6) + (n6 * 5) + (n7 * 4) + (n8 * 3) + (n9 * 2)
ReStO <- SoMa / 11 //Pega somente o resto da divisão
SE ReStO < 2 ENTAO
DIGITO_1 <- 0
SENÃO
DIGITO_1 <- ReStO – 11
//Para o segundo dígito
SoMa <- (n1 * 11) + (n2 * 10) + (n3 * 9) + (n4 * 8) + (n5 * 7) + (n6 * 6) + (n7 * 5) + (n8 * 4) + (n9 * 3) + (DIGITO_1 * 2 )
ReStO <- SoMa / 11 //Pega somente o resto da divisão
SE ReStO < 2 ENTAO
DIGITO_2 <- 0
SENÃO
DIGITO_2 <- ReStO – 11
SE DIGITO_1 = n10 ENTAO
SE DIGITO_2 = n11 ENTAO
Escreva “CPF válido!”
SENAO
Escreva “CPF inválido!”
SENAO
Escreva “CPF inválido!”
Em PHP ficaria assim:
function verifica_cpf($cpf){
$cpf = trim(str_replace('-','',str_replace('.','',$cpf)));
#DIGITOS VERIFICADORES
$D1 = NULL;
$D2 = NULL;
$n1 = $cpf{0};
$n2 = $cpf{1};
$n3 = $cpf{2};
$n4 = $cpf{3};
$n5 = $cpf{4};
$n6 = $cpf{5};
$n7 = $cpf{6};
$n8 = $cpf{7};
$n9 = $cpf{8};
$n10 = $cpf{9};
$n11 = $cpf{10};
#Primeiro Digito
$resto = ( ($n1 * 10) + ($n2 * 9) + ($n3 * 8) + ($n4 * 7) + ($n5 * 6) + ($n6 * 5) + ($n7 * 4) + ($n8 * 3) + ($n9 * 2) ) % 11;
$resto < d1 ="0" d1 ="11">
#Segundo Digito
$resto = ( ($n1 * 11) + ($n2 * 10) + ($n3 * 9) + ($n4 * 8) + ($n5 * 7) + ($n6 * 6) + ($n7 * 5) + ($n8 * 4) + ($n9 * 3) + ($D1 * 2 ) ) % 11;
$resto < 2 ? $D2 ="0" : $D2 = 11 - $resto;
if ($D1 == $n10 && $D2 == $n11){
return 'correto';
}
else {
return 'errado';
}
}
print(verifica_cpf('012.345.678-90));
