Prepared Statement con MySQLi
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.
Passiamo invece alla parte PHP:
<?php
if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['btn_send'])) {
$host = "host";
$user = "user";
$pass = "pwd";
$db = "db";
$conn = mysqli_connect($host, $user, $pass, $db) or die(mysqli_connect_error());
if (mysqli_connect_errno()) {
echo "Connessione fallita: " . die(mysqli_connect_error());
}
$stmt = $conn->prepare("INSERT INTO newsletter (nl_nome, nl_cognome, nl_sex, nl_email, nl_nazione, nl_lingua) VALUES (?,?,?,?,?,?)");
if ($stmt) {
$stmt->bind_param('ssssss', $nome, $cognome, $sex, $email, $nazione, $lingua);
$nome = trim($_POST['nome']);
$cognome = trim($_POST['cognome']);
$sex = trim($_POST['sex']);
$email = trim($_POST['email']);
$nazione = trim($_POST['nazione']);
$lingua = trim($_POST['lingua']);
$stmt->execute();
$stmt->close();
echo "Subscription succeeded";
} else {
echo "An error is occurred";
}
mysqli_close($conn);
}
?>
Prima di tutto ci connettiamo al database
Se non ci sono errori nella connessione prepariamo l'istruzione nella variabile $stmt.
L'istruzione prepare() restituisce false se c'è qualche errore, sennò resituisce un object.
Quindi se non viene resituito false faccio il bind di tutti quei bei ? passandogli i valori presi dal form.
Alla fine facciamo l'execute() dell'istruzione e chiudiamo la connessione.
Notate che alla funzione bind_param() come primo argomento gli ho messo 6 s.
Questo perchè gli ho indicato che tipo di dato gli passo; nel mio caso sono 6 stringhe.
I tipi in totale sono:
- s per le stringhe
- i per gli interi
- d per i double
- b per i blob
Ovviamente le istruzioni preparate si possono usare per qualsiasi tipo di query, ed in verità sono altamente consigliate.
php mysql mysqli prepare bind_param prepared
Commentami!