Home / Programmazione / PHP / Prepared Statement con MySQLi
Mattepuffo

Prepared Statement con MySQLi

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.