6 votes

Comment passer un tableau de lignes à PDO pour les insérer ?

Je veux utiliser les instructions préparées PDO, mais je trouve que c'est vraiment fastidieux de taper. Ce serait super utile s'il existe une fonction pour simplement passer le tableau associatif suivant :

array(
"title"=>$title
"userid"=>$userid
"post"=>$body
)

En gardant à l'esprit que les clés dans le tableau correspondent toujours aux lignes dans la table SQL. En résumant tout, cela devrait réduire l'effort de taper le :foo et de les taper à nouveau dans la fonction execute.

Je parle spécifiquement de la requête INSERT.

Comment faire cela ?

18voto

ajreal Points 31456
fonction pdo_insert($table, $arr=array())
{
  if (!is_array($arr) || !count($arr)) return false;

  // Connexion à votre pdo
  $dbh  = '...';
  $bind = ':'.implode(',:', array_keys($arr));
  $sql  = 'insert into '.$table.'('.implode(',', array_keys($arr)).') '.
          'values ('.$bind.')';
  $stmt = $dbh->prepare($sql);
  $stmt->execute(array_combine(explode(',',$bind), array_values($arr)));

   if ($stmt->rowCount() > 0)
   {
      return true;
   }

return false;
}

pdo_insert($table, array('title'=>$title, 'userid'=>$user_id, 'post'=>$body));

-1voto

Légèrement améliorée fonction d'insertion PDO qui prend également en compte la sécurité en prévenant les attaques par injection SQL :

// Insérer un tableau avec des paires clé-valeur dans une table de base de données spécifiée (MySQL).
function pdo_insert($dbh,$table,$keyvals) {
    $sql = sprintf("INSERT INTO %s ( `%s` ) %sVALUES ( :%s );",
        $table,
        implode("`, `", array_keys($keyvals)), 
        PHP_EOL, 
        implode(", :", array_keys($keyvals))
    );
    $stmt = $dbh->prepare($sql);
    foreach ($keyvals as $field => $value) {
        $stmt->bindValue(":$field", $value, PDO::PARAM_STR);
    }
    $stmt->execute();
    return $dbh->lastInsertId();
}

// Convertir les caractères spéciaux en entités HTML sécurisées.
function h($str) {
    return trim(stripslashes(htmlspecialchars($str, ENT_QUOTES, 'utf-8')));
}

Exemple:

$dbh = new PDO($dsn);
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$keyvals = [                
    'id' => isset($_POST['id']) ? h( $_POST['id'] ) : null, 
    'title' => isset($_POST['title']) ? h( $_POST['title'] ) : null,    
    'description' => isset($_POST['description']) ? h( $_POST['description'] ) : null,
    'created_at' => time(),
    'created_by' => 1,
];
$last_ids[] = pdo_insert($dbh,'products',$keyvals);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X