Una volta creato il form del nostro CMS, componente che si può utilizzare sia per l'inserimento e sia per la modifica dei record così come per la per la funzione copia
, dobbiamo passare al salvataggio dei dati. Il pulsante per eseguire il submit richiamerà sempre la stessa pagina, variando l'azione e chiamando tramite lo switch
il metodo della classe preposto alla scrittura: salva()
.
Questo metodo verr` utilizzato sia per l'inserimento dei nuovi record sia per la modifica, fra le varie soluzioni possibili ne adotteremo una che, praticamente, limiter` notevolmente le differenze. Come prima questione dovremo capire se siamo in fase di inserimento (INSERT
) o aggiornamento (UPDATE
), la differenza sta nell'avere valorizzato o meno il nostro campo chiave
.
struttura andiamo a leggere il nome del campo chiave
, andiamo a visualizzare il valore passato dal form per questo campo e se è nullo procediamo con l'inserimento di un nuovo record:
$sql='SELECT nome FROM struttura WHERE tabella="'.$this->tipo.'" AND chiave="1"';
$stmt = $db->prepare($sql);
$stmt->execute();
$array = $stmt->fetch(PDO::FETCH_ASSOC);
if($_REQUEST[$array['nome']] == 0 || $_REQUEST[$array['nome']] == ''){
$sql = 'INSERT INTO '.$this->tipo.'('.$array['nome'].',data_insert) VALUES("?","'.date("Y-m-d H:i:s").'")';
$stmt = $db->prepare($sql);
$stmt->execute();
}
La prima query si rivolge alla tabella struttura
e va a leggere il nome del campo chiave primaria; il secondo passaggio è inserire in un costrutto if
la lettura della variabile contenente il nome della chiave primaria. Se questo valore è vuoto oppure pari a zero, procediamo con l'inserimento. Abbiamo convenuto per convenzione che si tratta di un valore con autoinserimento e quindi possiamo lasciare il segnaposto anonimo, se ne occuperà il nostro database MySQL.
Il secondo campo, anche questo non necessario da esplicitare, è relativo alla data inserimento, avendo di default CURRENT_TIMESTAMP
potremmo anche non esplicitarlo. A questo punto andando a recuperare il valore dell'id
inserito possiamo allineare la procedura di inserimento a quella di modifica: di fatto sappiamo quale sarà il record da aggiornare.
Per recuperare il valore dell'id
del record inserito useremo il metodo lastInsertId()
che poi assegneremo alla proprietà id
del nostro oggetto:
$id = $db->lastInsertId();
$this->id=$id;
$key = $array['nome'];
Il problema che si pone ora riguarda quali parametri arrivano dal nostro form. La soluzione più semplice è andare a leggere la tabella struttura, per i campi che non sono chiave, della tabella di nostro interesse e fare un ciclo per l'inserimento. La costruzione del ciclo verrà fatta in questo modo:
$sql='SELECT * FROM struttura WHERE tabella="'.$this->tipo.'" AND visibile="1" AND chiave="0"';
$stmt = $db->prepare($sql);
$stmt->execute();
while($array = $stmt->fetch(PDO::FETCH_ASSOC)){
..
}
All'interno del ciclo, al fine di evitare errori, vado effettivamente ad accertarmi che arrivi qualcosa dal nostro form facendo attenzione alla complicazione imposta dalla checkbox
che se non viene spuntata non passerà nessun valore:
if((isset($_REQUEST[$array['nome']]) || $array['tipo_input']=='checkbox')){
..
}
Diventa ora indispensabile un sistema per la gestione degli errori, argomento che verrà trattato nella prossima lezione.