Académique Documents
Professionnel Documents
Culture Documents
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.
O PHP Data Objects ( PDO ) define uma interface leve em PHP. Cada driver de banco de dados que implementa a interface PDO pode expor dados de recursos especficos. Note que voc no pode executar quaisquer funes de banco de dados usando a extenso PDO, por si s, voc deve usar um banco de dados especfico do driver PDO para acessar um servidor de banco de dados. PDO fornece um acesso de dados abstrato, o que significa que, independentemente de qual banco de dados voc est usando, voc usa as mesmas funes para emitir consultas e buscar dados (CRUD).
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{ $conexao = new PDO($dsn,$user,$pass); $conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $conexao; }catch(PDOException $error){ echo "Erro ao conectar com o banco de dados: ".$error->getMessage();
} ?>
A estrutura do dsn funciona da seguinte forma: ex: $dsn = tipo_do_banco:host=seu_host;dbname=nome_do_seu_banco; resultado: $dsn = mysql:host=localhost;dbname=banco_teste; At ai tudo bem mas o que quer dizer est linha:
$conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
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 Desta forma devemos apenas chamar a mensagem de error utilizando a varivel $error
$error.
if(mysql_num_rows($query) > 0){ 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).
}else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } } $alunos = listar_alunos();
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;
if($listar->rowCount() > 0){ return $listar->fetchAll(PDO::FETCH_OBJ); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } }
$alunos = listar_alunos();
foreach($alunos as $aluno): echo $aluno->nome_aluno."<br />"; endforeach; ?> <h3>SELEO COMPOSTA COM PDO</h3> A seleo composta j diferente, pois iremos utilizar <strong>condies</strong> , e devemos utilizar o <strong>prepare</strong> do PDO. O mtodo <strong>query</strong> utilizado apenas para selees comuns que no envolvem condies (WHERE). Exemplo de seleo composta: <?php include_once("conexao.php");//inclusao do arquivo de conexao da aula passada function listar_alunos_com_condicao(){ try{ $idade = 15;/*aqui defini a idade desejada para condicao*/ $listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = :idade"); $listar->bindValue(":idade",$idade);/*O bindValue protege os dados que voc est passando , seta o valor para o parametro.*/ $listar->execute();
if($listar->rowCount() > 0){ return $listar->fetch(PDO::FETCH_ASSOC); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } } $alunos = listar_alunos_com_condicao();
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);
J no exemplo acima, estou informando que o parmetro aluno_nome do tipo string(PARAM_STR) e o tamanho mximo de 255 caracteres. Caso queiram saber mais sobre bindParams clique aqui Agora, irei mostrar uma situao que muitos alunos tm dvida. O famoso ponto de interrogao. Quando passamos parmetros, podemos tambm utilizar o ponto de interrogao, e logo aps a posio do ndice que pretendemos atribuir o valor corrente. Exemplo:
<?php include_once("conexao.php"); function listar_alunos_com_condicao(){ try{ $idade = 15; $listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = ?"); $listar->bindValue(1,$idade); $listar->execute();
if($listar->rowCount() > 0){ return $listar->fetch(PDO::FETCH_ASSOC); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); }
} $alunos = listar_alunos_com_condicao();
Contudo, fica a pergunta. E se eu quisesse passar dois parmetros na condio? Como ficaria?
if($listar->rowCount() > 0){ return $listar->fetch(PDO::FETCH_ASSOC); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } } $alunos = listar_alunos_com_condicao();
if($query){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } ?>
Vejam que o cadastro do primitivo fica totalmente vulnervel. Veja agora, o exemplo acima utilizando PDO.
CADASTRANDO UTILIZANDO PDO
<?php include_once("conexao.php");
try{ $cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome) VALUES (:nome,:sobrenome)"; $cadastrar->bindValue(":nome",$nome); $cadastrar->bindValue(":sobrenome",$sobrenome); $cadastrar->execute; if($cadastrar->rowCount() > 0){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } }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)";
Resposta: No! O rowCount , neste caso est com a funo do antigo mysql_affected_rows, que retorna o nmero de linhas afetadas. Em nosso caso, 1 cadastrado foi executado com sucesso , resultando ento na mensagem Aluno cadastrado com sucesso!; Lembrando que poderamos tambm fazer nosso cadastro utilizando os pontos de interrogao. Exemplo:
<?php include_once("conexao.php");
try{ $cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome) VALUES (?,?)"; $cadastrar->bindValue(1,$nome); $cadastrar->bindValue(2,$sobrenome); $cadastrar->execute; if($cadastrar->rowCount() > 0){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } }catch(PDOException $error){ echo "Erro ao cadastrar aluno: ". $error->getMessage(); } ?>
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){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } }catch(PDOException $error){ echo "Erro ao cadastrar aluno: ". $error->getMessage(); } ?>
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){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno.";
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 = $conexao->prepare("DELETE * FROM alunos WHERE matricula = :matricula"); $deletar->bindValue(":matricula",$matricula); $deletar->execute();
if($deletar->rowCount() > 0){ echo "Aluno deletado com sucesso!"; }else{ echo "No foi possvel deletar o aluno."; } }catch(PDOException $error){ echo "Error ao deletar aluno: ". $error->getMessage(); } ?>
LEMBRANDO TAMBM, QUE PODERIAMOS UTILIZAR OS FAMOSOS PONTOS DE INTERROGAO PARA DELETAR. Exemplo:
< ?php include_once("conexao.php"); try{ $matricula = $_GET['matricula']; $deletar = $conexao->prepare("DELETE * FROM alunos WHERE matricula = ?"); $deletar->bindValue(1,$matricula); $deletar->execute();
if($deletar->rowCount() > 0){ echo "Aluno deletado com sucesso!"; }else{ echo "No foi possvel deletar o aluno."; } }catch(PDOException $error){ echo "Error ao deletar aluno: ". $error->getMessage(); } ?>
Simples, e descomplicado.
Na aula de hoje aprenderemos a atualizar os dados utilizando o PDO. Mantendo a rotina exposta em todas as aulas do curso, primeiramente irei mostrar o modo tradicional ou primitivo do php. Logo aps, o mesmo exemplo utilizando o PDO.
$sql = "UPDATE alunos SET nome = '$nome', sobrenome = '$sobrenome' WHERE matricula = '$matricula' "; $query = mysql_query($sql);
if($query){ echo "Aluno atualizado com sucesso!"; }else{ echo "Erro ao atualizar aluno."; } ?>
if($atualizar->rowCount() > 0){ echo "Aluno atualizado com sucesso!"; }else{ echo "Erro ao atualizar aluno."; } ?>
$atualizar = $conexao->prepare("UPDATE alunos SET nome = ?, sobrenome = ? WHERE matricula = ?"); $atualizar->bindValue(1,$nome); $atualizar->bindValue(2,$sobrenome); $atualizar->bindValue(3,$matricula); $atualizar->execute;
echo "Aluno atualizado com sucesso!"; }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'];
$atualizar = $conexao->prepare("UPDATE alunos SET nome = :nome, sobrenome = :sobrenome WHERE matricula = :matricula "); foreach($dados as $indice => $valor): $atualizar->bindValue(":$indice",$valor); endforeach; $atualizar->execute;
$atualizar = $conexao->prepare("UPDATE alunos SET nome = ?, sobrenome = ? WHERE matricula = ?"); foreach($dados as $indice => $valor): $atualizar->bindValue($indice,$valor); endforeach; $atualizar->execute;
if($atualizar->rowCount() > 0){ echo "Aluno atualizado com sucesso!"; }else{ echo "Erro ao atualizar aluno."; } ?>