Notícias e links – 28/02

28 02 2007

Pear releases
Net_CDDB 0.3.0

Pecl releases
hidef 0.1.0

PHP at Java One
Andi Gutmans estará no Java One – maior evento sobre Java do mundo, palestrando sobre o tema “PHP and Java Technology Integration”. Que coisa…

XML for PHP developers, Part 1: The 15 minute PHP with XML starter
Artigo com uma introdução ao uso de XML para desenvolvedores PHP. Inicia com o básico de XML, escrevendo e explicando a estrutura de um documento, mostrando pontos fortes e fracos, comenta sobre DOM e SimpleXML – duas extensões que PHP possui para manipulação de XML, mostrando alguns exemplos de uso de ambas extensões.
Artigo bastante interessante. Por ser apenas uma introdução, não chegou a falar de XPath, o que poderia deixar mais claro como pode ser interessante utilizar XML em projetos dos mais variados tipos.

Introducing the Strategy Pattern
Artigo falando sobre o design pattern “strategy”, dividido em quatro partes, passa por uma introdução ao design pattern, demonstra alguns exemplos básicos dele e finaliza com um exemplo de funcionamento.

Introducing the Flyweight Pattern with PHP 5
Artigo do mesmo autor do artigo, anterior, falando sobre mais um design pattern. Segue a mesma estrutura do artigo anterior…

JSON Basics
Artigo falando sobre JSON. Pode ser bastante útil para quem pretende utilizar ou já utiliza Ajax.





“pog space”: Cotação do dólar em PHP

27 02 2007

Não estava precisando, mas resolvi escrever um script para obter a cotação do dólar junto ao banco central. E se tem algo que realmente eu consigo gostar menos do que debian isso é expressão regular. Nestes momentos de ira, utilizo a boa e velha POG para relaxar:


<?php
$url
= http://www.bcb.gov.br/htms/infecon/taxas/taxas.htm&#8217;;

preg_match(
‘/<td ALIGN=CENTER class=”fundoPadraoBClaro2″>.*<\/td>/’
, file_get_contents($url),
$info);

list ( $d, $c, $v ) = explode (‘</td>’, $info[0]);


$data = strip_tags($d);
$compra = strip_tags($c);
$venda = strip_tags($v);


echo
sprintf(
‘Em %s: Compra: %s, Venda: %s %s’,
$data,
$compra,
$venda, “\n”);

$ php dolar.php
Em 26/02/2007: Compra: 2,0855, Venda: 2,0863

Ai está, agora quando precisar já tenho…





PHP keywords – Parte 1

26 02 2007

PHP, assim como outras linguagens, possui diversas palavras-chave e construtores de linguage, muitos deles bastante utilizados e outros talvez até desconhecidos.

Vejamos então uma lista com estas palavras-chave e construtores e para que servem ou como utiliza-los

  • echo

Diferentemente do que muitos pensam, “echo” não é uma função, mas sim um construtor da linguagem. É utilizado para exibir uma ou mais strings:

<?php
echo ‘Ola ‘, ‘mundo ‘;

echo (“cruel\n”);
?>

  • print

Da mesma forma que “echo” não é uma função, “print” também não é. As principais diferenças entre “echo” e “print” são:
– “print” retorna um valor (sempre 1) e “echo” não retorna
– “echo” pode exibir mais do que uma string, e “print” não (echo ‘Ola ‘, ‘mundo ‘;)

<?php

    print ‘Ola ‘;
    print ‘mundo ‘;
    print (“cruel\n”);

    // note que
    // print ‘Ola ‘, ‘mundo ‘;
    // nao funciona
?>

  • die e exit

“die” é um alias (apelido) para exit. “exit” serve para finalizar um script:

<?php
    if(!file_exists(‘/etc/blablabla’))
        exit(2); // finaliza o script, com status = 2 (file not found)

    echo “Eu nao serei exibido”;
?>

$ php exit.php
$ echo $?
2
$

<?php

    if(!file_exists(‘/etc/blablabla’))

        exit(“Arquivo nao encontrado\n”); // finaliza o script exibindo uma mensagem

    echo “Eu nao serei exibido”;

?>

$ php exit.php
Arquivo nao encontrado

$ echo $?
2
$

“exit” também não é uma função.

  • if, else, elseif e endif

“if”, “else” e “elseif” não precisam de uma explicação, pois são realmente simples e bastante utilizados. “endif”, ao contrário, não é muito. É utilizado na sintaxe altenativa de “if”:

<?php
    if ( 1 == 2 ):
        echo “Fim do mundo\n”;

        exit(42);
    else :
        echo “Tudo certo\n”;
    endif;

?>

  • for e endfor

Assim como o “if”, “for” é bastante utilizado e não necessita uma explicação e também possui uma sintaxe alternativa:

<?php
    for ( $cont = 0; $cont != 10; $cont++ ):

        echo $cont;
        echo “\n”;
    endfor;

?>

  • while e endwhile

Assim como o “if” e o “for”, o “while” também é bastante comum e possui uma sintaxe alternativa:

<?php
    $cont = 0;

    while($cont++ < 10):
        echo $cont;
        echo “\n”;

    endwhile;
?>

$ php while.php
1
2
3
4

5
6
7
8
9
10

  • foreach, as e endforeach

“foreach” é utilizado para fazer passar por todos os ítens de um array. E, como os citados anteriormente, também possui a sintaxe alternativa:

<?php
    $sos = array(‘windows’, ‘fbsd’, ‘plan9′, ‘linux’);

    foreach ( $sos as $so ):
        echo $so;
        echo “\n”;

    endforeach;
?>

$ php foreach.php
windows
fbsd
plan9
linux

É possível obter também o índice do ítem corrente do array sendo iterado:

<?php
    $paises = array(‘Brasil’, ‘Argentina’, ‘Paraguai’);

    // utilizando a forma mais comum de foreach

    foreach ( $paises as $indice => $pais ) {
        echo $indice;

        echo ‘ – ‘;
        echo $pais;
        echo “\n”;

    }
?>

$ php foreachi.php
0 – Brasil
1 – Argentina
2 – Paraguai

  • switch, case, default e endswitch

“switch”, “case” e “default” tem o uso bastente difundido também. Já endswitch não costuma ser muito utilizado:

<?php
    $cidade = ‘Curitiba’;

    switch ( $cidade ):

        case ‘Sao Paulo’:
            echo “Nao foi uma boa escolha\n”;

        break;

        case ‘Rio de Janeiro’:
            echo “Nao possui amor a vida ?\n”;

        break;

        case ‘Curitiba’:
            echo “Boa escolha\n”;

        break;

        // opcao padrao, caso nao se encaixe em nenhuma das anteriores
        default:
            echo “Nenhuma da opcoes\n”;

        break;

    endswitch;
?>

$ php switch.php
Boa escolha

  • do-while

“do-while” é bem menos utilizado do que o “while”. A diferença entre ambos é que no “do-while” a expressão condional é executada após cada iteração, e não antes:

<?php

    $cont = 1;
    do {
        echo $cont;

        echo “\n”;

    } while($cont++ < 10);
?>

$ php dowhile.php
1
2

3
4
5
6
7
8

9
10

  • break

“break” é utilizado para finalizar a execução de um bloco “switch”, “for”, “while”, “do-while” ou “foreach”:

<?php
    $cidade = ‘Curitiba’;

    switch ( $cidade ) {

        case ‘Curitiba’:
            echo “Boa escolha\n”;

        case ‘Curitiba’:

            echo “Curitiba novamente\n”;
        break;

        case ‘Sao paulo’:

            echo “Nao tao boa escolha\n”;
        break;

        case ‘Curitiba’:

            echo “Terceira vez Curitiba\n”;
        break;

    }
?>

$ php break.php
Boa escolha
Curitiba novamente

“break” pode ser utilizado também com um argumento númerico, que indica o nível do bloco que deve ser interrompido:

<?php

    for ( $x = 0; $x < 10; $x++ ) {

        for ( $y = 0; $y < 10; $y++ ) {

            echo “$x * $y = “;

            echo $x * $y;

            echo “\n”;

            if ( $x == 2 ) break 2;

        }
    }

?>

$ php breakn.php
0 * 0 = 0
0 * 1 = 0

0 * 2 = 0
0 * 3 = 0
0 * 4 = 0
0 * 5 = 0

0 * 6 = 0
0 * 7 = 0
0 * 8 = 0
0 * 9 = 0
1 * 0 = 0

1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4

1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9

2 * 0 = 0

  • continue

“continue” é utilizado no interior de loops, para parar a execução, retornar para o começo do bloco da estrutura de comandos e começar uma nova iteração.

<?php
    // exibindo numeros impares
    for ( $cont = 1; $cont < 10; $cont++ ) {

        // resto da divisao de $cont por 2. Se for = 0, o numero e’ par,
        // deve retornar para o inicio do loop
        if ( $cont % 2 == 0 ) continue;

        echo $cont.“\n”;
    }
?>

$ php continue.php

1
3
5
7
9

Continue pode ser utilizado também em “foreach”, “while”, “do” e “switch”. Vale observar que “switch” é considerado uma strutura de looping para o “continue”.
E assim como o break pode ser utilizado com um argumento número para indicar o nível que do bloco que deve ser interrompido, o continue também pode utilizar este argumento, tendo o funcionamento análogo:

<?php

    for ( $cont = 1; $cont < 5; $cont++ ) {

        for ( $cont2 = 1; $cont2 < 10; $cont2++ ) {

            if ( $cont2 == 3 ) continue 2;

            echo “$cont * $cont2 = “;

            echo $cont * $cont2;
            echo “\n”;

        }

    }
?>

$ php continuei.php
1 * 1 = 1
1 * 2 = 2

2 * 1 = 2
2 * 2 = 4

3 * 1 = 3
3 * 2 = 6
4 * 1 = 4
4 * 2 = 8

Nesta primeira parte ficamos nisso.





Cadastro com confirmação por email

26 02 2007

O leitor Erick de Oliveira nos pediu um tutorial sobre cadastro com
confirmação por email. Irei demonstrar de maneira bem simples e rápida uma
maneira de como criar um cadastro desse tipo e tentar sugerir algumas idéias.
Os exemplos irão usar o MySQL como database.
Aproveitando o embalo de já estar falando de MySQL, vamos construir então a
tabela que nos auxiliará nessa tarefa:


create table cadastro (
id_cadastro int not null primary key auto_increment,
nome varchar(50),
email varchar(50),
login varchar(30),
senha varchar(32),
data_ts varchar(14),
uid varchar(50),
ativo bool default 0
);

Nessa tabela, serão salvas as informações básicas de login do usuário. Quero
chamar atenção especial para os campos ‘data_ts’, ‘uid’ e ‘ativo’. Esses serão
os campos que usaremos como controle, para validar o usuário, após ele receber
o email de confirmação de seu cadastro.
O campo uid, irá armazenar um id unico, gerado pela função uniqid do
PHP, e esse id será usado em conjunto com o campo de data_ts, para validarmos
o cadastro do usuário, e ativarmos a sua conta. É mais simples de explicar
como funcionará, mostrnado um pouco de código.
(Obs: Não irei me preocupar aqui, em verificar se o login já não está em uso
no sistema por alguém, ou se as informações foram corretamente preenchidas, já
que a ideia aqui é demonstrar como validar o cadastro através de um email de
confirmação).

Cadastro.php


<?php

// Vou assumir que o arquivo conectar.php existe, e que ele e o responsavel
// por se conectar a seu database
include_once('conectar.php'); 

// Vou assumir que os campos foram preenchidos todos corretamente
// e que ninguem vai tentar se aproveitar do formulario para SQL Injection
// ou coisas do genero

if( isset( $_POST['enviar'] ) ) {

    $nome $_POST['nome'];
    
$email $_POST['email'];
    
$login $_POST['login'];
    
$senha md5$_POST['senha'] );
    
$uid uniqidrand( ), true );
    
$data_ts time( );
    
$ativo 0;

    $sql "insert into cadastro ( id_cadastro, nome, email, login, senha,
data_ts, uid,
ativo ) "
;
    
$sql .= "values
('', '$nome','$email','$login','$senha','$data_ts','$uid','$ativo')"
;

    if( ! mysql_query$sql ) ) {
        echo 
"Houve um erro inserindo o registro ".mysql_error( );
    } else { 
// Registro inserido com sucesso, mandar email

        $id mysql_insert_id$con );

        // Criar as variaveis para validar o email
        
$url =
sprintf'id=%s&email=%s&uid=%s&key=%s',$idmd5($email), md5($uid),
md5($data_ts)
);

        $mensagem 'Para confirmar seu cadastro acesse o link:'."\n";
        
$mensagem .= sprintf('http://www.dominio.com.br/ativar.php?%s',$url);

        // enviar o email
        
mail$email'Confirmacao de cadastro'$mensagem );

        echo "Registro inserido com sucesso";
    }
}

?>

<form method="POST">

    Nome:<input type="text" name="nome"><br>
    Email:<input type="text" name="email"><br>
    Login:<input type="text" name="login"><br>
    Senha:<input type="password" name="senha"><br>
    <br>
    <input type="submit" name="enviar" value="Cadastrar">

</form>

O formulário é bastante simples, e eu gostaria de dar destaque a linha:
$url = sprintf( ‘id=%s&email=%s&uid=%s&key=%s’,$id, md5($email), md5($uid),
md5($data_ts) );

Veja que essas são as variáveis que identificam o usuário que acaba de se
cadastrar. Quando a url para validação for acessada, iremos conferir se o os
dados de unique id e a data conferem com o email especificado, para poder
então ativar o cadastro. O email e data, são passados como hash md5, para
proteger essas informações de quem as possa estar vendo. A variável id
é quem identificará com qual registro na tabela essas informações devem ser
comparadas. O registro será ativado, apenas caso todas as informações
cadastradas sejam iguais as informações vindas pela URL, dessa forma, se
alguém tentar ativar um cadastro sem ser o verdadeiro dono da informação, não
poderá faze-lo, a menos que conheça o segundo exato em que o cadastro foi
feito, o email no qual o cadastro foi feito e a unique id do usuario.
Vamos ver então, como fica o código para ativar o cadastro.

Ativar.php


<?php

// Novamente, nao irei fazer nenhum tipo de checagem para validar os dados
// em busca de SQL Injection ou coisas do genero. Nao se esqueca voce de fazer
// isso.

// Conectar no banco de dados
include_once('conectar.php');

// Dados vindos pela url
$id $_GET['id'];
$emailMd5 $_GET['email'];
$uidMd5 $_GET['uid'];
$dataMd5 $_GET['key'];

//Buscar os dados no banco
$sql "select * from cadastro where id_cadastro = '$id'";
$sql mysql_query$sql );
$rs mysql_fetch_array$sql );

// Comparar os dados que pegamos no banco, com os dados vindos pela url
$valido true;

if( $emailMd5 !== md5$rs['email'] ) )
    
$valido false;

if( $uidMd5 !== md5$rs['uid'] ) )
    
$valido false;

if( $dataMd5 !== md5$rs['data_ts'] ) )
    
$valido false;

// Os dados estão corretos, hora de ativar o cadastro
if( $valido === true ) {
    
$sql "update cadastro set ativo='1' where id_cadastro='$id'";
    
mysql_query$sql );
    echo 
"Cadastro ativado com sucesso!";
} else {
    echo 
"Informacoes invalidas";
}

?>

A partir daí o cadastro já pode ser ativado. Agora quando o usuário for se
logar no sistema, basta verificar se o valor do campo ativo na tabela
para aquele usuário, vale 1. Caso sim, significa que o usuário já teve sua
ativação realizada.

Espero que o texto possa ter ajudado, e qualquer dúvida, basta deixar um
comentário ai : )
Abaixo estão os links para os arquivos com os códigos dos exemplos, pois o
Wordpress faz o favor de estragar as aspas, e consequentemente o código : |

[]s

Cadastro.txt
Ativar.txt





Notícias e links – 25/02

25 02 2007

Pear releases
Net_MPD 1.0.1
Net_LDAP 0.7.1
Services_Technorati 2.0.0alpha1
Math_Derivative 1.0.0RC1
pearweb 1.8.0
File_MARC 0.1.2
Structures_LinkedList 0.1.3
Net_MAC 0.1.2

Pecl releases
zip 1.8.6
APC 3.0.13
pecl_http 1.5.2

PHPExcel
Release da versão 1.0 do PHPExcel. Atualmente cria planilhas apenas no formato do excel 2007 (e também as lê). Possui diversos outros features e promete ser uma boa alternativa à outros projetos existentes.

Going deep inside PHP sessions
Artigo bastante completo falando sobre sessões em PHP. Mostra, entre outras coisas, um passo a passo para a criação de um manipulador de sessões customizado e mais seguro que o padrão.

Coding PHP Mailboxes (Part 1)
Primeira parte de um artigo cobrindo o desenvolvimento de uma aplicação para acesso à caixas de email utilizando IMAP. É visto desde como instalar e conectar à um servidor IMAP, passando por como obter informações das mensagens contidas na caixa de email e finalizando com a sua exibição.

Syntax checking for PHP in Emacs
Para quem utiliza emacs para desenvolver em PHP, uma dica de como habilitar checagem de sintaxe on-the-fly.
Quem sabe futuramente surja também uma apresentação ao mesmo nível da VIM for (PHP) Programmers

SOAP vs REST
Compilação com diversos links comparativos de SOAP e REST.
Utilizo frequentemente SOAP ( Pear para criar webservices e a extensão do PHP para consumir ) e não me aventurei ainda com REST. Quem sabe brevemente…





Vídeos: Vancouver conference 2007

23 02 2007

Dois vídeos da conferência ocorrida nos dias 12 e 13 de fevereiro:PHP Tips and tricks
(seria mais simples se fosse um slideshow…)

Future of Open Source Software Panel






Notícias e links – 22/02

23 02 2007

Pear releases
MDB2_Schema 0.7.1
pearweb 1.7.0 (pulou do 1.6.3 para o 1.7)
Structures_DataGrid_Renderer_Flexy 0.1.1

Pecl releases
swish 0.2.0
pecl_http 1.5.1

PHP 6 and Request Decoding
“Hope this has been a useful preview of this very important part of PHP 6. Once this functionality is complete, we can finally make the Unicode preview release. Stay tuned.”

Zend Framework 0.8.0 Released
Entre outras coisas, correção de bugs, adição de novos componentes e aumento de performance de componentes antigos, além de ter movido diversos componentes da incubadora para o core do framework.

Distributed Testing with PHPUnit 3.1
Exemplo de uso de testes distribuídos usando PHPUnit 3.1 (que será lançado brevemente, atualmente se encontra na versão 3.0.4)

Taking a look at ten different PHP frameworks
Artigo de março de 2006, fazendo uma pequena análise de 10 diferentes frameworks para PHP ( Zend, CakePHP, Symphony, Seagull, WACT, PRADO, PHP on TRAX, ZooP, eZ Components e CodeIgniter ). Apesar de já ter quase um ano, vale a pena uma lida.

User Authentication and PHP Security
Artigo dividido em 4 partes falando sobre autenticação e segurança em PHP.
Na primeira parte o autor descreve o que é autenticação e comenta sobre dois métodos de efetiva-la, fala sobre ataques mais comuns na segunda e na terceira parte, e finaliza falando sobre a importância de se utilizar SSL em durante o processo de autenticação. Para quem está iniciando o desenvolvimento de aplicações, vale uma lida como uma breve introdução.