I've now created a function for generic insertion using PDO.
To test, I created a table with two fields:
CREATE TABLE 'teste'
(
'id' INT NOT NULL AUTO_INCREMENT ,
'nome' VARCHAR(255) NOT NULL ,
'email' VARCHAR(255) NOT NULL ,
PRIMARY KEY ('id')
);
HTML form:
<!DOCTYPE html>
<html>
<head>
<title>Teste Insert PDO Genérico</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form action="pdo_generico.php" method="post">
Nome: <input type="text" name="nome"><br>
E-mail: <input type="mail" name="email"><br>
<input type="submit" value="Enviar">
</form>
</body>
</html>
pdo_generico.php
<?php
//CONFIG CONEXÃO
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'root';
$password = '';
// CONFIG TABELA E COLUNAS
$tabela = "teste";
// Os tipos podem ser:
// bool, int, str, file, outros(será tratado como str)
$colunas = array(
'nome' => 'str',
'email' => 'str',
);
try
{
$pdo_connection = new PDO($dsn, $user, $password);
} catch(PDOException $e)
{
echo 'Connection failed: ' . $e->getMessage();
}
$retorno_do_insert = generic_PDO_insert($pdo_connection, $tabela, $colunas, $_POST);
if($retorno_do_insert)
{
echo 'Dados inseridos com sucesso.';
}
else
{
echo 'Erro.';
}
// =============================================
function generic_PDO_insert($conecta,$tabela,$colunas,$post)
{
$pdo_tipos = array(
'bool' => PDO::PARAM_BOOL,
'int' => PDO::PARAM_INT,
'str' => PDO::PARAM_STR,
'file' => PDO::PARAM_LOB,
'outros'=> PDO::PARAM_STR
);
// Remove os campos que não forem enviados por POST para não criar placeholders para eles
$colunas_existentes = array();
$colunas_arr_key = array();
foreach($colunas as $coluna => $tipo)
{
if(isset($post[$coluna]))
{
$colunas_existentes[$coluna]=$tipo;
$colunas_arr_key[]=$coluna;
}
}
$colunas = $colunas_existentes;
//GERA os PLACEHOLDERS
$colunas_str='';
$placeholders_str='';
$colunas_str = implode(",",$colunas_arr_key);
$placeholders_str = ':'.implode(",:",$colunas_arr_key);
$sql= "INSERT INTO $tabela($colunas_str) VALUES($placeholders_str)";
// echo $sql;
try
{
$query= $conecta->prepare($sql);
foreach ($colunas as $coluna => $tipo)
{
$query->bindValue(":$coluna", $post[$coluna], $pdo_tipos[$tipo]);
}
$query->execute();
return true;
}
catch(Exception $e)
{
return false;
//echo $e->getMessage();
}
}