Mostrando postagens com marcador php. Mostrar todas as postagens
Mostrando postagens com marcador php. Mostrar todas as postagens

18 julho 2010

5 dicas para Certificação Zend PHP 5

Após quase um ano da compra do voucher, eu (Otávio Calaça) finalmente tive tempo para poder fazer a tão temida prova da Zend PHP 5 Certification. Para minha surpresa e felicidade, consegui passar e agora posso ser chamado de Zend Certified Engineer... rsrs. Como é sempre bom ver a comunidade PHP crescer e se profissionalizar, aqui vão 5 dicas para quem está estudando ou pretende ser um ZCE:


  • Compre os testes oferecidos pela Zend. Os testes foram muito importantes nos meus estudos para avaliar quais eram os meus pontos fortes e fracos. A partir deles, por exemplo, descobri que precisava estudar mais sobre sockets e streams. Entretanto, a Zend só oferece um pacote com 10 testes. Para o estudo, não são necessários mais do que 5 testes. Então, o ideal é dividir os testes com algum amigo também interessado em fazer a prova. Só faça a prova quando tiver excellent em quase todos os itens do teste.


  • Estude o Zend PHP 5 Certification Study Guide por completo, mas não somente ele. O guia para certificação PHP 5 é muito bom para saber o que pode cair na prova. Entretanto, considero-o insuficiente. Estude também pelo manual do PHP, principalmente as funções de array, string e streams. Uma coisa chata que caiu, mesmo que indiretamente, foi a ordem de parâmetros em funções.


  • Não estude apenas PHP. Apesar de a certificação ser de PHP, é de engenheiro. Isso significa que cai questões sobre bancos de dados, sistemas operacionais, servidores web, protocolos, projeto e segurança. Os bancos de dados que caíram para mim foram MySQL, SQLite e PostgreSQL. Entretanto, cai questões genéricas sobre SQL, DDL e segurança em DB. Em relação a servidores, caíram algumas questões sobre configuração do apache, sobre o protocolo HTTP e SSL. Padrões de projeto é uma parte delicada. Os que caíram nos testes e na prova foram os que estão no guia. Entretanto, é necessário consultar outras fontes. Um bom livro de design patterns é o PHP objects, patterns, and practice por Matt Zandstra. Para segurança, creio que o TOP 10 da OWASP seja suficiente.


  • Ter inglês de intermediário pra cima. Uma das coisas que pesou em algumas questões de enunciado mais complexo foi o conhecimento da língua inglesa. A Person Vue disponibiliza o teste em outras línguas (português não). Entretanto, creio que o inglês seja a melhor delas.


  • Tenha calma e não estude até horas antes da prova. Ficar nervoso ou ansioso só complica as ideias. Como em qualquer prova, não estude até o último momento, reserve um ou dois dias antes da prova para descansar.



Antes da prova eu fiz 3 testes, porem só guardei o primeiro e o último. O primeiro eu fiz antes de estudar, para ver como estava meu conhecimento. Notei que haviam 6 tópicos que eu precisava estudar.No último consegui melhorar 2 itens, entretanto continuei levando fail em design. Provavelmente pelas questões subjetivas, que são mais comuns no tema design.
Espero que essas dicas possam ajudar vocês e boa sorte!

22 fevereiro 2010

Desabilitando o register_globals em tempo de execução

A diretiva register_globals há muito tempo é condenada pelos desenvolvedores mais experientes por possibilitar uma falha de segurança. Com essa configuração ativada, todas as variáveis contidas em $_ENV, $_GET, $_POST, $_COOKIE e $_SERVER são automaticamente convertidas em variáveis do PHP.

Por exemplo ao acessar http://localhost/arquivo.php?variavel=teste, se o servidor estiver configurado com register_globals = On, no script arquivo.php, haverá uma variável chamada $variavel, que terá o valor 'teste'. Isso pode ser uma falha de segurança pois um atacante pode infiltrar códigos maliciosos em variáveis que não deveriam vir das fontes carregadas pelo register_globals.
Para piorar, no PHP 6 essa configuração não irá mais existir. Ou seja, se você utiliza register_globals em seu código, certamente terá que fazer alterações ao atualizar a versão.

Sabemos que no PHP algumas diretivas definidas no php.ini podem ser alteradas em tempo de execução através da função ini_set().
Porém a diretiva register_globals não pode ser desabilitada em tempo de execução.

Portanto há 2 maneiras de desabilitar essa configuração
1 - Alterar o php.ini, alterando a diretiva register_globals para Off
2 - Criando um arquivo .htaccess no servidor alterando essa configuração para Off

Porém, como nem tudo são flores, há situações na qual não temos acesso a essas configurações do servidor. Para essas situações há uma maneira simples de garantir que as variáveis passadas por $_ENV, $_GET, $_POST, $_COOKIE e $_SERVER não serão transformadas em variáveis PHP.

No início do programa adicione as seguintes linhas:

foreach ($_ENV as $key => $value)
unset($$key);
foreach ($_GET as $key => $value)
unset($$key);
foreach ($_POST as $key => $value)
unset($$key);
foreach ($_COOKIE as $key => $value)
unset($$key);
foreach ($_SERVER as $key => $value)
unset($$key);

Fazendo isso você, antes de iniciar o desenvolvimento, está limpando as variáveis carregadas automaticamente.
Desta forma o desenvolvedor fica impossibilitado de utilizar as "vantagens" de register_globals e garante que o código será compatível com a nova versão do PHP.

Obs.: As variáveis ainda poderão ser acessadas normalmente pelos arrays superglobais do PHP $_ENV, $_GET, $_POST, $_COOKIE e $_SERVER

Obs.: Lembrando que essa técnica nada mais é que um Recurso Técnico Improvisado(Workaround, Gambiarra, Quebra-Galho...), mas que funciona!

16 dezembro 2009

O GOPHP Conference 2009 foi um sucesso!


O evento aconteceu no dia 12/12/2009 no SENAI em Goiânia e contou com mais de 100 congressistas.

Foram diversas palestras e minicursos nos quais os congressistas tiveram a oportunidade de adquirir conhecimento acerca de novas tecnologias e metodologias.

Durante os dois coffee breaks os participantes saborearam salgadinhos e refrigerantes, além de praticar o networking.
Ainda durante os coffe breaks, os congressistas puderam tirar dúvidas e conhecer outros grupos de usuários que estavam em hacklabs. Os seguintes grupos de usuários participaram do evento:
- GOJava
- RubyGO
- Debian-GO
- Ubuntu-GO
- Mulheres na Tecnologia
- Goiaba Digital

No final do dia tivemos uma mesa redonda bastante produtiva sobre o Mercado de Trabalho PHP com a participação do Pablo Dall'Oglio, Otávio Calaça e Eduardo Neves(eth0).

Ainda tivemos o sorteio de várias camisetas, descontos em cursos e outros brindes no encerramento do evento. Todos os congressistas ganharam um adesivo do GOPHP e um chaveiro do elePHPant!

Como o evento foi realizado com o objetivo de comemorar o aniversário de 2 anos do GOPHP, não poderia faltar um bolo de aniversário!
No final do evento os congressistas se reuniram para cantar parabéns para o GOPHP e saborear o delicioso bolo!

Para finalizar com chave de ouro, alguns congressistas e palestrantes foram a um restaurante para uma confraternização.

Foi interessante perceber a grande participação feminina no evento e a presença de várias pessoas do interior de Goiás, do Distrito Federal, Minas Gerais e Tocantins.

As fotos do evento podem ser visualizadas nos links abaixo:
- http://www.flickr.com/photos/45617268@N04/
- http://picasaweb.google.com/fernandopedro/GOPHPConference

A organização do GOPHP Conference 2009 agradeçe todos os patrocinadores, grupos de usuários, palestrantes e congressistas pelo inesquecível evento, e garante que em 2010 um evento ainda maior virá!

04 novembro 2009

Abertas as Chamadas de Trabalho para o GOPHP Conference 2009


É com muito orgulho que apresento a vocês o GOPHP Conference 2009 - http://www.gophp.com.br/conf

O evento será realizado no dia 12/12/09 no SENAI em Goiânia. Serão 12 palestras e 4 minicursos de 4 horas cada um.
Teremos à disposição um auditório, um anfiteatro e dois laboratórios.

O melhor vem agora. Já acertamos com 4 palestrantes convidados que tem grande renome no mundo do PHP.
1 - Guilherme Blanco, desenvolvedor do Doctrine, também é desenvolvedor do núcleo do PHP, Zend Framework e Symfony.
2 - Pablo Dall'Oglio, criador da comunidade PHP-GTK Brasil, é autor de dois livros sobre PHP, com GTK e Orientação a Objetos
3 - Adler Medrado, único brasileiro certificado Zend Framework, também é certificado ZCE e professor de PHP
4 - Eduardo Neves(eth0), colaborador do projeto OWASP, é pesquisador na área de segurança web.

Esses convidados vão ministrar palestras e minicursos sobre os assuntos que são especialistas.
Além disso o evento irá fornecer 2 cofee breaks para os congressistas.

As chamadas de trabalhos estão abertas. Quem quiser ter o privilégio de palestrar ao lado desses feras do PHP não perca tempo e se cadastre no site http://www.gophp.com.br/conf

Obs.: sigam em @GOPHPConf

07 outubro 2009

Como forçar a "declaração" de variáveis no PHP

Após uma discussão no GOPHP sobre declaração obrigatória de variáveis, iniciada pelo Ole Peter Smith, surgiram algumas maneiras de "driblar" essa liberdade que o PHP proporciona de não ser necessário declarar variáveis.

Todos sabemos que no PHP não é possível declarar uma variável, porém é possível inicializar uma variável com um determinado valor.
Quando tentamos utilizar uma variável que não foi inicializada, o PHP retorna um erro do tipo Notice. Como vários servidores não exibem os erros do tipo Notice, através do código abaixo é possível fazer com que esse erro seja tratado como um Fatal Error, que vai finalizar a execução do script.

A vantagem dessa alteração é aumentar o controle sobre as variáveis utilizadas no programa e evitar possíveis erros de execução.

Segue o código:

function newErrorHandler($error, $message)
{
if($error == 8)
{
trigger_error($message, E_USER_ERROR);
}

return false;
}

set_error_handler("newErrorHandler");

$novaVariavel = $variavelInexistente;



Além dessa maneira, quando trabalhamos com encapsulamento, podemos utilizar funções que testam o tipo da variável para garantir que o valor de um atributo será de um determinado tipo. Esse teste pode ser feito tanto para tipos primitivos quanto para tipos criados pelo usuário ou arrays.

class Pessoa
{
private $id;
private $nome;
private $tipo;
private $listaTelefone;

public function setId($id)
{
if(is_integer($id))
$this->id = $id;
else
throw new Exception('O atributo ID deve ser numérico.');
}

public function setNome($nome)
{
if(is_string($nome))
$this->nome = $nome;
else
throw new Exception('O atributo NOME deve ser uma string.');
}

public function setTipo($tipo)
{
if($tipo instanceof PessoaFisica)
$this->tipo = $tipo;
else
throw new Exception('O atributo TIPO deve ser um objeto da classe PessoaFisica.');
}

public function setListaTelefone($listaTelefone)
{
if(is_array($listaTelefone))
$this->listaTelefone = $listaTelefone;
else
throw new Exception('O atributo LISTA TELEFONE deve ser um array.');
}
}


Outros detalhes interessantes surgiram no decorrer desse tópico e que muitos desenvolvedores podem não saber da possibilidade, como por exemplo definir explicitamente o tipo de dados que uma função pode receber como parâmetro.

function calculaSalario(Array $empregados)
{
// código
}

Dessa maneira a função calculaSalario() somente irá aceitar uma variável que seja do tipo Array. Lembrando que não é possível utilizar tipos primitivos para essa funcionalidade, porém é possível utilizar tipos criados pelo usuário através de classes.

06 abril 2009

II Seminário de Informática no CEPSS

O CEPSS estará promovendo a semana da informática e quem quiser participar basta se cadastrar no link:

O Almir estará no evento representando o GOPHP e o POOMAX com a palestra Por que a Wikipédia, Yahoo e Facebook usam PHP?


A programação inteira do evento encontra-se no site:

http://www.cepss.com.br/insc.php

O evento será nos dias 16 e 17 de abril, a partir das 19:00h.

O CEPSS fica na Av. Alexandre de Morais, 450 esquina com Av. Maria Cardoso, próximo ao Buriti Shopping, Parque Amazônia em Goiânia - GO. Fone (62) 3548-3300 - 3548-3301

É importante fazer inscrição pelo site para poder pegar o certificado.

28 fevereiro 2009

David Cummings: Ligue o parâmetro Error Reporting imediatamente

David Cummings tem a sua própria empresa de software que é especialista em sistemas de gerenciamento de conteúdo, e ganhou vários prêmios. Se alguém sabe como desenvolver uma aplicação PHP eficientemente, é o Dave.

David escreveu um artigo para o SitePoint sobre as duas dicas de PHP que ele gostaria de ter aprendido quando começou a programar. Uma das dicas: Ligar o parâmetro Error Reporting imediatamente.

"A coisa mais importante que eu digo as pessoas que utilizam PHP é para ligar o parâmentro Error Reporting para seu nivel máximo. Por que fazer isso? Geralmente os erros são setados para um nível que irá esconder muitas coisas como:
- declarar uma variável antes do tempo,
- referenciar uma variável que não está disponível naquele segmento de código, ou
- usar uma definição que não foi feita
Esses fatores podem não parecer um grande problema -- desde que seu desenvolvimento seja estruturado ou orientado a objetos com funções e classes. Frequentemente escrever um código sem exibição de erros em um nível máximo pode custar horas para verificar funções que não estão funcionando por causa de variáveis que não estão acessíveis ou foram escritas erroneamente"

Exibição de erros pode facilitar e muito encontrar a razão de um erro. Um pequeno bug no código pode ser fácilmente encontrado se a exibição de erros estiver no nível máximo. Poupe-se e deixe que o PHP procure seus erros por você.

Obs.: Este post é o décimo de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

23 fevereiro 2009

Ferramentas Úteis para PHP - Manipulação de Imagens e Gráficos

Continuando a série Ferramentas Úteis para PHP, essa semana iremos falar de ferramentas para manipulação de imagens e criação de gráficos:

PHP/SWF Charts: É uma ferramenta que possibilita a criação de gráficos Web atrativos e animados a partir de dados dinâmicos. Scripts em PHP podem ser usado para pegar os dados de um banco, ou gera-los, e então passa-los para essa ferramenta, que gerará o gráfico em SWF.

pChart: É uma framework com três classes PHP (pChart, pData e pCache) para geração de gráficos em imagens. Os dados para geração dos gráficos podem vir de consultas SQL, arquivos CSV ou geradas manualmente. De uso simples, possui boa documentação.

jpGraph: Uma das mais populares ferramentas de geração de gráficos em PHP. É orientada a objetos e possui duas linhas de versões: as que funcionam com PHP 4 e as que funcionam com PHP 5. Existe ainda uma versão paga com alguns recursos adicionais. Essa biblioteca pode gerar um grande número de tipos diferentes de gráficos de forma bastante simplificada.

WideImage: É uma biblioteca orientada a objetos, desenvolvida em PHP 5, para a manipulação de imagens, de forma simples e eficiente. Por ser completamente desenvolvida em PHP, o unico requerimento, alem do PHP 5, é a extensão do PHP para a biblioteca GD, nessessária para quase todos os manipuladores de imagens.

MagickWand for PHP: É um módulo PHP para a API do ImageMagick, que permite criar, compor e editar imagens em bitmap. Ideal para quem quer incorporar funcionalidades de edição de imagens em alguma aplicação PHP de maneira fácil e rápida.

21 fevereiro 2009

Rasmus Lerdorf: Não utilize um framework PHP

Contrariando o que Josh Sharp pensa, Rasmus Lerdorf, o 'Pai' do PHP, acredita que frameworks não são uma boa. Por que? Porquê eles são muito lentos em comparação com o PHP sozinho.

Durante a apresentação de Rasmus no Drupalcon 2008, ele comparou o tempo de resposta de uma página PHP com um exemplo simples de 'Olá, Mundo' com alguns frameworks PHP, e mostrou que os frameworks são muito lentos em comparação com o PHP.

Você pode escutar ou assistir a apresentação de Rasmus na íntegra. Resumidamente, ele mostra que a performance é prejudicada quando se utiliza um framework PHP.

Obs.: Se você precisa utilizar um framework, Rasmus recomenda o Code Igniter

Obs.: Este post é o nono de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

19 fevereiro 2009

Trabalhando com Lobs, Blobs, Clobs do Oracle no PHP

Trabalhar tipos de dados como Varchar2 no Oracle é bastante simples, mas e se for necessário armazenar uma informação que tenha mais de 4000 caracteres?
Para esses casos a solução é um dos tipos LOB(Oracle Long Object), que necessitam um tratamento especial com a utilização da API do PHP para trabalhar com Lobs.

Objetos Long no Oracle
O Oracle fornece os seguintes tipos de dados LOB:
- BLOB, utilizado para armazenar informações binárias
- CLOB, utilizado para armazenar caracteres com a codificação do banco de dados
- NCLOB, utilizado para armazenar informações com codificação UNICODE. Deve-se observar que NCLOBs, atualmente não são suportados pela extensão OCI8 do PHP, que será explicada neste artigo.
- BFILE, utilizado para referenciar arquivos externos do sistema operacional.

Uma subcategoria dos LOBs, são os LOBs temporários, que podem ser tanto um BLOB, quanto um CLOB ou NCLOB, com a diferença que são armazenados temporariamente na seção até você limpar a memória.
Obs.: As versões mais antigas do Oracle fornecem os tipos LONG e LONG RAW, para caracteres e binários respectivamente. Com o Oracle9i, esses tipos ficaram depreciados em favor dos LOBs.


Armazenamento permitido em um LOB
Para os tipos BLOB, CLOB e NCLOB, o Oracle Database 10g é capaz de armazenar até 128TB em um único registro, dependendo das configurações do banco.

Um objeto LOB compreende dois elementos: O conteúdo do LOB e o localizador do LOB, que é um ponteiro para o conteúdo do LOB. Essa separação é necessária para permitir que o Oracle armazene e gerencie os LOBs de maneira eficiente, e isso é refletido na API do PHP, ao realizar consultas nos LOBs.
Para os tipos internos de LOBs(exceto BFILEs), o Oracle irá armazenar o conteúdo na linha dentro da tabela, juntamente com o restante do registro, em LOBs que tem como tamanho menos de 4KB.
Para LOBs com mais de 4KB, as informações são gravadas fora da tabela. Essa medida permite que os registros pequenos de LOBs sejam trabalhados mais rapidamente do que os maiores, que são armazenados em um local separado, e por isso tem um tempo de acesso mais lento.

Há outras opções para o armazenamento e acesso de LOBs - como utilização de cache e buffer -, que pode fazer com que a performance seja aumentada. Para maiores informações veja o Guia de Performance de LOBs.

Restrições em LOBs
Há algumas restrições que se aplicam ao trabalhar com LOBs, as mais importante estão no seu uso nas consultas SQL.
Não é possível utilizar LOB em nenhuma das seguintes consultas:

SELECT DISTINCT
ORDER BY
GROUP BY

Também não é possível utilizar LOBs em junções de tabelas(JOIN), UNION, INTERSECTION e MINUS.
Há ainda outras restrições como não ser possível utilizar um LOB como chave primária de uma tabela. Para maiores informações, veja o Guia do Desenvolvedor de Aplicações Oracle - Large Objects

CLOBs e codificações
A codificação padrão de uma base de dados é determinada com o parâmetro NLS_CHARACTERSET, e um texto em um CLOB utiliza o mesmo tipo de codificação determinado nesse parâmetro.
Para visualizar o tipo de codificação utilizado em uma case de dados, deve-se utilizar o seguinte SQL.

SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'

Para alterar a codificação de uma base utilize:

ALTER DATABASE CHARACTER SET UTF8

Obs.: Cuidado ao realizar essa operação, principalmente se houver informações na base, ou se a aplicação utilizar outro tipo de codificação.

Trabalhando com LOBs
As explicações seguintes focam na extensão OCI8 do PHP. É bom lembrar que o Oracle fornece um pacote chamado DBMS_LOB, que contém funções para trabalhar com LOBs utilizando PL/SQL.

A extensão OCI8 registra uma classe chamada OCI-Lob no escopo global da aplicação. Quando se executa uma consulta do tipo SELECT por exemplo, onde uma das colunas for um tipo LOB, o PHP vai automaticamente transformar esse campo em um objeto OCI-Lob. Assim que houver uma referencia a esse objeto, será possível chamar métodos como load() e save(), para acessar ou modificar o conteúdo do LOB.
Os métodos disponíveis dependem da versão da PHP que está sendo utilizada. O PHP 5 provê métodos como read(), seek() e append(). Para visualizar os métodos disponíveis, utilize o script abaixo.




No PHP 5.0.5, os seguintes métodos são retornados:
OCI-Lob::load()
OCI-Lob::tell()
OCI-Lob::truncate()
OCI-Lob::erase()
OCI-Lob::flush()
OCI-Lob::setbuffering()
OCI-Lob::getbuffering()
OCI-Lob::rewind()
OCI-Lob::read()
OCI-Lob::eof()
OCI-Lob::seek()
OCI-Lob::write()
OCI-Lob::append()
OCI-Lob::size()
OCI-Lob::writetofile()
OCI-Lob::writetemporary()
OCI-Lob::close()
OCI-Lob::save()
OCI-Lob::savefile()
OCI-Lob::free()

Na prática, a extensão OCI8 do PHP 4.x permite a leitura e escrita de LOBs completos somente, que são os usos mais comuns em aplicações Web. O PHP5 extende essas funcionalidades, permitindo que sejam lidos ou gravados pedaços de um LOB, assim como a utilização de buffer com os métodos setBuffering() e getBuffering().
O PHP5 ainda disponibiliza as funções oci_lob_id_equal() e oci_lob_copy().

Os exemplos abaixo utilizam a nova nomenclatura das funções OCI para PHP5. No PHP5 há o caracter underline entre as palavras. Ex.: PHP4 - ociparse(), PHP5: oci_parse().
Nos exemplos será utilizada a sequência e a tabela abaixo:


CREATE SEQUENCE mylobs_id_seq
NOMINVALUE
NOMAXVALUE
NOCYCLE
CACHE 20
NOORDER
INCREMENT BY 1;

CREATE TABLE mylobs (
id NUMBER PRIMARY KEY,
mylob CLOB
)


Na maioria dos exemplos, serão utilizados CLOBs, mas a mesma lógica pode ser aplicada aos BLOBs.

Inserindo um LOB
Para inserir um LOB, antes de mais nada, é necessário inicializar o campo LOB com as funções empty_blob ou empty_clob do Oracle - Não é possível atualizar uma informação em um LOB que contenha um valor NULL.
Uma vez inicializado, é necessário vincular a coluna a um objeto OCI-Lob do PHP e atualizar o conteúdo do LOB através do método save() do objeto.

O seguinte script fornece um exemplo, retornando o campo LOB da consulta INSERT:
save('INSERT: '.date('H:i:s',time())) ) {

// Se houver erro a transação é cancelada
oci_rollback($conn);

} else {

// Se não houver erro a transação é confirmada
oci_commit($conn);

}

// Libera recursos
oci_free_statement($stmt);
$myLOB->free();


// desconecta do banco, etc...
?>

Perceba que esse exemplo utiliza transação, chamando o método oci_execute com a constante OCI_DEFAULT, o que faz com que a alteração no banco somente seja realizada após oci_commit ou oci_rollback.
Isso é importante, pois há dois estágios na inserção. O primeiro cria o registro e o segundo atualiza o conteúdo do LOB.

Se fosse utilizado um campo BLOB, a única mudança necessária seria na chamada ao método oci_bind_by_name:
oci_bind_by_name($stmt, ":mylob_loc", $myLOB, -1, OCI_B_BLOB);

Há uma maneira de vincular um campo LOB sem especificar seu tipo:



Essa maneira simplifica o código significativamente e é adequado quando há a necessidade de escrever um LOB relativamente pequeno. Se for necessário escrever um LOB extenso, é possível nevegar pelo conteúdo chamando as funções write() e flush() para escrever pequenos pedaços de cada vez e não sobrecarregar a memória.

Retornando um LOB
Quando uma consulta SELECT contém uma coluna LOB, o PHP irá automaticamente vincular a coluna com um objeto OCI-Lob. Por exemplo:

load()."\n";
}

// etc.
?>


Esse processo pode ser simplificado com a utilização da constante OCI_RETURN_LOBS na chamada ao método oci_fetch_arrray(), instruindo a substituição dos objetos LOB por seus valores:


while ( $row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_LOBS) ) {
print "ID: {$row['ID']}, {$row['MYLOB']}\n";
}


Atualizando um LOB
Para atualizar o conteúdo de um LOB, é possível utilizar o comando RETURNING da mesma maneira que na inserção, mas há uma maneira mais simples, que é utilizar a sintaxe SELECT ... FOR UPDATE

truncate() ) {
oci_rollback($conn);
die ("Failed to truncate LOB\n");
}

// Salva o novo valor no campo LOB
if ( !$row['MYLOB']->save('UPDATE: '.date('H:i:s',time()) ) ) {

// Se houver erro a transação é cancelada
oci_rollback($conn);

} else {

// Se não houver erro a transação é confirmada
oci_commit($conn);

}

// Libera recursos
oci_free_statement($stmt);
$row['MYLOB']->free();
?>



Da mesma maneira que no INSERT, é necessário realizar o UPDATE utilizando uma transação. Um passo importante é chamar o método truncate(). Ao atualizar um LOB com save(), ele irá substituir o conteúdo do início do LOB até o tamanho da nova informação.
Isso significa que o conteúdo anterior(se for maior que o novo), poderá continuar no campo LOB.

No PHP 4.x, onde o método truncate() não está disponível, a alternativa é utilizar o método empty_clob() do Oracle para apagar qualquer conteúdo do LOB antes de salvar a nova informação.


save( 'UPDATE: '.date('H:i:s',time()) ) ) {

OCIRollback($conn);
die("Unable to update lob\n");

}

OCICommit($conn);
$mylob->free();
OCIFreeStatement($stmt);

?>


Trabalhando com BFILES
Ao utilizar o tipo BFILE, as consultas INSERT e UPDATE dizem ao Oracle qual a localização do arquivo no sistema de arquivos do servidor(Que pode não ser o mesmo do servidor Web), ao invés de passar o conteúdo do arquivo. Utilizando uma consulta SELECT, é possível ler o conteúdo de um BFILE através do Oracle, ou chamar as funções do pacote DBMS_LOB para buscar informações do arquivo.

O maior benefício dos campos BFILEs é a possibilidade de acessar o arquivo original diretamente do sistema de arquivos e ainda conseguir localizar arquivos via SQL. Isso significa que, por exemplo, imagens podem ser exibidas diretamente do sistema de arquivos enquanto é possível acompanhar o relacionamento entre a tabela contendo o BFILE e uma tabela de usuários que guarda quem fez o upload.

Como um exemplo, primeiramente é preciso atualizar a tabela utilizada nos exemplos anteriores.

ALTER TABLE mylobs ADD( mybfile BFILE )

Após isso é necessário registrar um atalho para um diretório no Oracle e dar permissões de leitura a este.
CREATE DIRECTORY IMAGES_DIR AS '/home/public_html/images'
GRANT READ ON DIRECTORY IMAGES_DIR TO usuario_do_banco

Agora é possível inserir BFILEs com:



Se for necessário, é possível ler o conteúdo de um BFILE através do Oracle utilizando a mesma maneira realizada com os CLOBs. Alternativamente, se for necessário buscar o nome dos arquivos, é possível acessar diretamente do sistema de arquivos, utilizando uma chamada à função DBMS_LOB.FILEGETNAME:



Ainda é possível utilizar a função DBMS_LOB.FILEEXISTS para descobrir quais arquivos foram deletados pelo sistema operacional mas ainda estão referenciados no banco da dados.

Conclusão
O texto original em inglês foi escrito pelo desenvolvedor Harry Fuecks e está disponível no site da Oracle.
No link há outros artigos sobre integração PHP e Oracle.

18 fevereiro 2009

Josh Sharp: Utilize um Framework PHP

Há sempre um grande debate sobre usar um framework como Zend, CakePHP, Code Igniter ou qualquer outro framework. Há vantagens e desvantagens ao utilizar um, e muitos desenvolvedores tem a sua própria opinião sobre isso.

Josh Sharp é um desenvolvedor web que acredita que o PHP é muito fácil de se aprender, e que utilizar um framework traz um ganho de tempo e elimina erros ao programar.

"A facilidade de uso do PHP é também uma desvantagem, pois há menos restrições na estrutura do código que você está escrevendo, portanto é muito mais fácil escrever código ruim. Há uma solução: Utilize um framework"

Frameworks PHP ajudam a padronizar a maneira que você programa, e pode promover um grande ganho de tempo no processo de desenvolvimento. Você pode ler mais sobre os benefícios de utilizar um framework PHP no blog do Josh

Obs.: Este post é o oitavo de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

16 fevereiro 2009

Ferramentas Úteis para PHP - Segurança

Essa semana iremos dar continuidade para a série Ferramentas Úteis para PHP comentando algumas ferramentas para segurança de sistemas desenvolvidos em PHP. Tomem nota:

Securimage: É um script gratuito e open-source para geração de CAPTCHA. Ele consegue gerar imagens complexas e códigos CAPTCHA para proteger formulários contra spam e outros abusos "robotizados".

Scavenger: É uma ferramenta open-source para gerenciamento, em tempo real, de vulnerabilidades. Ela ajuda os administradores de sistemas a responder a caçadores de vulnerabilidades, entre outros, sem a necessidade de "hackea-las" com vulnerabilidades antigas.

PHP-IDS: PHP-Intrusion Detection System é uma camada de segurança simples de usar, bem estruturada, rápida e no estado-da-arte, para aplicações Web baseadas em PHP.

Pixy: PHP Security Scanner: É um programa em java que realiza varreduras automáticas em códigos fontes escritos em PHP 4, destinadas a detectar vulnerabilidades de XSS e Injeção de SQL. Pixy pega um programa em PHP como entrada e retorna uma lista de possíveis vulnerabilidades presentes nele, juntamente com informações adicionais para entendimento das vulnerabilidades encontrada.

É importante também dar uma lida no Top 10 da OWASP que lista as 10 vulnerabilidades mais comuns em websites, descrevendo-as e mostrando formas de sana-las em PHP, Java e ASP.

15 fevereiro 2009

Jack D. Herrington: Utilize processamento em lote

Jack Herrington não é um estranho no PHP e no mundo do desenvolvimento. Escreveu mais de 30 artigos para a prestigiada IBM developerWorks, Jack ainda publicou livros como PHP Hacks.

Herrington recomenda a utilização de processamento em lote e utilização do cron para aquelas tarefas que podem rodar em background.

"Certamente, em alguns pequenos casos, é mais fácil utilizar uma thread para ajudar a realizar pequenos trabalhos. Mas é fácil ver que com o uso de ferramentas convencionais -- cron, MySQL, Orientação a Objetos no PHP e PEAR::DB -- criar trabalhos em lote no PHP é algo simples de se implementar"

Jack acredita na simplicidade, e ao invés de utilizar threading nos servidores ele utiliza a simples combinação de cron, PHP e MySQL para processar tarefas em background.

"Eu já fiz os dois, e acredito que o cron tenha vantagem no princípio KISS - Keep it Simple Stupid(Faça de maneira simples, estúpido). Ele deixa o processamento em background simples. Ao invés de ter processamento de tarefas multithread, com aplicações que executam para sempre, e depois nunca liberam memória, você tem um script em lote que o cron executa. O script determina se tem algo a fazer, faz se tiver, e então termina.. Você não precisa se preocupar com liberação de memória."

Obs.: Este post é o sétimo de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

14 fevereiro 2009

Joey Sochacki: Utilizar melhor as funções de filtros do PHP

Enquanto Joey Sochacki não é um grande nome quanto Matt Mullenweg na comunidade PHP, ele é um desenvolvedor que compartilha dicas no seu blog Devolio

Joey descobriu que, mesmo com as toneladas de filtros que podem ocorrer ao escrever códigos PHP, poucos programadores utilizam as funções de filtro do PHP

"Filtrar informações. Todos nós temos que fazer isso. A maioria, se não de todos nós, desprezam a fazê-lo. No entanto, a maioria são funções filter_* do PHP, que nos possibilita fazer todo o tipo de ordenação e validação. Utilizando essas funções, nós podemos validar tipos de dados, URLs, endereços de email, endereços de IP, retirar caracteres inválidos e muito mais, com relativa facilidade"

Filtrar pode ser complicado, mas pode ajudar imensamente. Com a ajuda de Joey você irá aprender como instalar os filtros e então filtrar quase tudo, tirando vantagem do imenso poder dos filtros do PHP.

Obs.: Este post é o sexto de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

11 fevereiro 2009

Chad Keiffer: Aumentar a velocidade de desenvolvimento PHP com uma IDE, Templates e Snippets

Quando Chad Kieffer não está ocupado trabalhando em interfaces e administrando bancos de dados, ele está dando conselhos no seu blog 2 tablespoons.

Chad acredita que utilizando uma IDE como Eclipse PDT(Pacote de desenvolvimento PHP para o Eclipse), combinando com templates e snippets, a velocidade de desenvolvimento pode ser aumentada.

"Longas listas de tarefas e prazos curtos fazem com que os desenvolvedores não se familiarizem com funcionalidades avançadas que suas ferramentas proporcionam. Isso é uma vergonha pois algumas funcionalidades como Templates podem realmente reduzir o tempo de codificação e os erros."

Obs.: Este post é o quinto de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

10 fevereiro 2009

1º Encontro do GOPHP em 2009

O Grupo de Usuários PHP de Goiás - GOPHP - irá realizar seu primeiro encontro no sábado, dia 14/02/2009, às 18:00 no Cantinho Frio em Goiânia.
O encontro terá como um dos objetivos principais a apresentação e integração de novos membros do grupo.

Até agora já são mais de 20 integrantes confirmados para o encontro.

Maiores informações

Local: Cantinho Frio
Data: 14/02/2009
Horário: 18:00
Mapa: http://maps.google.com/maps/ms?ie=UTF8&hl=pt-BR&msa=0&msid=113253769484703174698.00043f0cfcc38cbe74bb4&ll=-16.678869,-49.240186&spn=0.008386,0.019312&z=16

Pauta:
1 - Reorganização do Organograma com definição de responsabilidades
2 - Apresentação de novos membros
3 - Organização de equipe responsável pelo hacklab GOPHP do Flisol

Participantes:
1 - Otávio Calaça
2 - Walker de Alencar(Talvez)
3 - Almir Neto
4 - David Moraes
5 - Andressa Martins
6 - Leonardo Medeiros
7 - Aurélio Luis
8 - André Rodovalho(Talvez)
9 - Luciana Oliveira
10 - Bruno Leonardo
11 - André Luiz
12 - Carlos Antônio
13 - Fernando Pedro
14 - Silas Júnior
15 - Gilberto Santos
16 - Pedro Ivo B. Gimenes (Através de videoconferência via Gtalk)
17 - João Pedro
18 - Guilherme Euler(Talvez)
19 - Guilherme Pereira
20 - Diego Tolentino
21 - Alessandro Castro
22 - Allan Marmo
23 - Hugo Seabra
24 - Jivago Medeiros

Se você trabalha ou se simpatiza com PHP, não perca essa oportunidade de conhecer outros desenvolvedores goianos.
Para quem ainda não é membro do grupo, cadastre-se em: http://groups.google.com/group/gophp

09 fevereiro 2009

Ferramentas Úteis para PHP - Documentação

Desculpem a demora para publicar esse artigo (era para ter sido feito ontem), estava procurando mais ferramentas de documentação para complementar a documentação base, mas não encontrei nenhuma que fosse relevante e gratuita.

phpDocumentator: Inicialmente chamado de PHPDoc, possui suas origens na documentação das extensões presentes no PEAR, em 2000, quando o PHP4 acabava de ser lançado. Hoje, é de longe a ferramenta para documentação mais usada, e possui uma inumerável quantidade de recursos, incluindo a capacidade de gerar saídas nos formatos HTML, PDF, CHM e XML DocBook, e duas interfaces (Web e em linha de comando) bem como destaque em cores de acordo com a sintaxe do código fonte (source-code highlighting). Para saber mais a respeito do phpDocumentator, acesse o manual on-line.

PHP DOX: Um sistema de pesquisa em documentação PHP, com funcionalidades em AJAX, que permite a busca por títulos de todas as páginas da documentação do PHP

07 fevereiro 2009

Ben Balbo: Invista em cache de informações

Ben Balbo está escrevendo para o Site Point, um site de tutoriais pare desenvolvedores e designers. Ele faz parte do comitê do Grupo de Usuários de PHP de Melbourne e do Clube de Desenvolvedores de Software Livre. Não é surpresa que ele recomende que um maior tempo seja gasto com cache no PHP.

"Se você tem um site que é predominantemente estático, como um blog, que é administrado por um sistema gerenciador de conteúdo, este terá pequenas alterações apenas, e com um pequeno tempo adicional gasto, é possível ter grandes benefícios de aumento de performance. Utilizar cache para sites mais complexos que geram conteúdo baseado no usuário, como um portal ou um comércio virtual, será um pouco mais complicado, porém os benefícios ainda serão claros"


Há várias técnicas de cache no PHP.
- Chamadas de funções com cache
- Setar cabeçalhos com data de expiração
- Utilizar cache em downloads no Internet Explorer
- Cache através de sistemas de template
- Cache_Lite
e muitos outros. Por causa da natureza dinâmica de linguagens como o PHP, cache é um ponto crítico para guardar aquelas partes da página que são acessadas frequentemente porém não são atualizadas sempre.

Obs.: Este post é o quarto de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

04 fevereiro 2009

Dave Child: Nunca, jamais acredite nos usuários

Dave Child é a mente por trás do site recentemente renomeado Added Bytes(Anteriormente ilovejackdaniels.com), que exibiu as excelentes Planilhas de Dicas para várias linguagens de programação feitas por Dave.
Dave trabalhou em várias empresas de desenvolvimento no Reino Unido e se estabeleceu como uma autoridade no mundo da programação.

Ele oferece alguns sábios conselhos sobre escrita de código seguro em PHP: Não acredite em seus usuários. Eles podem te machucar!

"A regra principal para desenvolvimento web é: Nunca, jamais, acredite nos seus usuários.
Assuma que todo pequeno pedaço de informação que seu site coleta de um usuário contém código malicioso. SEMPRE!
Isso inclui informação que você acha que checou com validações no cliente, por exemplo utilizando JavaScript.
Se você consegue controlar isso, será um bom começo. Se a segurança no PHP é importante para você, esse é o ponto principal a aprender.
Seja paranóico! Se você assume que seu site nunca será atacado, ou jamais enfrentará problemas, então algo está errado e você pode ter sérios problemas.
Porém se você acredita que cada visitante do seu site está pronto para atacar e que você está sempre em guerra, isso irá te ajudar a manter seu site seguro e preparado caso algo dê errado."


Obs.: Este post é o terceiro de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

01 fevereiro 2009

Ferramentas Úteis para PHP - Teste e Otimização

Continuando a série de Ferramentas Úteis para PHP, hoje vamos citar e comentar algumas ferramentas de teste e outras de otimização. São elas:

PHPUnit: É uma ferramenta que porta completamente as funcionalidades de teste unitário do popular JUnit, para o PHP5. É útil para testar a estabilidade e a escalabilidade de aplicações Web. Escrever casos de teste com o PHPUnit é fácil, veja como.

SimpleTest: É uma plataforma, de teste unitário, simples para aplicações PHP. Para começar a desfrutar das funcionalidades do SimpleTest rapidamente, dê uma olhada nesse tutorial que te mostrará como criar um novo caso de teste.


Selenium: Selenium Remote Control (RC) é uma ferramenta de teste unitário que permite escrever testes automatizados para interfaces de aplicações Web, desenvolvidas em qualquer linguagem de programação, em qualquer website usando qualquer navegador que suporte javascript. Pode ser usado em conjunto com o PHPUnit para criar e rodar testes automáticos no navegador Web.

PHP_CodeSniffer: É um script em PHP 5 para detecção de conformidades em relação à um padrão de código PHP preferido. Ele ajuda a manter um estilo de código uniforme em projetos grandes e/ou desenvolvidos por várias pessoas.

dBug: É um clone do cfDump, do Cold Fusion, para o PHP. Ferramenta simples que mostra uma tabela contendo informações sobre arrays, classes e objetos, resources de bancos de dados e XML, tornando-se muito útil quando se quer fazer depuração.


PHP Profile Class: É uma excelente ferramenta PHP para geração de profile em aplicações Web. Usar essa classe ajudará a identificar rapidamente e de maneira fácil, partes do código da aplicação que poderiam ser refatorados e otimizados.