Ir para conteúdo

Arquivado

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

jnejunior

Como melhorar função para inserir

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

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