Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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();
}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();
} echo $e->getMessage();
}}
Ai você arruma conforme suas necessidades.
Usar o bindValue para dar algum valor aos dados.
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));
}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)echo 'Não e uma instancia PDO'; }
}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
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?
>
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
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();
}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.
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();
}
} echo $error->getMessage();
}também não, e mesmo de desse não é correto.
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.
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.
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.