PHP – Trabalhando com PDO (PHP Data Objects)

Olá pessoal, voltando com um novo post depois de muito tempo sem blogar. Hoje vou falar sobre PDO (PHP Data Objects), uma extensão presente a partir da versão 5 do PHP que permite desenvolver códigos de acesso a banco de dados portáveis, mudando apenas uma linha de código.

Imagine um sistema cheio de mysql_connect’s, mysql_query’s e de uma hora pra outra você se vê obrigado a mudar o banco de dados pra PostgreSQL, por exemplo. Imagine o trabalho de alterar toda essa parte do seu projeto? O PDO veio para solucionar esse e muitos outros problemas, como o de SQL Injection, já que usa prepared statements (falarei deles mais abaixo). No caso de você ter um sistema inteiro usando PDO e decide mudar de SGBD, basta alterar apenas a linha de conexão com o tipo de banco de dados desejado.

Conexão

	try{
		$conn = new PDO('mysql:host=localhost;dbname=seuBD', 'root', '12345');
	}
	catch (PDOException $e){
		print 'Erro: ' . $e->getMessage();
	}

Este é um exemplo de conexão. Você pode criar uma classe utilizando o padrão Singleton, instanciando apenas uma conexão PDO para a aplicação inteira. Se você quisesse alterar o SGBD para PostgreSQL, bastava apenas substituir a palavra mysql por pgsql.

Para descobrir quais drivers do PDO você tem disponíveis, execute o código abaixo:

	foreach(PDO::getAvailableDrivers() as $driver){
		echo $driver.'<br />';
	}

Por padrão, o PDO não exibe erros de consultas escritas incorretamente, por exemplo. Para exibir os erros e facilitar o desenvolvimento da aplicação, basta passar os seguintes parâmetros ao objeto:

	$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

Selecionando dados

Agora que você já tem seu objeto PDO instanciado, é só usá-lo para realizar as consultas. Veja um exemplo de select:

	$clientes = $conn->prepare('SELECT id, nome FROM clientes');
	$clientes->execute();

	while ($dadosClientes = $clientes->fetch()){
		echo 'ID: ' . $dadosClientes['id'] . ' Nome: ' . $dadosClientes['nome'] . '<br />';
	}


Viu como é simples? Você também pode passar parâmetros para a consulta da seguinte forma:

	$clientes = $conn->prepare('SELECT id, nome FROM clientes WHERE id = :id AND nome = :nome');
	$clientes->bindParam(':id', $_POST['id'], PDO::PARAM_INT);
	$clientes->bindParam(':nome', $_POST['nome']);
	$clientes->execute();

	while ($dadosClientes = $clientes->fetch()){
		echo 'ID: ' . $dadosClientes['id'] . ' Nome: ' . $dadosClientes['nome'] . '<br />';
	}

A grande vantagem do PDO é que se você usar prepared statements, não precisará se preocupar com SQL Injection, pois o PDO já faz todo o serviço de filtragem dos dados de entrada para você, de forma muito segura.

A lógica é a mesma para executar outros tipos de consultas. Veja um exemplo de insert:

	$clientes = $conn->prepare('INSERT INTO clientes (nome) VALUES (:nome));
	$clientes->bindParam(':nome', $_POST['nome']);
	$clientes->execute();

	if ($clientes->rowCount() > 0){
		echo 'Registro inserido com sucesso';
	}

Para mais detalhes, consulte a documentação oficial.

Espero que tenham gostado do post. Um abraço e até a próxima!

Ajustes para o Ubuntu 10.04 Lucid Lynx

Aqui estão alguns ajustes que tive que fazer na minha instalação do Ubuntu 10.04 para deixar do jeito que eu queria. Compartilho aqui para o caso de alguém mais ter essas mesmas dúvidas.

Posição dos botões na barra de título
O novo padrão adotado pela Canonical é posicionar os botões de fechar, maximizar e restaurar no lado esquerdo da janela. Felizmente, pra não quem não está acostumado com esta mudança, há uma maneira de voltar os botões à posição original. Para isso, abra um terminal e digite:

fonini@valhalla:$ gconf-editor

Na janela que irá abrir, navegue em apps/metacity/general e altere o valor do campo button_layout para o mesmo que está na imagem abaixo e feche o programa para efetivar as alterações.

Applet de volume
Outra mudança que eu notei (pode ser apenas um bug) é que o applet de volume não aparece mais na barra superior do Gnome. Para corrigir este problema, devemos adicionar o applet de volume aos aplicativos de sessão, que serão iniciados juntamente com o sistema. Para isso, vá em Sistema/Preferências/Aplicativos de sessão e clique em Adicionar, preenchendo com um nome escolhido por você e o seguinte comando: /usr/bin/gnome-volume-control-applet. Dessa forma, o aplicativo irá iniciar juntamente com o Gnome e sempre estará disponível.

Barra de navegação nas pastas
Antigamente existia um botão que permitia alterar a barra de navegação das pastas do modo gráfico para o modo texto, mas ele também sumiu na nova versão. Para alternar para a barra de navegação em modo texto, abra um terminal e digite:

fonini@valhalla:$ gconftool-2 --type=Boolean --set /apps/nautilus/preferences/always_use_location_entry true

Reiniciar o X com CTRL+ALT+Backspace
Para habilitar esta opção, vá em Sistema/Preferências/Teclado. Clique na aba Disposições e no botão Opções. Procure “Key sequence to kill the X Server” e marque a opção CTRL+ALT+Backspace.

Caracteres inválidos no plugin Lyrics do Rhythmbox
A nova versão do Rhythmbox inclui um plugin para buscar letras de músicas no Terra. Porém, os apóstrofos vem bagunçados. Para corrigir isso, execute os seguintes procedimentos:

fonini@valhalla:$ sudo gedit /usr/lib/rhythmbox/plugins/lyrics/TerraParser.py

Procure por esta linha lyrics = re.sub(‘<[Bb][Rr]/>‘, ”, lyrics) e adicione a seguinte linha abaixo dela: lyrics = lyrics.replace(‘&#039;’, ”’). Salve o arquivo e reinicie o Rhythmbox.

Bom, esses foram os ajustes que eu precisei fazer na minha nova instalação do Ubuntu 10.04 Lucid Lynx. Espero que sejam úteis para alguém. Abraços e até a próxima!