Escolar Documentos
Profissional Documentos
Cultura Documentos
Curso Completo de PHP PDO PDF
Curso Completo de PHP PDO PDF
Sejam todos bem vindos (as) ao curso de PDO PHP Data Objects
Requisito: Para comear o curso de PDO, aconselho que veja antes, todas as aulas do curso de
HTML, php, Banco de dados MYSQL.
Ttulo das Aulas + links abaixo:
Curso PDO Aula 01 Introduo
Curso PDO Aula 02 Conexo com PDO
Curso PDO Aula 03 Selecionando Dados com PDO
Curso PDO Aula 04 Cadastrando Dados com PDO
Curso PDO Aula 05 Deletando Dados com PDO
Curso PDO Aula 06 Atualizando Dados com PDO
Aula 01 Introduo
Hoje iremos comear nosso curso exclusivo de PDO (PHP Data Objects).
O PDO vem dominando o mercado no mundo dos programadores PHP, e por este motivo no pode
ficar para trs correto?
Neste curso iremos aprender a fazer um CRUD ( create | read | update | delete criar | ler | atualizar |
deletar) completo com PDO, e mais. Iremos tambm fazer comparaes com o modo primitivo do
PHP, assim todos ns iremos atender as diferenas entre ambos.
$user = "root";
$pass = "";
$bd = "banco_teste";
if($conexao){
mysql_select_db($bd) OR DIE ("Erro ao selecionar banco de dados:
".mysql_error());
}else{}
?>
De certa forma o modo primitivo menos complexo, e mais rpido de ser desenvolvido, contudo
existem desvantagens.
Uma delas a vulnerabilidade;
Outra questo o famoso cdigo macarro;
E mais uma a questo de tempo longo para mudanas de tipos de banco de dados.
Veja agora como criar sua conexo com banco de dados utilizando o PDO, baseando-se no exemplo
acima.
<?php
$host = "localhost";
$user = "root";
$pass = "";
$bd = "banco_teste";
/*O que o PDO pede na conexao?
ex: PDO($dsn,$user,$pass);
mais o que dsn ?
dsn = tipo_do_banco:host='seu_host';dbname='nome_do_seu_banco';
*/
$dsn = "mysql:host=".$host.";dbname=".$bd;
try{
return $conexao;
}catch(PDOException $error){
?>
setAttribute Define um atributo na declarao. Para ver a lista de atributos clique aqui.
PDO::ATTR_ERRMODE relatrio de erros.
PDO::ERRMODE_EXCEPTION - Atributo filho do atributo ATTR_ERRMODE , este representa
um erro gerado pelo PDO.
Endentendo os atributos
Quando voc define um atributo no PDO, os prprios possuem valores padres, e filhos nicos.
A sintaxe para a utilizao funciona da seguinte forma:
setAttribute(atributo, filho_do_atributo);
Para isso, veja a lista abaixo , que seta os atributos , e seus filhos alheios.
1. PDO::ATTR_CASE nomes de colunas fora para um caso especfico.
o Filhos do atributo PDO::ATTR_CASE
o PDO::CASE_LOWER Fora nomes de coluna para minsculas.
o PDO::CASE_NATURAL nomes de colunas deixar como retornados pelo
driver de banco de dados.
o PDO::CASE_UPPER nomes de colunas fora para maisculas.
2. PDO:: ATTR_ERRMODE relatrio de erros.
o Filhos do atributo PDO :: ATTR_ERRMODE
o PDO::ERRMODE_SILENT Basta definir cdigos de erro.
o PDO::ERRMODE_WARNING Levante E_WARNING.
o PDO::ERRMODE_EXCEPTION Throw excees.
3. PDO::ATTR_ORACLE_NULLS (disponvel com todos os drivers, e no apenas da
Oracle): Converso de strings nulas e vazias.
o Filhos do atributo PDO :: ATTR_ORACLE_NULLS
o PDO::NULL_NATURAL No converso.
o PDO::NULL_EMPTY_STRING string vazio convertido para NULL .
o PDO::NULL_TO_STRING NULL convertido para uma cadeia vazia.
Existem muitos atributos e seus alheios , para isso saiba mais no site do oficial do php clicando aqui.
Agora que sabemos mais sobre os atributos devemos saber sobre est linha:
}catch(PDOException $error){
O que o PDOException?
Ele representa um erro gerado pelo PDO.
Desta forma estamos atribuindo o erro gerado pelo PDO varivel $error.
Desta forma devemos apenas chamar a mensagem de error utilizando a varivel $error
Observem que para mostrar a mensagem de error gerada, eu utilizei:
$error->getMessage();
while($linha_alunos = mysql_fetch_array($query)){
echo $linha_alunos['nome_aluno']."<br />";
}
}else{}
?>
Simples no?
Lembrando que fizemos a incluso do arquivo de conexo da aula passada.
Se voc no visitou a aula passada clique aqui.
Agora que voc j sabe como funciona a seleo de dados utilizando o modo primitivo, iremos agora
fazer o mesmo utilizando o PDO.
Primeiramente iremos fazer uma seleo comum sem a utilizao de condies (WHERE).
function listar_alunos(){
try{
return $listar->fetchAll(PDO::FETCH_ASSOC);
}else{
}catch(PDOException $error){
echo "Error ao listar alunos: ".$error->getMessage();
}
}
$alunos = listar_alunos();
foreach($alunos as $aluno):
echo $aluno['nome_aluno']."<br />";
endforeach;
?>
Voc poderia tambm, utilizar o FETCH_OBJ ao invs de FETCH_ASSOC , contudo nosso foreach
ficaria desta forma:
foreach($alunos as $aluno):
echo $aluno->nome_aluno."<br />";
endforeach;
function listar_alunos(){
try{
return $listar->fetchAll(PDO::FETCH_OBJ);
}else{
}catch(PDOException $error){
echo "Error ao listar alunos: ".$error->getMessage();
}
}
$alunos = listar_alunos();
foreach($alunos as $aluno):
echo $aluno->nome_aluno."<br />";
endforeach;
?>
<?php
include_once("conexao.php");//inclusao do arquivo de conexao da aula
passada
function listar_alunos_com_condicao(){
try{
return $listar->fetch(PDO::FETCH_ASSOC);
}else{
}catch(PDOException $error){
echo "Error ao listar alunos: ".$error->getMessage();
}
}
$alunos = listar_alunos_com_condicao();
foreach($alunos as $aluno):
echo $aluno['nome_aluno']."<br />";
endforeach;
?>
Observem que no exemplo acima, eu no utilizei o fetchAll, mas sim apenas o fetch, pois estou
querendo retornar apenas um valor especfico informado em minha condio.
Lembrando tambm que ao invs de utilizar bindValue, podemos utilizar tambm bindParam, que ir
retornar o mesmo valor , contudo voc poder tambm especificar o tipo do parmetro ( type )
passado e o tamanho ( lenght ) .
Exemplo:
$listar->bindParam(":idade",$idade,PDO::PARAM_INT,3);
Desta forma estou especificando que o valor passado do tipo inteiro (PARAM_INT), e o tamanho
3. Ou seja, no existe pessoa com idade maior que 3 digitos correto? (Por favor, no inclua as
mmias neste rolo).
E para tipos strings? Como seria?
$listar->bindParam(":aluno_nome",$aluno_nome,PDO::PARAM_STR, 255);
function listar_alunos_com_condicao(){
try{
$idade = 15;
$listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = ?");
$listar->bindValue(1,$idade);
$listar->execute();
return $listar->fetch(PDO::FETCH_ASSOC);
}else{
}catch(PDOException $error){
echo "Error ao listar alunos: ".$error->getMessage();
}
}
$alunos = listar_alunos_com_condicao();
foreach($alunos as $aluno):
echo $aluno['nome_aluno']."<br />";
endforeach;
?>
function listar_alunos_com_condicao(){
try{
$idade = 15;
$sobrenome = "Alberto";
$listar->bindValue(2,$sobrenome);
$listar->execute();
return $listar->fetch(PDO::FETCH_ASSOC);
}else{
}catch(PDOException $error){
echo "Error ao listar alunos: ".$error->getMessage();
}
}
$alunos = listar_alunos_com_condicao();
foreach($alunos as $aluno):
echo $aluno['nome_aluno']."<br />";
endforeach;
?>
$nome = "Carlos";
$sobrenome = "Alberto";
$query = mysql_query($sql);
if($query){
echo "Aluno cadastrado com sucesso!";
}else{
echo "Erro ao cadastrar aluno.";
}
?>
<?php
include_once("conexao.php");
$nome = "Carlos";
$sobrenome = "Alberto";
try{
$cadastrar->bindValue(":nome",$nome);
$cadastrar->bindValue(":sobrenome",$sobrenome);
$cadastrar->execute;
if($cadastrar->rowCount() > 0){
}catch(PDOException $error){
echo "Erro ao cadastrar aluno: ". $error->getMessage();
}
?>
Lembrando, que com a utilizao do PDO, eu no precisei deixar o parmetro dentro de aspas
simples, como foi utilizado no modo primitivo.
Veja:
$cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome)
VALUES (:nome,:sobrenome)";
}else{
echo "Erro ao cadastrar aluno.";
try{
$cadastrar->bindValue(1,$nome);
$cadastrar->bindValue(2,$sobrenome);
$cadastrar->execute;
if($cadastrar->rowCount() > 0){
}catch(PDOException $error){
echo "Erro ao cadastrar aluno: ". $error->getMessage();
}
?>
<?php
include_once("conexao.php");
$nome = "Carlos";
$sobrenome = "Alberto";
$dados = array(
'nome'=> $nome,
'sobrenome'=> $sobrenome
);
try{
$cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome)
VALUES (:nome,:sobrenome)";
foreach($dados as $indice => $valor):
$cadastrar->bindValue(":$indice",$valor);
endforeach;
$cadastrar->execute;
if($cadastrar->rowCount() > 0){
}catch(PDOException $error){
echo "Erro ao cadastrar aluno: ". $error->getMessage();
}
?>
<?php
include_once("conexao.php");
$nome = "Carlos";
$sobrenome = "Alberto";
$dados = array(
1=> $nome,
2=> $sobrenome
);
try{
$cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome)
VALUES (?,?)";
foreach($dados as $indice => $valor):
$cadastrar->bindValue($indice,$valor);
endforeach;
$cadastrar->execute;
if($cadastrar->rowCount() > 0){
}catch(PDOException $error){
echo "Erro ao cadastrar aluno: ". $error->getMessage();
}
?>
$matricula = $_GET['matricula'];
$sql = "DELETE * FROM alunos WHERE matricula = '$matricula'";
$query = mysql_query($sql);
if($query){
echo "Aluno deletado com sucesso!";
}else{
echo "No foi possvel deletar o aluno.";
}
?>
Lembrou como era utilizado o modo primitivo do php ? Agora , veja o mesmo utilizando PDO.
DELETANDO UTILIZANDO O PDO
<?php
include_once("conexao.php");
try{
$matricula = $_GET['matricula'];
$deletar->execute();
if($deletar->rowCount() > 0){
echo "Aluno deletado com sucesso!";
}else{
echo "No foi possvel deletar o aluno.";
}
}catch(PDOException $error){
?>
try{
$matricula = $_GET['matricula'];
$deletar->execute();
}else{
echo "No foi possvel deletar o aluno.";
}
}catch(PDOException $error){
?>
Simples, e descomplicado.
$matricula = $_POST['matricula'];
$nome = $_POST['nome'];
$sobrenome = $_POST['sobrenome'];
sobrenome = '$sobrenome'
WHERE
matricula = '$matricula'
";
$query = mysql_query($sql);
if($query){
echo "Aluno atualizado com sucesso!";
}else{
echo "Erro ao atualizar aluno.";
}
?>
<?php
include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/
$matricula = $_POST['matricula'];
$nome = $_POST['nome'];
$sobrenome = $_POST['sobrenome'];
sobrenome = :sobrenome
WHERE
matricula = :matricula
");
$atualizar->bindValue(":nome",$nome);
$atualizar->bindValue(":sobrenome",$sobrenome);
$atualizar->bindValue(":matricula",$matricula);
$atualizar->execute;
?>
<?php
include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/
$matricula = $_POST['matricula'];
$nome = $_POST['nome'];
$sobrenome = $_POST['sobrenome'];
sobrenome = ?
WHERE
matricula = ?");
$atualizar->bindValue(1,$nome);
$atualizar->bindValue(2,$sobrenome);
$atualizar->bindValue(3,$matricula);
$atualizar->execute;
}else{
echo "Erro ao atualizar aluno.";
}
?>
Pergunta: Poderamos utilizar arrays para fazer tal atualizao? Seria timo para realizar mltiplas
atualizaes de dados correto?
Resposta: Sim, podemos utilizar arrays. E, sim seria timo para manipulao mltipla de dados.
EXEMPLO UTILIZANDO ARRAY SEM A UTILIZAO DOS PONTOS DE INTERROGAO.
<?php
include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/
$matricula = $_POST['matricula'];
$nome = $_POST['nome'];
$sobrenome = $_POST['sobrenome'];
$dados = array(
'nome'=>$nome,
'sobrenome'=>$sobrenome,
'matricula'=>$matricula
);
sobrenome = :sobrenome
WHERE
matricula = :matricula
");
endforeach;
$atualizar->execute;
?>
$matricula = $_POST['matricula'];
$nome = $_POST['nome'];
$sobrenome = $_POST['sobrenome'];
$dados = array(
1=>$nome,
2=>$sobrenome,
3=>$matricula
);
sobrenome = ?
WHERE
matricula = ?");
foreach($dados as $indice => $valor):
$atualizar->bindValue($indice,$valor);
endforeach;
$atualizar->execute;
}else{
echo "Erro ao atualizar aluno.";
}
?>