Primi passi con pdo: inserimento dati nel database con i bind param

Continua la guida dedicata ai primi passi con PDO, oggi vediamo come gestire l’inserimento di dati nel database con una panoramica completa dei bind param.

[lightgrey_box]

NOTE: Ho già realizzato un articolo simile per il ciclo “Crea il tuo CMS” in cui usavo MYSQL “normale” se vuoi visionarlo CLICCA QUI.

Per una trattazione completa ti invito a leggere anche come preparare al meglio un database per il tuo progetto. CLICCA QUI.

[/lightgrey_box]

Primi passi con PDO: Impostazione della tabella MYSQL

Come per la versione mysql “classica” anche con PDO dobbiamo predisporre il database. Se volete evitare lo studio sul database e passare subito ai fatti, ecco il codice per creare una semplice tabella news.

CREATE TABLE `news` (
`id` INT( 64 ) NOT NULL AUTO_INCREMENT ,
`titolo` VARCHAR( 255 ) NOT NULL ,
`descrizione` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM

Ad ogni modo, vi consiglio di ripassare questo precedente articolo.

Struttura della pagina e form Inserimento dati

<?php if (isset($_POST['titolo'])) : ?>

//SCRIPT PHP ELABORAZIONE DATI

<?php else: ?>

//FORM INSERIMENTO NEWS

<?php  endif; ?>

Come vedete la struttura è abbastanza semplice. Per semplificare la trattazione ho usato una porzione di codice procedurale come nella precedente trattazione. Tramite degli if isset ed else riesco a far apparire il form di contatti al primo accesso. Una volta inviati i dati del form grazie a PHP_SELF viene ricaricata la stessa pagina e viene così eseguito il codice all’interno dell’IF in quanto l’isset diventa true.

Questo potrebbe essere un esempio di form html per l’inserimento dei dati:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 

 <input type="text" name="titolo" id="titolo"  placeholder="Inserisci il titolo" style="width: 500px;"/>

 <textarea id="descrizione" name="descrizione"  rows="30" cols="80" style="width: 90%;"></textarea>    

 <input type="submit" value="Aggiungi">

</form>

I Bind Parameter di PDO

La variazione più interessante in PDO rispetto a mysql è la gestione degli elementi da inserire tramite BIND. I bind parameter servono per filtrare automaticamente le stringhe da passare alla query (eseguono già il filtraggio dei caratteri dannosi), ma non solo. Essi servono anche come selettori per processare al meglio e costruire la propria query. Di seguito troverai la trattazione di alcune modalità di inserimento tramite BIND.

[lightgrey_box] Il comando mysql_real_escape è ormai obsoleto facendo buon uso delle bind è possibile evitare di usare qualsiasi filtraggio esterno della variabile. Nel caso ne aveste bisogno è comunque possibile usare la funzione quote di PDO.   [/lightgrey_box]

Inserimento base tramite bind parameter

$desc= 'stringa con caratteri 'ciao' dannosi%'; //esempio con caratteri dannosi
$titolo = $_POST['titolo']; // recupero classico variabili

//Preparazione query
$q = $db->prepare("INSERT INTO news (titolo, descrizione) VALUES (:titolo, :descrizione)");

//binding
$q->bindParam(':titolo', $titolo);
$q->bindParam(':descrizione', $desc); //ricorda di "collegare" la giusta variabile al bind

//esecuzione
$q->execute(); // eseguo la query

Inserimento dati con array

Questa funzione risulta molto utile quando abbiamo molte informazioni da inserire in modo procedurale. Ecco un esempio chiarificatore:

$data = array('Riky', 'TargetwebRulez');  

$q = $db->prepare("INSERT INTO news (titolo, descrizione) VALUES (?, ?)");
// inserisce al posto dei punti interrogativi i valori dell'array data
$q->execute($data);

Inserimento ad array associativo: “Named Placeholders”

Anche questa soluzione è indicata in particolare per una grande mole di dati:

$data = array( 'titolo' => 'Riky', 'descrizione' => 'TargetwebRulez');  

//INIZIALIZZO LA QUERY
$sql = "INSERT INTO news (titolo, descrizione) value (:titolo, :descrizione)";

//PREPARO L'ESECUZIONE
$q = $db->prepare($sql);

//ESEGUI LA QUERY METTENDO AL POSTO DEI PLACEHOLDER I DATI PRESENTI IN DATA
$q->execute($data);

Bind dei dati con sostituzione

$titolo = 'Riccardo Rulez';

// preparazione della query
$q = $db->prepare('DELETE FROM news WHERE titolo = :titolo');

// sostituzione di valori
$q->bindParam(':titolo', $titolo);

// esecuzione della query
$q->execute();

Bind dei dati senza placeholder

$q = $db->prepare('DELETE FROM utenti WHERE nome = ? AND anni = ?');

// esecuzione della query con sostituzione dei valori 
$q->execute(array('Riccardo', '21'));

Come potete vedere anche in questo caso ho usato i punti interrogativi per comunicare a PDO che i dati da inserire sono dinamici di volta in volta e che vanno recuperati da un array (execute).

Bind per inserimenti multipli

Una soluzione molto interessante, che in mysql era macchinosa, con PDO è diventata estremamente intuitiva.

 $q = $db->prepare('INSERT INTO news VALUES(:titolo)');

//associa il placeholder alla variabile name
$q->bindParam(':titolo', $titolo);

//Primo inserimento
$titolo = 'Targetweb Rulez';
$q->execute();

//Secondo inserimento
$titolo = 'Targetweb solo tutorial e articoli utili!';
$q->execute();

Vi invito a visionare i commenti al codice di ciascuna soluzione  per maggiori informazioni.

Altre informazioni e funzioni utili

Come avrete capito dai precedenti esempi è importante mantenere una “struttura di base” per l’inserimento dei dati. 

–>Preparazione Query

–>Associazione con bind (con relativo filtraggio variabili)

–> Esecuzione query (anche multipla).

Ovviamente non dimenticatevi anche della connessione al database. Se usate i codici di questo articolo usate questi script di connessione:

//CONNESSIONE AL DATABASE E GESTIONE ERRORI
$col = 'mysql:host=127.0.0.1;dbname=pdo';

// blocco try per il lancio dell'istruzione
try {
	  // connessione tramite creazione di un oggetto PDO
	  $db = new PDO($col , 'nomeutente', '');
}

// blocco catch per la gestione delle eccezioni
catch(PDOException $e) {

	  // notifica in caso di errorre
	  echo 'Attenzione: '.$e->getMessage();
}

Un piccolo appunto che potrebbe esservi utile, vi ricordare mysql_insert_id? bhè PDO ha una funzione esattamente identica da inserire subito dopo il comando execute.

$db->lastInsertId();

Conclusioni

Ecco alcune risorse molto utili:

[button link=”http://php.net/manual/en/pdostatement.bindparam.php” color=”blue” size=”small”target=”blank”]Docs Ufficiale[/button]

[button link=”http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html” color=”blue” size=”small” target=”blank”]Ottimo Sito dove reperire info[/button]

[button link=”http://www.targetweb.it/errori-pdo-hy093-analizziamo-come-risolverlo/” color=”blue” size=”small”]Errore PDO HY093[/button]

Spero che l’articolo sia utile per capire appieno alcune (fantastiche) funzionalità di PDO e sopratutto dei bind. Se ti è piaciuto l’articolo fammelo sapere nei commenti e condividilo sui tuoi social network preferiti!

  1. Io uso molto il PDO anche se non ne avrei bisogno (sul mio server c’è solo MySQL) mentre PDO è ottimo per l’astrazione dei metodi e quindi per il porting su più motori di database, però che dire a me piace e lo preferisco all’improved che pure ha i metodi di binding.
    Detto questo una sola nota che noto spesso e non ha molto a che vedere con il PDO ma più con il controllo dell’errore (mia fissa personale fin dai tempi del Basic) quando si usano le eccezioni in PHP e in particolare quando si usano le estensioni, sia proprie che del linguaggio come le PDOException ricordarsi di fare una seconda catch per catturare anche gli errori che non dipendono dal PDO.
    Nel tuo caso dopo

    catch(PDOException $e) {

    // notifica in caso di errorre
    echo ‘Attenzione: ‘.$e->getMessage();
    }
    aggiungi

    catch(Exception $e) {

    // notifica in caso di errorre
    echo ‘Attenzione: ‘.$e->getMessage();
    }

    Ciauz M,

    1. PS sarebbe interessante inserire una formattazione per stringhe di codice nelle risposte 🙂

      PPS usando bindParam sarebbe interessante per aumentare la sicurezza di passare anche il formato del campo con PDO::PARAM_INT nel caso di un intero e PDO::PARAM_STR nel caso di una stringa, così se il campo accetta interi siamo sicuri che qualsiasi cosa non intera generi un errore (purtroppo il casting delle stringhe è più complesso, in PHP tutto è una stringa)

      Ciauz M.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Up Next:

Reset campi di un form con jQuery

Reset campi di un form con jQuery