jnejunior 1 Denunciar post Postado Agosto 31, 2012 e ai galera... gostaria de saber a opinião de vocês sobre minha função de inserção no banco. gostaria de saber se ela é funcional, se é segura, o que pode ser melhorado, e se os dados precisam ser tratados na função, ou na passagem dos para a mesma... desde já agradeço... function inserir($tabela, array $dados) { $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); $campos = implode(', ', array_keys($dados)); $sql = "INSERT INTO {$tabela} ($campos) VALUES ("; foreach ($dados as $campo => $valor) : $sql .= is_numeric($valor) ? $valor : "'" . $valor . "'"; $sql .= $i < (count($dados) - 1) ? ', ' : ''; $i++; endforeach; $sql .= ")"; try { $qr = $pdo -> prepare($sql); } catch (PDOException $e) { echo $e -> getMessage(); } return $qr -> execute(); } Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Oderdenge 42 Denunciar post Postado Agosto 31, 2012 Olá, jnejunior. Tudo bem com você? Espero que sim. Então, rapaz. Em primeiro lugar eu não estabeleceria uma conexão com o banco de dados numa função de inserção. Se você parar para pensar, a sua aplicação pode utilizar uma conexão como um todo, sem ter que ficar estabelecendo conexões paralelas a cada vez que você precisar. Em segundo lugar, há melhores formas de promover o seu "foreach". Estou sem muito tempo para criar um código para você, só que já lhe adianto que a maneira como você aplicou o foreach não é a melhor, embora funcione. Em terceiro lugar, se você parar para pensar, o try/catch é um fator meio que universal. Se você for fazer um read, vai utilizar um try/catch; se você utilizar um delete, vai utilizar um try/catch. Portanto você poderia fazer uma função "capital" para os try/catch relacionados às operações de CRUD. Em sumo, é isso. O básico de segurança você já tem, que é promovido pelo PDO (addslashes é um exemplo). Com relação a performance, o PHP não é o único fator comprometedor nesse caso. Vai depender (e muito) da estrutura do seu banco de dados e de suas tabelas. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Agosto 31, 2012 Vou fazer um codigo kais simples e eficiente pra você só por exemplo: function insert($tabela, $dados){ try{ $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); $sql = "INSERT INTO $tabela VALUES (:dados)"; $query = $con->prepare($sql); $query->bindValue(":dados", $dados, PDO::PARAM_STR); $query->execute(); } catch (PDOException $e) { echo $e->getMessage(); }} Ai você arruma conforme suas necessidades. Usar o bindValue para dar algum valor aos dados. Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Agosto 31, 2012 fiz assim, será que melhorou? é uma função que tinha aqui no pc. Guilherme Oderdenge: criei uma função para conectar e chama-lá quando fosse necessário, mas não deu certo, dava erro. então coloquei em um arquivo separado, mas também não deu certo deu erro. avaliem por favor: function inserir(array $dados, $tabela) { $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); $sql = sprintf('INSERT INTO `%s` (`%s`) VALUES (%s)', $tabela, implode('`, `', array_keys($dados)), implode(', ', array_fill(0, count($dados), '?')) ); $stmt = $pdo -> prepare($sql); $stmt -> bindValue(':dados', array_values($dados), !is_numeric(array_values($dados)) ? PDO::PARAM_STR : PDO::PARAM_INT); return $stmt -> execute(array_values($dados)); } Compartilhar este post Link para o post Compartilhar em outros sites
Luis Paullo 47 Denunciar post Postado Agosto 31, 2012 Function Isert so deveria Inserir ! a responsabilidade de abrir a conexão fica pra outro metodo ou class! Ja que voce num ta fazendo absolutamente nada OO acho q assim seria melhor! Passar apenas a referencia do Objeto PDO para sua função de inserir! //arquivo de conexão try { $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); } catch ( PDOException $error ) { echo $error->getMessage(); } function insert($pdo ){ if($pdo instanceof PDO) var_dump($pdo); //pega instancia de PDO else echo 'Não e uma instancia PDO'; } } Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Agosto 31, 2012 Eu entendi a parte que a conexão deveria ficar para outro metodo ou função, mas como eu faria então? e a parte do function($pdo)... eu não entendi o que você quis... mas obrigado por responder Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Agosto 31, 2012 faz assim: /* Conexão fora da função: */ try { $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); } catch ( PDOException $error ) { echo $error->getMessage(); } function insert($tabela, $dados){ $sql = "INSERT INTO $tabela VALUES (:dados)"; $query = $con->prepare($sql); $query->bindValue(":dados", $dados, PDO::PARAM_STR); $query->execute(); } Entendeu? Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Setembro 1, 2012 faz assim: /* Conexão fora da função: */ try { $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); } catch ( PDOException $error ) { echo $error->getMessage(); } function insert($tabela, $dados){ $sql = "INSERT INTO $tabela VALUES (:dados)"; $query = $con->prepare($sql); $query->bindValue(":dados", $dados, PDO::PARAM_STR); $query->execute(); } Entendeu? já fiz isso, mas deu o seguinte erro: Fatal error: Call to a member function prepare() on a non-object in D:\wamp\www\testes\dts\conectar.php on line 43 Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Setembro 1, 2012 Desculpe, seria assim: /* Conexão fora da função: */ try { $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); } catch ( PDOException $error ) { echo $error->getMessage(); } function insert($tabela, $dados){ $sql = "INSERT INTO $tabela VALUES (:dados)"; $query = $pdo->prepare($sql); $query->bindValue(":dados", $dados, PDO::PARAM_STR); $query->execute(); } Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Setembro 1, 2012 também, fiz assim, lógico que eu troquei a variável que armazena a instancia da classe PDO $query = $pdo->prepare(...); e mesmo assim deu aquele erro. já tentei incluir a conexão de um arquivo externo, de uma outra função conectar();, e também deu o erro. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Setembro 1, 2012 Será que assim não dá? /* Conexão fora da função: */ try { $pdo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS); function insert($tabela, $dados){ $sql = "INSERT INTO $tabela VALUES (:dados)"; $query = $pdo->prepare($sql); $query->bindValue(":dados", $dados, PDO::PARAM_STR); $query->execute(); } } catch ( PDOException $error ) { echo $error->getMessage(); } Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Setembro 1, 2012 também não, e mesmo de desse não é correto. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Setembro 1, 2012 Vamos fazer de outro modo? Com OOP. Classe para conexão (class.Conexao.php): final class Conexao extends PDO{ public function __construct(){ try{ parent::__construct('mysql:host=localhost;dbname=db', 'root', ''); }catch(PDOException $e){ echo 'Error: '.$e->getMessage(); } } } Agora vamos criar uma class para inserir os dados (class.DB.php): class DB{ private $conexao; public function __construct(){ $this->conexao = new Conexao(); } public function inserir($tabela, $dados){ $sql = "INSERT INTO $tabela VALUES (:dados)"; $query = $this->conexao->prepare($sql); $query->bindValue(":dados", $dados, PDO::PARAM_STR); $exe = $query->execute(); if($exe): echo "Inserido com sucesso!"; else: echo "Falha ao inserir"; endif; } } Ai na hora de usar, use assim: function __autoload($class){ require_once("class.$class.php");//Inclui as classes } $class = new DB(); $class->inserir($tabela, $dados); Bem, se quiser, é uma boa alternativa. Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Setembro 1, 2012 obrigado pelo esforço, é que eu não queria misturar OOP com programação procedural, mas é uma boa alternativa... eu estou acompanhando um curso em php e o cara usa a maneira convencional para se conectar com o mysql, e eu adapto para o PDO... mas obrigado mesmo assim. Compartilhar este post Link para o post Compartilhar em outros sites