INSERT Query con PDO

INSERT è un comando di tipo DML e quindi non ha valori di return (come pure le query UPDATE e DELETE).

La query INSERT con PDO si effettua in questo modo:

  1. Si crea una normale INSERT query in SQL;
  2. Si rimpiazzano i valori da inserire nella tabella con i placeholders;
  3. Si prepara la query risultante con prepare();
  4. Si esegue la query risultante dal prepare() passando i valori sotto forma di array all’execute().

La query INSERT con positional placeholders:

$sql = "INSERT INTO users (name, lastname, sex) VALUES (?,?,?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$name, $lastname, $sex]);

La stessa query, ma con named placeholders:

$data = [
    'name' => $name,
    'lastname' => $lastname,
    'sex' => $sex,
];

$sql = "INSERT INTO users (name, lastname, sex) VALUES (:name, :lastname, :sex)";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);

Come già anticipato, non restituendo alcun valore di ritorno, prepare() e execute() si possono concatenare:

// con positional placeholders
$sql = "INSERT INTO users (name, lastname, sex) VALUES (?,?,?)";
$pdo->prepare($sql)->execute([$name, $lastname, $sex]);

// con named placeholders
$data = [
    'name' => $name,
    'lastname' => $lastname,
    'sex' => $sex,
];
$sql = "INSERT INTO users (name, lastname, sex) VALUES (:name, :lastname, :sex)";
$stmt = $pdo->prepare($sql)->execute($data);

bindValue() e bindParam()

Ma manca ancora qualcosa, giusto? Come si fa a legare un valore preso dal campo di un form al rispettivo placeholder? Ci sono 2 metodi: bindValue() e bindParam().

bindValue()

Il metodo bindValue() lega indissolubilmente il valore della variabile al parametro e non rende possibile alcuna modifica al valore tra il bind e l’execute.

$sql = "INSERT INTO users (name) VALUES (:name)";
$stmt = $pdo->prepare($sql);
$name = 'Mark';
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$name = 'John';
$stmt->execute();

Questa query inserirà “Mark” nella tabella “users” ignorando completamente “John”, nonostante il valore della proprietà $name sia cambiato tra i metodi bind e execute.

Il metodo bindValue() accetta 3 argomenti: il nome del parametro, il valore del parametro e infine il tipo di dato (opzionale). Nella pagina dedicata del Manuale PHP si trovano più informazioni su questo tipo di parametri.

Naturalmente è possibile eseguire il bind su più righe per più valori:

$sql = "INSERT INTO users (name, lastname) VALUES (:name, :lastname)";
$stmt = $pdo->prepare($sql);
$name = 'John';
$lastname = 'Doe';
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':lastname', $lastname, PDO::PARAM_STR);
$stmt->execute();

bindParam()

Con bindParam() abbiamo la possibilità di cambiare il valore della variabile, anche perchè questo metodo referenzia la variabile (e non il suo valore) agganciandola al parametro:

$sql = "INSERT INTO users(name) VALUES (:name)";
$stmt = $pdo->prepare($sql);
$name = 'Mark';
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$name = 'John';
$stmt->execute()

Il risultato di questa query è l’inserimento del valore “John” nella tabella “users” ignorando completamente “Mark”, perchè il valore della proprietà $name sia cambiato tra i metodi bind e execute e tra i due verrà impiegato l’ultimo.

Come è possibile notare, anche il metodo bindParam() accetta 3 argomenti.

Vediamo ora un esempio di bind di tre variabili con positional placeholders ( ? );

$sql = "INSERT INTO users (name, lastname, age) VALUES (?, ?, ?)";
$stmt= $pdo->prepare($sql);

$stmt->bindParam($1, $name);
$stmt->bindParam($2, $lastname);
$stmt->bindParam($3, $age);

// inserisce la prima riga
$name = 'Mark';
$lastname = 'Green';
$age = 48;
$stmt->execute();

// inserisce la seconda riga
$name = 'Adam';
$lastname = 'Jackson';
$age = 35;
$stmt->execute();

Normalmente una query di tipo INSERT è irreversibile, ma se inserita all’interno di una transazione è possibile renderla reversibile e può essere annullata l’intera istruzione ripristinando lo stato iniziale (rollback).

try {
    $pdo->beginTransaction();
    $stmt = $pdo->prepare("INSERT INTO users (name) VALUES (?)");
    foreach (['Joe','Ben'] as $name)
    {
        $stmt->execute([$name]);
    }
    $pdo->commit();
}catch (Exception $e){
    $pdo->rollback();
    throw $e;
}

Un pensiero su “INSERT Query con PDO

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.