Getho 0 Denunciar post Postado Agosto 28, 2014 Olá pessoal tentando fazer um CRUD com PDO com o seguinte: possuo um banco: corridacom 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
AndrePls 6 Denunciar post Postado Agosto 28, 2014 Certo, mas qual é a sua dúvida? Compartilhar este post Link para o post Compartilhar em outros sites
Getho 0 Denunciar post Postado Agosto 28, 2014 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
AndrePls 6 Denunciar post Postado Agosto 28, 2014 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
Getho 0 Denunciar post Postado Agosto 28, 2014 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
WellingtonSilva 4 Denunciar post Postado Agosto 28, 2014 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 0 Denunciar post Postado Agosto 29, 2014 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
Getho 0 Denunciar post Postado Agosto 31, 2014 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