PDO - Parte 2 - Classe para manipular uma tabela

Postado por Paulo Brito em 13 de Setembro de 2010  •  Comentários (3)  • 

No primeiro código foi criado uma classe para conectar no banco de dados utilizando a extensão PDO. Agora vamos criar uma classe para manipular os dados de uma tabela.

O nosso exemplo aqui é uma classe para um sistema de produtos. Inicialmente é declarado todos os campos da tabela como atributos na classe. Os estão com visibilidade PROTECTED, ou seja, é proibido modificar o valor desse atributo fora da classe. Apenas é possível modificar o valor dentro da própria classe ou da classe que herda esses atributos.

Então como podemos modificar os valores desses atributos? Para setar e ler os atributos são utilizados os SETs e GETs. Que vai servir para fora da classe eu modificar esses atributos.

Na sequência vem o primeiro método da classe o "__construct" esse método é executado assim que a classe é instanciada.

Outros métodos são utilizados como:
conta: que serve para contar o número de registros no banco
select: retornar os registros
insert: inserir novo registro
update: atualizar registros
delete: remover um determinado registro
tooglePreco: apenas modifica uma flag na tabela
toogleOculto: apenas modifica uma flag na tabela


Veja que em alguns métodos eu utilizo os prepared statements e em outros não. Lembre-se que a utilização com prepared statements é mais seguro.

Por exemplo, no método "select" eu não estou usando "prepared statements", mas nesse select eu NUNCA passo nenhum campo que o usuário digitou, como por exemplo uma busca.

Caso fosse utilizar alguma string que o usuário vai me passar, obrigatoriamente estaria usando o prepared statements, como é feito no métodos de insert, update e etc.

Caso fosse necessário fazer a busca, seria necessário criar um novo método:

public function buscar($string) {
$sql = "SELECT * FROM produtos WHERE nome LIKE '%?%';
$stmt = $this->conexao->prepare($sql);
$stmt->bindValue(1,$string);
...
}

Dessa forma, a string passada pelo usuário seria passado de forma segura a consulta SQL evitando SQL Injection.


  • Download
  • Código fonte
  • Comentar
  • Comentários
blog comments powered by Disqus

Comentários ir para topo

Paulo Brito (paulocamboim) disse: | 21 de Abril de 2011 as 03:03:47

Vamos por parte,

Log

A parte do log realmente esta faltando, eu vou postar como pdo-parte5, veja que na linha "$log = new log()" ele ta chamando uma classe criada anteriomente, entao essa classe precisa esta sendo chamanda nos inclues tambem.

Esse log apenas adiciona em uma tabela, o que a pessoa fez, ou seja, ela guarda o IP, qual linha foi modificada no banco de dados, diz qual foi a ação (insert, update, delete).

Erro Ao adicionar

Geralmente quando voce ta trabalhando com a classes e o metodo que adiciona mostra um erro, eh muito dificil dizer qual foi erro sem fazer um "debug". Esses erros geralmente sao devidos a pequenos erros de SQL como por exemplo uma virguala a mais, um campo digitado errado e etc. Acontence tambem de as vezes colocar mais "?" na parte de VALUES do que no CAMPOS e vice-versa.

Para saber qual o erro que esta acontencendo. Adicione essa linha abaixo de:
$stmt->execute();
print_r($stmt->errorInfo()); // Mais informacoes no manual: http://php.net/manual/en/pdo.errorinfo.php

Desse jeito quando for adicionar, ele vai mostrar o erro que aconteceu. Se na pagina que faz a insercao no banco de dados tiver um ""header()..." apenas comente para testar.

Verificar se tal registro existe

Para verificar se um registro existe antes de adicionar, existem duas formas:
1. Na propria tabela mysql, voce pode dizer que aquele campo EH UNICO, ou seja, caso vc tente adicionar ele vai te retornar um erro.
2. Fazendo a verificacao no proprio codigo PHP.
Nesse caso dentro do metodo Insert(), voce deve fazer um select, e verificar se tal registro existe. Exemplo:

try {

// Pra voce ver a saida desse SQL e saber se ta tudo ok, basta da um echo no
// metodo select dessa classe
$qtd = this->select(" AND codigo =". this->getCodigo() );

if sizeof($qtd) > 0 { echo " Esse registro ja existe, entao nao vou fazer nada!" }
else {


$sql = "INSER INTO produtos (codigo_produto,nome_produto,
tipo_produto, status) VALUES (?,?,?,?)";
$stmt = $this->conexao->prepare($sql);
$stmt->bindValue(1,$produto->getCodigo());
$stmt->bindValue(2,$produto->getNome());
$stmt->bindValue(3,$produto->getTipo());
$stmt->bindValue(4,$produto->getStatus());
$stmt->execute();
}
....

Espero ter ajudado, qualquer duvida pode mandar...

Valeu

Paulo Brito (paulocamboim) disse: | 21 de Abril de 2011 as 03:02:11

Segue duvida que recebi por email:

Paulo boa tarde.

Estou estudando este artigo e fazendo algumas alterações para minha realidade.
Gostaria se saber como seria o código para testar se um item que o usuário está inserindo já existe do banco de dados.
Na classe atual ao fazer o INSERT retorna uma mensagem "erro ao adicionar" eu sei que o ítem já existe na base de dados.
Porém gostaria de verificar antes de fazer a inclusão e retornar uma mensagem mais clara.
Conto com sua ajuda obrigado.

public function insert(Produto $produto) {

try {
$sql = "INSER INTO produtos (codigo_produto,nome_produto,tipo_produto, status) VALUES (?,?,?,?)";
$stmt = $this->conexao->prepare($sql);
$stmt->bindValue(1,$produto->getCodigo());
$stmt->bindValue(2,$produto->getNome());
$stmt->bindValue(3,$produto->getTipo());
$stmt->bindValue(4,$produto->getStatus());
$stmt->execute();
$id = $this->conexao->lastInsertId();

/* // Criar log
$log = new Log();
$log->setEvento(INSERT);
$log->setIdAdmin($_SESSION["idAdmin"]);
$log->setTabela("produtos");
$log->setRegistro($id);
$log->insert($log);
*/
return $id;
}
catch ( PDOException $ex ){ echo "Error: ".$ex->getMessage(); }
}


Outra pergunta não conseguí entender a criação do LOG, acho que falta alguma coisa pois está dando na classe aí eu comentei as linhas de LOG.


(bonfim) José L. Bonfim
Belo Horizonte - MG

Anônimo disse: | 18 de Abril de 2011 as 14:58:53

Paulo Brito, como eu faria para verificar se um dados inserido pelo usuário já foi cadastrado no banco?. No modelo que estou adaptando para minha realidade me retorna a mensagem "Erro ao adicionar". Pode ser uma série de fatores. Caso o item a ser inserido existir na base de dados eu gostaria de retornar a mensagem "Item já cadastrado na base de dados". Obrigado pelo artigo. Está sendo de grande ajuda para mim.Bonfim -Belo Horizonte-MG.

Código fonte ir para topo