Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Getho

CRUD com PDO

Recommended Posts

Olá pessoal tentando fazer um CRUD com PDO com o seguinte:

possuo um banco: corrida
com as tabelas:

CREATE TABLE IF NOT EXISTS `tcorrida` (
  `id_tCorrida` int(11) NOT NULL AUTO_INCREMENT,
  `nome_tCorrida` varchar(50) NOT NULL,
  `classificacao_tCorrida` varchar(50) NOT NULL,
  `ref_tCorrida` varchar(50) NOT NULL,
  `meta_tCorrida` char(2) NOT NULL,
  PRIMARY KEY (`id_tCorrida`),
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `usuario` (
  `id_usuario` int(11) NOT NULL AUTO_INCREMENT,
  `nome_usuario` varchar(50) NOT NULL,
  `sobrenome_usuario` varchar(50) NOT NULL,
  `email_usuario` varchar(80) NOT NULL,
  `senha_usuario` varchar(255) NOT NULL,
  `tele_usuario` varchar(11) DEFAULT NULL,
  `cel_usuario` varchar(11) NOT NULL,
  `skype_usuario` varchar(50) DEFAULT NULL,
  `icq_usuario` varchar(50) DEFAULT NULL,
  `wattsapp_usuario` varchar(11) DEFAULT NULL,
  `endereco_usuario` varchar(80) NOT NULL,
  `cidade_usuario` varchar(50) DEFAULT NULL,
  `estado_usuario` varchar(2) NOT NULL,
  `pais_usuario` varchar(10) NOT NULL,
  PRIMARY KEY (`id_usuario`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Estou quebrado a cabeça pra fazer um CRUD com PDO, para que fique antSQL injection.
Mas não estou conseguindo.

Quero fazer em duas classes:
Uma abstrataBanco: e outra banco:

na abstrata por equanto tenho:

<?php
/*CRUD*/
class AbstrataBanco extends banco {

    protected $tabela;
    protected $campo;
    protected $key;

    /**
     * @param mixed $tabela
     */
    public function setTabela($tabela)
    {
        $this->tabela = $tabela;
    }

    /**
     * @return mixed
     */
    public function getTabela()
    {
        return $this->tabela;
    }

    /**
     * @param mixed $key
     */
    public function setKey($key)
    {
        $this->key = $key;
    }

    /**
     * @return mixed
     */
    public function getKey()
    {
        return $this->key;
    }

    /**
     * @param mixed $campo
     */
    public function setCampo($campo)
    {
        $this->campo = $campo;
    }

    /**
     * @return mixed
     */
    public function getCampo()
    {
        return $this->campo;
    }



    protected function listar() {
        $pdo = new PDO(self::getDB());

        $pdo->exec("SELECT * FROM ".self::getTabela." WHERE".self::getCampo." = ".self::getKey);
        $pdo->bindValue();
        $pdo->execute();
    }

    protected function alterar() {
        
    }

    protected function deletar() {
        
    }

    protected function cadastrar() {
        
    }
    
}


E na banco tenho:

<?php

abstract class banco {

    const USER = "usuario";
    const PASS = "senha";

    private static $instance = null;

    private static function conectar() {

        try {   ##Tenta conectar ao banco se não funcionar cai no catch
            if (self::$instance == null): ##se não existir conexão com PDO receber a new PDO() | a conexão
                $dsn = "mysql:host=localhost;dbname=corrida";
                self::$instance = new PDO($dsn, self::USER, self::PASS);
            endif;
        } catch (PDOException $e) {
            echo "Erro: " . $e->getMessage(); #
        }
        return self::$instance; ## se ja exixtir uma conexão ele retorna a conexão
    }

    protected static function getDB() {
        return self::conectar();
    }

}
?>

Gostaria de fazer o CRUD dentro da classe bancoAbstrata()
usando o getters e fazer os setters onde for exibir os resultados ou busca valores.

Alguém disposto a me dar uma força >>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, mas qual é a sua dúvida?

Como eu faço esse CRUD:

    protected function listar() {
        $pdo = new PDO(self::getDB());

        $pdo->exec("SELECT * FROM ".self::getTabela." WHERE".self::getCampo." = ".self::getKey);
        $pdo->bindValue();
        $pdo->execute();
    }

    protected function alterar() {
        
    }

    protected function deletar() {
        
    }

    protected function cadastrar() {
        
    }
    
}

ou seja para que eu possa criar e chama-la nas paginas,

por exemplo quero cria este CRUD dinamico para, passar parametros detro de cada () do crud para fazê-lo.

 

EX:

na pagina index.php => onde eu quiser exibir a informação apenas eu chamo o listar($tabela, $campo, $key), e ele exibe os resultados.

 

Essa é minha duvida. Não estou conseguindo fazer isso que mensionei acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O correto seria assim amigo:

$pdo->prepare("SELECT * FROM tabela WHERE :campo = :key");
$pdo->bindValue(':campo', self::getCampo());
$pdo->bindValue(':key', self::getKey());
$pdo->fetch(PDO::FETCH_OBJ);

Da uma estudada nesse código, se quiser, estude DAO & VO, acho que é isso que está procurando...

 

Aqui:

http://phpbr.wordpress.com/2007/02/06/abstracao-de-base-de-dados-utilizando-dao/

Compartilhar este post


Link para o post
Compartilhar em outros sites

O correto seria assim amigo:

$pdo->prepare("SELECT * FROM tabela WHERE :campo = :key");
$pdo->bindValue(':campo', self::getCampo());
$pdo->bindValue(':key', self::getKey());
$pdo->fetch(PDO::FETCH_OBJ);

Da uma estudada nesse código, se quiser, estude DAO & VO, acho que é isso que está procurando...

 

Aqui:

http://phpbr.wordpress.com/2007/02/06/abstracao-de-base-de-dados-utilizando-dao/

 

Vou dar uma estruturada melhor nesse codigo pra verificar possiveis erros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Getho,

 

Eu faço assim:

 

PARA CONSULTA:

$sql = $conexao->prepare("SELECT * FROM login WHERE login = ?"); 
$sql->bindvalue(1, $_POST['login'], PDO::PARAM_STR); 
$sql->execute();

PARA INSERÇÃO e/ou UPLOAD

$stmt = $conexao->prepare('INSERT INTO chamados(datach, hora, colaborador) VALUES (:datach, :hora, :colaborador)'); 
$stmt->execute(array( 
	':datach' => $datach,
	':hora' => $hora,
	':colaborador' => $colaborador ));

Não sei se a forma mais correta, mas é segura.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Getho,

 

Eu faço assim:

 

PARA CONSULTA:

$sql = $conexao->prepare("SELECT * FROM login WHERE login = ?"); 
$sql->bindvalue(1, $_POST['login'], PDO::PARAM_STR); 
$sql->execute();

PARA INSERÇÃO e/ou UPLOAD

$stmt = $conexao->prepare('INSERT INTO chamados(datach, hora, colaborador) VALUES (:datach, :hora, :colaborador)'); 
$stmt->execute(array( 
	':datach' => $datach,
	':hora' => $hora,
	':colaborador' => $colaborador ));

Não sei se a forma mais correta, mas é segura.

 

Abraço!

Certinho estou analizado, minhas codificações....

Valeu

Assim que tiver ok. do um retorno aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal fiz este genérico OO a algum tempo, mas queria fazê-lo em PDO.

Alguém saberia me dizer como fazer.

 

Nesse aqui funciona em qualquer tabela.

<?php

abstract class banco {

    //propriedades
    public $servidor = "localhost";
    public $usuario = "usuario";
    public $senha = "senha";
    public $nomebanco = "crud";
    public $conexao = NULL;
    public $dataset = NULL;
    public $linhasafetadas = -1;

    //métodos
    public function __construct() {
        $this->conecta();
    }

//contruct --controi o metodo.

    public function __destruct() {
        if ($this->conexao != NULL):
            mysql_close($this->conexao);
        endif;
    }

//destrct --Destroi o metodo criado.

    public function conecta() {
        $this->conexao = mysql_connect($this->servidor, $this->usuario, $this->senha, TRUE) or die($this->trataerro(__FILE__, __FUNCTION__, mysql_errno(), mysql_error(), TRUE));
        mysql_select_db($this->nomebanco) or die($this->trataerro(__FILE__, __FUNCTION__, mysql_errno(), mysql_error(), TRUE));
        mysql_query("SET NAMES 'utf8'");
        mysql_query("SET character_set_connection=utf8");
        mysql_query("SET character_set_client=utf8");
        mysql_query("SET character_set_results=utf8");
        ##echo "O metodo conecta foi chamado";
    }

//conecta
    //Para inserir dados ao banco de dados

    public function inserir($objeto) {
        $sql = "INSERT INTO " . $objeto->tabela . " (";
        for ($i = 0; $i < count($objeto->campos_valores); $i++):
            $sql.= key($objeto->campos_valores);
            if ($i < (count($objeto->campos_valores) - 1)):
                $sql .= ", ";
            else:
                $sql .= ") ";
            endif;
            next($objeto->campos_valores);
        endfor;
        //Resetando os valores...
        reset($objeto->campos_valores);
        $sql .= "VALUES (";
        for ($i = 0; $i < count($objeto->campos_valores); $i++):
            $sql.= is_numeric($objeto->campos_valores[key($objeto->campos_valores)]) ?
                    $objeto->campos_valores[key($objeto->campos_valores)] :
                    "'" . $objeto->campos_valores[key($objeto->campos_valores)] . "'";
            if ($i < (count($objeto->campos_valores) - 1)):
                $sql .= ", ";
            else:
                $sql .= ") ";
            endif;
            next($objeto->campos_valores);
        endfor;
        return $this->executaSQL($sql);
    }

//fim função inserir
    //Atualizar Banco de dados

    public function atualizar($objeto) {
        $sql = "UPDATE " . $objeto->tabela . " SET ";
        for ($i = 0; $i < count($objeto->campos_valores); $i++):
            $sql.= key($objeto->campos_valores) . "=";
            $sql.= is_numeric($objeto->campos_valores[key($objeto->campos_valores)]) ?
                    $objeto->campos_valores[key($objeto->campos_valores)] :
                    "'" . $objeto->campos_valores[key($objeto->campos_valores)] . "'";
            if ($i < (count($objeto->campos_valores) - 1)):
                $sql .= ", ";
            else:
                $sql .= " ";
            endif;
            next($objeto->campos_valores);
        endfor;
        $sql .= "WHERE " . $objeto->campopk . "=";
        $sql .= is_numeric($objeto->campopk) ? $objeto->valorpk :
                "'" . $objeto->valorpk . "'";
        return $this->executaSQL($sql);
    }

// fim atualizar sql
    //Deletar dados do banco

    public function deletar($objeto) {
        $sql = "DELETE FROM " . $objeto->tabela;
        $sql .= " WHERE " . $objeto->campopk . "=";
        $sql .= is_numeric($objeto->campopk) ? $objeto->valorpk :
                "'" . $objeto->valorpk . "'";

        return $this->executaSQL($sql);
    }

//Fim deletar
    //Seleciona tudo

    public function selecionaTudo($objeto) {
        $sql = "SELECT * FROM " . $objeto->tabela;
        if ($objeto->extras_select != NULL):
            $sql .= " " . $objeto->extras_select;
        endif;
        return $this->executaSQL($sql);
    }

//Fim selecionaTudo
    //Seleciona campos

    public function selecionaCampos($objeto) {
        $sql = "SELECT ";
        for ($i = 0; $i < count($objeto->campos_valores); $i++):
            $sql.= key($objeto->campos_valores);
            if ($i < (count($objeto->campos_valores) - 1)):
                $sql .= ", ";
            else:
                $sql .= " ";
            endif;
            next($objeto->campos_valores);
        endfor;

        $sql .= " FROM " . $objeto->tabela;
        if ($objeto->extras_select != NULL):
            $sql .= " " . $objeto->extras_select;
        endif;
        return $this->executaSQL($sql);
    }

//Fim selecionaCampos
    //Rotina de inserção de SQL

    public function executaSQL($sql = NULL) {
        if ($sql != NULL):
            $query = mysql_query($sql) or $this->trataerro(__FILE__, __FUNCTION__);
            $this->linhasafetadas = mysql_affected_rows($this->conexao);
            if (substr(trim(strtolower($sql)), 0, 6) == 'select'):
                $this->dataset = $query;
                return $query;
            else:
                return $this->linhasafetadas;
            endif;
        else:
            $this->trataerro(__FILE__, __FUNCTION__, 'Comando SQL nao informado na rotina', FALSE);
        endif;
    }

// fim executaSQL
    //RetornaSQL dados

    public function retornaDados($tipo = NULL) {
        switch (strtolower($tipo)):
            case "array":
                return mysql_fetch_array($this->dataset);
                break;
            case "assoc":
                return mysql_fetch_assoc($this->dataset);
                break;
            case "object":
                return mysql_fetch_object($this->dataset);
                break;
            default:
                return mysql_fetch_object($this->dataset);
                break;
        endswitch;
    }

//Fim retornaDados

    public function trataerro($arquivo = NULL, $rotina = NULL, $numerro = NULL, $msgerro = NULL, $geraexcept = FALSE) {
        if ($arquivo == NULL)
            $arquivo = "nao informado";
        if ($rotina == NULL)
            $rotina = "nao informada";
        if ($numerro == NULL)
            $numerro = mysql_errno($this->conexao);
        if ($msgerro == NULL)
            $msgerro = mysql_error($this->conexao);
        $resultado = 'Ocorreu um erro com os seguintes detalhes:<br />
						  <strong>Arquivo:</strong> ' . $arquivo . '<br />
						  <strong>Rotina:</strong> ' . $rotina . '<br />
						  <strong>Codigo:</strong> ' . $numerro . '<br />
						  <strong>Mensagem:</strong> ' . $msgerro;
        if ($geraexcept == FALSE):
            echo($resultado);
        else:
            die($resultado);
        endif;
    }

//tratamento
}

//Fim classe banco
?>

A classe base:

<?php

require_once("banco.class.php");

abstract class base extends banco {

    //Propriedades
    public $tabela = "";
    public $campos_valores = array();
    public $campopk = NULL; //pk primary key ou chave primaria
    public $valorpk = NULL;
    public $extras_select = "";

    //metodos
    //Adicionar campo na tabela
    public function addCampo($campo = NULL, $valor = NULL) {
        if ($campo != NULL):
            $this->campos_valores[$campo] = $valor; //$valor que for passado
        endif;
    }

//fim addCampo
    //Deleta campo

    public function delCampo($campo = NULL) {
        if (array_key_exists($campo, $this->campos_valores)):
            unset($this->campos_valores[$campo]);
        endif;
    }

//fim delCampo.
    //Seta valor	

    public function setValor($campo = NULL, $valor = NULL) {
        if ($campo != NULL && $valor != NULL):
            $this->campos_valores[$campo] = $valor;
        endif;
    }

//fim setvalor
    //getValor

    public function getValor($campo = NULL) {
        if ($campo != NULL && array_key_exists($campo, $this->campos_valores)):
            return $this->campos_valores[$campo];
        else:
            return FALSE;
        endif;
    }

// fim getvalor
}

//fim classe base.
?>

E a classe cliente, ou qualquer outra classe:

<?php

require_once("base.class.php");

class clientes extends base {

    //Contruct
    public function __construct($campos = array()) {
        parent::__construct();
        $this->tabela = "clientes";
        if (sizeof($campos) <= 0):
            $this->campos_valores = array(
                "nome" => NULL,
                "sobrenome" => NULL,
            );
        else:
            $this->campos_valores = $campos;
        endif;
        $this->campopk = "id";
    }

//construct
}

//fim classe clientes.
?>

Nesse caso é só fazer as devidas alterações e o CRUD fica funcional, teria como fazer com PDO de forma mais simplificada ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.