La clausola IN, in una query con vari filtri, può essere molto comoda.

Ma se la vogliamo usare dentro una Stored Procedure in MySQL, può essere problematico passare i valori da usare nella clausola.

Per farlo siamo costretti a concatenare la query usando CONCAT.

Mi è capitato spesso di avere delle Stored Procedure molto simili tra loro, dove la differenza era, ad esempio, solo il campo o la tabella da interrogare.

In questi casi la cosa migliore sarebbe passare il nome del campo / tabella alla SP come parametro.

Solo che poi non lo si può usare come un "normale" parametro.

Specifico che siamo in ambito MySQL, anche se forse vale la stessa cosa per altri db.

Anche se in genere uso PDO per connettermi a MySQL con PHP, per piccoli script può non valerne la pena.

Ma al posto di usare le classiche funzionu mysql_ ho iniziato a usare il mysqli, che ad oggi è strettamente consigliato.

Vediamo qui come eseguire istruzioni preparate (Pepared Statement) per inserire da in un db MySQL attraverso l'estensione MySQLi.

Vi posto il form:

<form action="" method="post">
<label>Nome / Name:</label>
<input type="text" value="" name="nome" />
<label>Cognome / Surname:</label>
<input type="text" value="" name="cognome" />
<fieldset>
<legend>Sex:</legend>
<input type="radio" name="sex" value="m" />
<label>M</label>
<input type="radio" name="sex" value="f" checked="checked"  />
<label>F</label>
</fieldset>
<label>E-mail:</label>
<input type="text" value="" name="email" />
<label>Nazione / Country:</label>
<select name="nazione">
<option>Italy</option>
<option>UK</option>
</select>
<label>Lingua / Language:</label>
<select name="lingua">
<option>*</option>
<option>Italiano</option>
<option>English</option>
</select>
<fieldset>
<legend>Privacy:</legend>
<input type="checkbox" name="privacy" />
<label>Agree</label>
</fieldset>
<fieldset>
<button type="submit" name="btn_send">Submit</button>
</fieldset>
</form>

Un normale form.

Dopo aver visto come effettuare una interrogazione e l'inserimento vediamo come modificare i dati sul nostro db MySQL.

Vi consiglio prima una letta a quei due articoli.....

Prima di tutto aggiungiamo una funzione alla nostra classe:

public function update($nome, $cognome, $data_nascita, $cel, $tel, $fax, $soc, $carica, $email1, $email2, $sito, $casa, $uff, $id) {
$prepare = $this->pdo->prepare("UPDATE contatti SET nome=?, cognome=?, data_nascita=?, cellulare=?, telefono=?, fax=?, societa=?, carica=?, email_1=?, email_2=?, sito_web=?, indirizzo_casa=?, indirizzo_uff=? WHERE id=?");
$prepare->execute(array(
trim($nome),
trim($cognome),
trim($data_nascita),
trim($cel),
trim($tel),
trim($fax),
trim($soc),
trim($carica),
trim($email1),
trim($email2),
trim($sito),
trim($casa),
trim($uff),
$id
));
header('location:index.php');
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}

Anche qui abbiamo usato un'istruzione prepare come nel caso dell'inserimento.

Dovo avere fatto la connessione e una classica interrogazione vediamo come aggiungere dati al nostro db.

Prima di tutto leggiamo l'articolo linkato e salviamoci quella classe.

Infatti non andremo creare una nuova classe, ma aggiungeremo solo una funzione riprendendo quella istanza di PDO.

Questo perchè, come detto nell'articolo, quella classe rappresenta il nostro db e li mettermo tutte le operazioni da fare.

Per l'inserimento useremo le istruzioni prepare.

Come vedete queste istruzioni posso essere usate in vari modi; io in genere uso i segnaposti ?.

Vediamo la funzione da aggiungere alla classe:

public function insert($nome, $cognome, $data_nascita, $cel, $tel, $fax, $soc, $carica, $email1, $email2, $sito, $casa, $uff) {
try {
$prepare = $this->pdo->prepare("INSERT INTO contatti (nome, cognome, data_nascita, cellulare, telefono, fax, societa, carica, email_1, email_2, sito_web, indirizzo_casa, indirizzo_uff) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");
$prepare->execute(array(
trim($nome),
trim($cognome),
trim($data_nascita),
trim($cel),
trim($tel),
trim($fax),
trim($soc),
trim($carica),
trim($email1),
trim($email2),
trim($sito),
trim($casa),
trim($uff)
));
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}

Come vedete la funzione richiede diversi parametri, che corrispondono alle voci da inserire nella tabella.