Desmistificando o PDO - PHP Data Object
Como utilizar PDO?
Para utilizar PDO, primeiro é instanciado um objeto da classe PDO, que representa a conexão com um banco. No construtor da classe, deve ser informado o chamado "DSN", que é uma string de conexão semelhante àquela vista anteriormente na função de conexão com PostgreSQL. Cada driver PDO especifica uma forma de como é montado o DSN para o SGBD correspondente. Além do DSN, também é informado, por parâmetro, o usuário, a senha de acesso e as opções adicionais.
Após abrir uma conexão, as consultas podem ser feitas de duas maneiras:
1 - Através da própria conexão, com o método "exec" ou o "query";
2 - Montando uma prepared statement com o método "prepare", que devolve um objeto da classe PDOStatement, e depois executando o método "execute" (desta classe).
O método "query" é utilizado para consultas que retornam resultados tabulares (como o SELECT) e devolve um objeto da classe PDOStatement com o resultado. Já o método "exec" é utilizado para consultas que não retornam resultados tabulares (como o INSERT, UPDATE, DELETE) e retorna apenas o número de linhas afetadas.
Estes métodos são úteis para executar consultas fixas (não-variáveis). Afinal, se envolvessem valores recebidos do usuário, estes valores precisariam ser escapados através do método "quote" (para evitar falhas de segurança com SQL Injection).
Já o método "prepare" é útil para montar uma consulta com dados variáveis. É possível especificar uma SQL com pontos de substituição que, ao serem substituidos, são escapados pela classe automaticamente. Vejamos alguns exemplos:
Note que a classe PDOStatement (objeto $stmt) implementa a interface Traversable, indicando que ela pode ser percorrida por uma estrutura "foreach".
Existem diferentes formas de se executar uma prepared statement com PDO:
Prepared statements tendem a ser mais rápidas que as consultas convensionais, já que a consulta fica previamente "compilada" e pronta para execução com novos valores. Ao invés do SGBD interpretar toda a SQL, ele apenas atribui novos valores aos pontos chave e realiza a operação. Funcionalidade muito útil para inserções ou atualizações em massa em uma tabela.
Para utilizar PDO, primeiro é instanciado um objeto da classe PDO, que representa a conexão com um banco. No construtor da classe, deve ser informado o chamado "DSN", que é uma string de conexão semelhante àquela vista anteriormente na função de conexão com PostgreSQL. Cada driver PDO especifica uma forma de como é montado o DSN para o SGBD correspondente. Além do DSN, também é informado, por parâmetro, o usuário, a senha de acesso e as opções adicionais.
// Exemplo de conexao com MySQL via PDO
$dsn = 'mysql:host=host;port=3306;dbname=bd';
$usuario = 'usuario';
$senha = 'senha';
$opcoes = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_CASE => PDO::CASE_LOWER
);
try {
$pdo = new PDO($dsn, $usuario, $senha, $opcoes);
} catch (PDOException $e) {
echo 'Erro: '.$e->getMessage();
}
Após abrir uma conexão, as consultas podem ser feitas de duas maneiras:
1 - Através da própria conexão, com o método "exec" ou o "query";
2 - Montando uma prepared statement com o método "prepare", que devolve um objeto da classe PDOStatement, e depois executando o método "execute" (desta classe).
O método "query" é utilizado para consultas que retornam resultados tabulares (como o SELECT) e devolve um objeto da classe PDOStatement com o resultado. Já o método "exec" é utilizado para consultas que não retornam resultados tabulares (como o INSERT, UPDATE, DELETE) e retorna apenas o número de linhas afetadas.
Estes métodos são úteis para executar consultas fixas (não-variáveis). Afinal, se envolvessem valores recebidos do usuário, estes valores precisariam ser escapados através do método "quote" (para evitar falhas de segurança com SQL Injection).
Já o método "prepare" é útil para montar uma consulta com dados variáveis. É possível especificar uma SQL com pontos de substituição que, ao serem substituidos, são escapados pela classe automaticamente. Vejamos alguns exemplos:
// Usando "exec"
$inseriu = $pdo->exec('INSERT INTO logs (operacao) VALUES (1)');
$ultimo_id = $pdo->lastInsertId();
// Usando "query"
$stmt = $pdo->query('SELECT nome, login FROM usuarios');
// Percorrento um resultset com while
while ($obj = $stmt->fetchObject()) {
...
}
// Percorrendo um resultset com foreach
foreach ($stmt as $linha) {
...
}
Note que a classe PDOStatement (objeto $stmt) implementa a interface Traversable, indicando que ela pode ser percorrida por uma estrutura "foreach".
Existem diferentes formas de se executar uma prepared statement com PDO:
// 1 - Usando "?" nos pontos-chave
$stmt = $pdo->prepare('INSERT INTO usuarios (nome, login) VALUES (?,?)');
// Passando os valores a serem usados no primeiro e segundo "?"
$dados = array('Rubens', 'rubens');
$consultou = $stmt->execute($dados);
// 2 - Usando pontos-chave nomeados
$stmt = $pdo->prepare('INSERT INTO usuarios (nome, login) VALUES (:nome, :login)');
// Passando os valores a serem usados em :nome e :login
array(':nome' => 'Rubens', ':login' => 'rubens');
$consultou = $stmt->execute($dados);
// 3 - Fazendo binding de parametros
$stmt = $pdo->prepare('INSERT INTO usuarios (nome, login) VALUES (:nome, :login)');
// Fazendo o binding
$nome = 'Rubens';
$login = 'rubens';
$stmt->bindParam(':nome', $nome, PDO::PARAM_STR, 128);
$stmt->bindParam(':login', $login, PDO::PARAM_STR, 20);
// Executando a SQL com os valores definidos com binding
$consultou = $stmt->execute();
Prepared statements tendem a ser mais rápidas que as consultas convensionais, já que a consulta fica previamente "compilada" e pronta para execução com novos valores. Ao invés do SGBD interpretar toda a SQL, ele apenas atribui novos valores aos pontos chave e realiza a operação. Funcionalidade muito útil para inserções ou atualizações em massa em uma tabela.
Olá, venho aqui recomendar, para quem se interessar o uso de uma classe PDO de conexão, a qual já venho utilizando. Possui um repositório no github para poder baixar e utilizar em suas aplicações, ou simplesmente acompanhar e/ou compartilhar.
Segue link: http://bitly.com/PDO4You
Sugestões ou críticas, sempre são bem vindas e ajudam a tornar esta classe ainda melhor para benefício de todos e assim seja até quando o PHP existir. =D
Abraços.
Segue link: http://bitly.com/PDO4You
Sugestões ou críticas, sempre são bem vindas e ajudam a tornar esta classe ainda melhor para benefício de todos e assim seja até quando o PHP existir. =D
Abraços.
30/07/2011 10:15pm
(~6 meses atrás)
Rubens, obrigado pela resposta. Pensei que dava pra fazer algo como isto, ou seja, selecionar quais colunas retornar da consulta, mas pelo jeito devo fazer isso de outra forma.
quando tento iterar o objeto PDOStatement aparece algo como:
array
'?' => string 'telefone' (length=8)
0 => string 'nome' (length=4)
1 => string 'endereco' (length=8)
2 => string 'telefone' (length=8)
quando tento iterar o objeto PDOStatement aparece algo como:
array
'?' => string 'telefone' (length=8)
0 => string 'nome' (length=4)
1 => string 'endereco' (length=8)
2 => string 'telefone' (length=8)
26/03/2011 12:58pm
(~10 meses atrás)
Jairo, na verdade se utiliza os pontos chave para valores variáveis, por exemplo, valores informados pelo usuário.
Prepared Statement inclui aspas quando o conteúdo é string, portanto, seria gerada uma SQL inválida, já que não se informa os campos desejados de um SELECT delimitados por aspas.
Correto:
Errado:
Prepared Statement inclui aspas quando o conteúdo é string, portanto, seria gerada uma SQL inválida, já que não se informa os campos desejados de um SELECT delimitados por aspas.
Correto:
SELECT nome FROM usuarios;
Errado:
SELECT 'nome' FROM usuarios;
23/03/2011 5:50pm
(~10 meses atrás)
Muito bom artigo
Usando dessa forma:
$statement = $pdo->prepare('select ?,?,? from pessoa');
$columns = array('nome', 'endereco', 'telefone');
$statement->execute($columns);
// depois ler o resultado do objeto $statement
deveria funcionar ou existe um jeito de funcionar?
Usando dessa forma:
$statement = $pdo->prepare('select ?,?,? from pessoa');
$columns = array('nome', 'endereco', 'telefone');
$statement->execute($columns);
// depois ler o resultado do objeto $statement
deveria funcionar ou existe um jeito de funcionar?
23/03/2011 4:46pm
(~10 meses atrás)
Bom artigo, parabéns
Será quem já tem alguém traduzindo no manual do PHP a parte do PDO?
Será quem já tem alguém traduzindo no manual do PHP a parte do PDO?
22/03/2010 10:23pm
(~1 ano atrás)
Parabéns pelo artigo Rubens, muito bem explicadiiinho, legal gostei mesmo.
18/02/2010 12:15am
(~2 anos atrás)
conecta.php
<?php
//conecta ao banco de dados
pg_connect( "host=localhost port=5432 dbname=post user=nome_usuario
password=senha_do_banco" ) or die ( "Nao consegui conectar ao PostgreSQL" );
delete.php
?>
<?php include "conection.php"; $sql = pg_exec("DELETE FROM ."$_GET['table_db']." WHERE coment comentario= =".$_GET['coment'].";"); pg_close();
echo "Foi mal aew só para teste,
Eu uso o Postgresql. Mas isso é aula
é meu primeiro post :D
abraços aew a todos e parabens pela aula já estou aprendendo muito"?>
Se quiser apagar este post, tranquilo
<?php
//conecta ao banco de dados
pg_connect( "host=localhost port=5432 dbname=post user=nome_usuario
password=senha_do_banco" ) or die ( "Nao consegui conectar ao PostgreSQL" );
delete.php
?>
<?php include "conection.php"; $sql = pg_exec("DELETE FROM ."$_GET['table_db']." WHERE coment comentario= =".$_GET['coment'].";"); pg_close();
echo "Foi mal aew só para teste,
Eu uso o Postgresql. Mas isso é aula
é meu primeiro post :D
abraços aew a todos e parabens pela aula já estou aprendendo muito"?>
Se quiser apagar este post, tranquilo
09/02/2010 11:26pm
(~2 anos atrás)



disse:
Para exibir os resultados do while basta
$stmt = $pdo->query('SELECT nome, login FROM usuarios');
// Percorrento um resultset com while
while ($obj = $stmt->fetchObject()) {
$obj->nome; //campo que deseja exibir
}
Abraço!