Arquivo

Posts Tagged ‘PHP’

Criando classe de paginação de texto

Vários sites paginam o texto de suas notícias, o que é bem útil em caso de artigos extensos. Mas como fazer essa paginação? Aqui mostrarei uma classe que faz isso automaticamente, gerando links e tudo.

Primeiro, colocarei a classe de conexão. Essa parte vocês colocam de acordo com suas necessidades. Eu, por exemplo, prefiro trabalhar com PDO.

http://jota.pastebin.com/f68b5e9ba

Agora, criamos a classe, que se chamará TextPag. Terá três variáveis: uma para armazenar o texto, outra para armazenar a página atual e outra ainda para, caso queira dar o atributo ‘class’ para o link das outras páginas (exemplo $THIS->CLASSE>…), para fins de layout.

http://jota.pastebin.com/f68b5e9ba

Pronto, aqui esta a parte básica do negócio. O que vem a seguir são métodos dessa mesma classe que visam agilizar algumas coisas:

http://jota.pastebin.com/f146496a2

E tudo pronto! Exemplo de uso:

http://jota.pastebin.com/fc6e01ed

Agora o código todo, para que não precise ficar pegando parte por parte:

http://jota.pastebin.com/f580895bf

Obrigado e espero ter sido útil!

Categorias:Otimização, PHP Tags:, ,

Script em PHP para verificar CPF

O CPF funciona assim: Separe os 9 dígitos principais (retire os dígitos verificadores). Pegue o primeiro dígito e multiplique por 10. Pegue o segundo dígito e multiplique por 9. Pegue o terceiro dígito e multiplique por 8. E assim por diante… Até pegar o nono dígito e multiplicar por 2. Some o resultado obtido e divida por 11. Se o resto da divisão for menor que 2, o primeiro dígito verificador é 0, caso contrário, o primeiro dígito verificador é igual a 11 menos o resto obtido.

Os dígitos verificadores de CPF seguem uma lógica muito simples. Irei mostrar aqui como verificar se um CPF dado é válido ou até criar um, em vista que a única parte que deve ser ‘levada em conta’ são os dígitos verificadores.

A obtenção do segundo dígito é bem simples também: Pegue os 10 dígitos que você já tem (9 do CPF sem os dígitos verificadores e o dígito verificador que conseguiu no primeiro passo) e faça assim: Multiplique o primeiro número por 11 (fique atento à essa mudança!). Multiplique o segundo número por 10. Multiplique o terceiro número por 9. E assim por diante… Até multiplicar o décimo dígito por 2.

Some o resultado obtido, divida por 11 e pegue o resto da divisão. Se ele for menor que 2, o segundo dígito é 0, se não, o segundo dígito é igual a 11 menos o resto obtido agora.

Depois que você calculou o dígito verificador CORRETO do CPF colocado, verifique se os dígitos verificadores corretos batem com os dígitos do usuário. Se sim, retorne verdade, se não, retorne falso.

Agora em PHP! Prontinho pra você:

http://jota.pastebin.com/f59f90c6d

Coloquei no pastebin porque fica mais organizado, e estava tendo problemas postando por aqui.

Espero que gostem! Ele já tem as maiorias dos filtros aí!

Categorias:Otimização, PHP, Segurança Tags:, ,

Matemática aplicada ao PHP – Arrays II

Bem, agora vamos a um anexo da ‘matéria’, mas agora de uma forma mais analítica.

Vamos fazer um algoritmo para calcular o P de um conjunto. O P de um conjunto é o número de possibilidades de subconjuntos que dá para se fazer com seus elementos.

Vale ressaltar que, nos subconjuntos, sempre existe o subconjunto VAZIO, o ∅. Ele pode ser expressado com colchetes vazios ( { } ) ou a letra grega que já apresentei, o ∅. Gosto mais do ∅.

Logo, se existe o conjunto B:

B = {m, n, p}

Os seus subconjuntos são as possibilidades de conjuntos que podem ser feitas com seus elementos, sendo, no caso:

Com um elemento: {m}, {n}, {p}

Com dois elementos: {m,n}, {m,p}, {n,p}

Com três elementos: {m, n, p}

Bem, como só há 3 elementos, acabamos por aqui. Como também todo P de um conjunto tem o subconjunto ∅.

Logo, P(B) = {∅, {m}, {n}, {p}, {m,n}, {m,p}, {n,p}, {m, n, p}}

Mas, se quisermos saber o número de subconjuntos do P de algum conjunto precisamos de fazer isso? Amagad, seria péssimo! Logo, usamos o algoritmo:

a = número de elementos de um conjunto D qualquer

n[ P(D) ] = 2a

No caso do último exemplo do conjunto B, com 3 elementos, n[ P(B) ] seria igual a 23, logo, n[ P(B) ] = 8 !

Agora vamos paralelizar ao PHP! 😀 Chegou a boa hora!

Bem, mesmo eu sendo viciado em programação orientada a objetos, vamos fazer só uma função.

function np($a)
{
}

Pronto, demos nome! np (n de P de, no caso, $a! :D)

Qual é o primeiro passo? Verificar se é um conjunto, ué!

function np($a)
{
if (!is_array($a))
{
throw new Exception(“Wrong Parameter: We only accept arrays.”);
}
}

Agora, se não for array o parâmetro passado, ele mandará uma exceção! Legal… Agora, teremos que formar um bloco try/catch para isso se validar… Mas vamos antes pensar no próximo passo do algoritmo, que é… pegar o número de elementos! Porém, no caso, teremos que só aceitar arrays com 1 chave, não podemos aceitar arrays associativos… Logo, usaremos array_values!

Assim…
(int) $n = count(array_values($a));

perfeito! 😀
Já temos boa parte feita! Agora só falta elevar o 2 à variável $n e retornar esse valor! Logo…

$returner = pow(2, $n);

😀

Agora a função inteira!

function np($a)
{
if (!is_array($a))
{
throw new Exception(“Wrong Parameter: We only accept arrays.”);
}

try
{
(int) $n = count(array_values($a));
$returner = pow(2, $n);
return $returner;
}
catch(Exception $e)
{
echo $e->getMessage().”\n”;
}
}

Pronto! Nossa funçãozinha está pronta! 😀 Tente:
$a = array(“oi”, “v”, “iu”);
echo np($a);

E verás!

😀

FlwS e até a próxima !

Matemática aplicada ao PHP – Arrays

04/02/2009 1 comentário

Bem, eu no meu curso de matemática mais ‘avançado’, estava estudando conjuntos. Sim, aquela matéria aparentemente simples que nos ensinam na escola, mas nos ensinam porcamente. MUITA coisa passa e acreditem, vi questões que nunca imaginei terem um grau tão grande de dificuldade envolvendo somente conjuntos.

Porém, enquanto estava lendo a teoria básica, aquela explanação antes de ‘partir pro fight’ e começarem os exercícios (só desafio :P), eu percebi o porquê (percebi REALMENTE) de dizerem que a programação depende da matemática.

Sim, depois da parte ‘burocrática’ e básica que todos sabemos de matemática na programação e da interpretação que pode envolver, coisas mais simples se aplicam claramente a ela.

Começando relacionando Arrays com Conjuntos:

Bem, um array é um conjunto caracterizado e uma explicação perfeita pra quem quer uma definição. Ela agrupa elementos num mesmo grupo, sendo que esses elementos também podem ser grupos (arrays dentro de arrays, ou arrays bidimensionais).

Matemática:

A = {a, e, i, o, u}

No caso, o conjunto A com todas as vogais.
Em PHP:

$A = array(‘a’, ‘e’, ‘i’, ‘o’, ‘u’);

Agora, em PHP, uma explanação equivalente, só que na forma de um array com as mesmas características da explicação matemática, encapsulada numa variável, que no caso corresponderia ao conjunto.

Agora a união de conjuntos:

A = {a, e, i}
B = {a, a, a, e, o, u}

Qual seria o resultado de A união B ?
Chamaremos A união B de D, logo..:
D = {a, e, i, o, u}

Não é necessário, pelo menos na matemática, valores serem repetidos em conjuntos, {a, a, a} é completamente igual a {a}.
Em PHP, equivalente seria:

$A = array(‘a’, ‘e’, ‘i’);
$B = array(‘a’, ‘a’, ‘a’, ‘e’, ‘o’, ‘u’);
$D = array_unique( array_merge( $A, $B ) );

Array_merge equivale à união de conjuntos. Coloquei a função array_unique ali para não existirem resultados repetidos, como o (‘a’,’a’,’a’).

Vamos para mais uma operação, e essa, com muitos que têm dificuldade, mostra que é exatamente o que acontece no PHP, a subtração de arrays.
Bem, como já disse, subtração de arrays causa muitos problemas a alguns desenvolvedores, normalmente os mais novatos. Como não é algo EXATO, não é um número, a forma mais fácil de se pensar uma subtração de conjuntos (no caso, arrays), é pensar no que o PRIMEIRO CONJUNTO tem que o SEGUNDO NÃO TEM.

Exemplo

A = {1, 2}
B = {2, 3, 4}

A – B = {1}

Como vêem, o 1, que é o resultado da subtração, é o elemento que A tem e B não tem!
Se fosse o contrário, seria:

B – A = {3, 4}

No PHP, seria algo assim:

$A = array(1, 2);
$B = array(2, 3, 4);

$C = array_diff($A, $B);

Array_diff é a nossa ‘diferença de conjuntos’ no PHP, que fará a diferença de $A – $B (dê um print_r($C) e verás) ! Seria legal se isso fosse uma coisa mais natural em PHP, sem precisar de uma função especial, mas fazer o quê…

Agora vem uma parte bem legal, em que eu tenho algumas histórias pra falar… Geralmente, quando passava no manual, nem dava importância para as funções array_intersect_*, ou mesmo o próprio array_intersect, parece até engraçado… Também, não precisava muito em projetos (não sei como não precisaria de uma função dessas até aquele momento, mas essas são as chamadas ironias da vida!) e, quando finalmente fui precisar, fiquei encucado pra achar!

Mal sabia eu que, interseção de conjuntos era o que eu precisava! E ela se resumia num cognato (palavras que se parecem em inglês e português, no caso intersect e interseção) !

Agora, sem mais blá-blá-blá, vamos fazer a nossa paralelização!

A = {1, 2}
B = {2, 3, 4}
A inter B = {2}

Como vimos, o conjunto A em interseção com B, resulta no elemento 2, pois ele está presente tanto no A quanto no B!

Em PHP seria:

$A = array(1, 2);
$B = array(2, 3, 4);
$C = array_intersect($A, $B);

E, como sempre, se quiser verificar o resultado, o famoso print_r($C) !

Viu como bastante coisa coincide?

Vlw e até o próximo post!

PDO – Facilidade, flexibilidade e segurança

16/01/2009 3 comentários

O que é o PDO? Bem, o PDO (que significa PHP Data Object) é uma extensão do PHP (que já vem habilitada automaticamente no PHP5) que facilita as transações com o banco de dados, seja qual for.

Uma das principais vantagens do PDO é que ele padroniza as funções. Não entendeu? Exemplo:
Imagine que você fez um sistema consideravelmente grande, todo usando o MySQL, como é o mais comum.

Um código cheio de mysql_query(…) e mysql_fetch_assoc(…), distribuído em vários arquivos. Porém, um dia, você se depara com a situação de ter que mudar de banco. Não, chorar não adianta, você terá que mudar cada comando específico, cada mysql por pgsql, mysqli ou qualquer outro prefixo do banco que você escolher. Já dá pra sentir o pesadelo que seria, não?

Porém nosso amigo PHP Data Object vem pra salvar a pátria. Com ele, é tudo padronizado, se você quiser mudar de um banco para o outro, mudará somente a linha de conexão, nada mais, simples assim.

E, voltando ao que disse, ele vem habilitado por padrão no PHP5, que é a versão atual e estável do PHP, a qual a maioria dos servidores já usam, logo, sem problemas, nada de ficar suplicando para o suporte do seu servidor 🙂

Existem sim outras bibliotecas que fazem o que o PDO faz, então, o que o diferencia do resto !?
A diferença chave entre estas bibliotecas e ele é velocidade. O PDO é uma extensão do PHP escrita em uma linguagem compilada (C/C++), enquanto as bibliotecas são escritas em linguagem interpretada, o que diminui seu desempenho. E as outras também não vêm habilitadas por padrão.

SEGURANÇA COM PDO

Muitas vezes vemos em vários lugares regex e mais regex para evitar sql injection, e sabemos que um simples mysql_escape_string() não resolve absolutamente nada, além de ser falho e ter que ficar dando stripslashes na hora de resgatar os dados. Mas, como nosso amigo veio para facilitar nossa vida, ele faz isso por nós, usando prepared statements! Elas evitam qualquer injeção de forma eficaz e te poupa linhas de código além de ser mais rápido que regex.

Outra forma de filtrar campos no PDO é com o bindParam. Exemplo:

$nome = $_POST[‘nome’];
$conexao = new PDO(‘mysql:host =server;dbname=database’, ‘username’, ‘password’);
// Conectando…

$sql = “SELECT FROM usuarios WHERE nome = :nome”;
// Fazendo a SQL…

$manipulador = $conexao->prepare($sql);
// Preparando a query

$manipulador->bindParam(“:nome”, $nome, PDO::PARAM_STR, 30);
//Usando a variável de preparação da query para filtrar valores

$manipulador->execute();
// Executando a query

E pronto. Código seguro, tudo bem com você. Como percebeu, os valores a serem filtrados têm uma nomenclatura ‘especial’ no SQL, com o sinal de dois pontos (:) antes do nome, para serem identificados. E no bindParam, você o conecta com a variável e, SE QUISER, seta como deve ser a variável (no caso, STRING, se fosse INT seria PDO::PARAM_INT e assim com o resto) e, o quarto parâmetro que TAMBÉM É OPCIONAL, você pode definir até o tamanho limite da string (só funciona com PDO::PARAM_STR). Toda segurança, tudo, em uma linhazinha.
Perfeito, não? Não precisa ficar batendo cabeça pra segurança, ela faz isso pra você. Existem outras formas de filtrar, basta só ver no manual (o link está mais abaixo).

Ah, e lembra do que eu disse sobre ‘só alterar 1 linha’ pra mudar de banco? Vamos retomar isso:

$conexao = new PDO(‘~~>mysql<~~:host =server;dbname=database’, ‘username’, ‘password’);
Só o MYSQL que deve ser alterado, pra pgsql, por exemplo, sem precisar alterar query por query.

TALVEZ você tenha que baixar o driver em caso do uso de bd’s mais ‘desconhecidos’, mas normalmente o provedor de hospedagem não se preocupa muito com isso.

Bem, esse texto foi só pra esclarecer para todos que para segurança de dados do BD em PHP a solução IDEAL é o PDO. Além de seguro é rápido e simples, além de muito flexível (a exemplo da situação acima). Nada de ficar de discussões de ‘evitar SQL injection’, aqui está a solução, a melhor possível se tratando de php.

Ela oferece tudo que o acesso nativo (como mysql_query, por exemplo) oferece também, o que mostrei acima é mais para evidenciar suas qualidades.
Se quiser ver mais, nada melhor do que o glorioso manual, indo em http://www.php.net/pdo e também http://www.php.net/pdostatement .
Espero ter feito algo de boa compreensão, até mais!