Prima di concludere questo articolo elenchiamo alcune funzioni messe a disposizione dall'estensione ext/mysqli che risultano estremamente utili e di uso comune. La maggior parte di queste comunque era già disponibile con la vecchia estensione ext/mysql ma risulta comunque interessante analizzare il loro utilizzo in un approccio orientato agli oggetti.
mysqli::affected_rows
(mysqli_affected_rows)
Restituisce il numero di righe interessate dall'ultima query. affected_rows va usato solo quando la query modifica il contenuto del database, come nel caso di INSERT, UPDATE e DELETE e non deve essere impiegato con le SELECT. Nel caso di una query di tipo UPDATE affected_rows restituisce il numero di righe realmente modificate e non il numero di righe che rispondono alla clausola WHERE della query stessa. Questo comportamento può essere modificato agendo sui parametri di connessione come mostrato all'inizio di questo articolo.
<?php
// provo a connettermi al server MySQL
$mysqli = new mysqli('localhost', 'root', 'password_db', 'test');
// preparo le query di inserimento
$query = "INSERT INTO mia_tabella SET nome = 'Gianni', cognome = 'Rossi'";
// eseguo le query
$mysqli->multi_query($query);
// mostro il numero delle righe interessate dall'ultima query
echo 'Numero di righe inserite: ', $mysqli->affected_rows , '<br />';
// preparo le query di cancellazione
$query = "DELETE FROM mia_tabella WHERE nome = 'Gianni'";
// eseguo le query
$mysqli->multi_query($query);
// mostro il numero delle righe interessate dall'ultima query
echo 'Numero di righe cancellate: ', $mysqli->affected_rows;
// chiudo la connessione al server MySQL
$mysqli->close();
?>
mysqli_connect_error e mysqli_connect_errno
Forniscono rispettivamente un messaggio di errore ed un relativo codice numerico associato nel caso in cui la connessione al server MySQL non abbia avuto esito positivo. In particolare mysqli_connect_errno() può essere impiegato per verificare l'esito della connessione semplicemente con un IF.
<?php
// provo a connettermi al server MySQL
$mysqli = new mysqli('localhost', 'root', 'password_db', 'test');
// Verifico l'esito della connessione
if (mysqli_connect_errno())
{
printf("Connessione fallita: %s\n", mysqli_connect_error());
exit();
}
?>
mysqli_result::data_seek
(mysqli_data_seek)
Nel caso di query buffered permette di posizionarsi su una qualsiasi delle righe restituite dalla query
<?php
// provo a connettermi al server MySQL
$mysqli = new mysqli('localhost', 'root', 'password_db', 'test');
// preparo le query da inviare al server MySQL
$query = "SELECT * FROM mia_tabella";
// eseguo le query
$result = $mysqli->query($query);
// sposto il puntatore dei risultati alla terza riga
$result->data_seek(2);
// estraggo la riga
$row = $result->fetch_row();
// mostro i risultati
printf ("ID utente:%d, nome:%s, cognome:%s<br />\n",$row[0],$row[1],$row[2]);
// chiudo la connessione al server MySQL
$mysqli->close();
?>
mysqli::error e mysqli::errno
(mysqli_errno e mysqli_error)
Forniscono rispettivamente un messaggio di errore ed un relativo codice numerico associati all'ultimo errore verificatosi nell'interazione con il database MySQL. Utili per effettuare il debug delle query
<?php
// provo a connettermi al server MySQL
$mysqli = new mysqli('localhost', 'root', 'password_db', 'test');
// eseguo le query
if(!$mysqli->query("SELECT * FROM tabella_inesistente"))
{
printf('Errore nella query (codice %d): %s', $mysqli->errno,$mysqli->error);
}
?>
mysqli_result::field_count
( mysqli_field_count)
Permette di sapere quanti campi (colonne) contiene un set di risultati. Particolarmente utile quando viene eseguito il metodo store_result() e non è noto a priori se la query restituirà dei risultati (es. una SELECT) o meno (INSER, UPDATE, ...)
<form id="form1" name="form1" method="post" action="">
<label>Inserisci una query:
<input name="query" type="text" size="50" />
</label>
<input type="submit" name="Submit" value="<- Esegui" />
</form>
<?php
if($_POST)
{
// provo a connettermi al server MySQL
$mysqli = new mysqli('localhost', 'root', 'password_db', 'test');
// eseguo le query
$result = $mysqli->real_query($_POST['query']);
// se la query ha prodotto un risultato
if($mysqli->field_count)
{
$result = $mysqli->store_result();
while ($row = $result->fetch_assoc())
{
foreach ($row as $key => $value)
{
echo "$key=>$value ";
}
echo '<br />';
}
}
}
?>
mysqli::insert_id
(mysqli_insert_id)
Fornisce l'ultimo ID autogenerato da MySQL per un campo auto_increment.
<?php
// provo a connettermi al server MySQL
$mysqli = new mysqli('localhost', 'root', 'password_db', 'test');
// eseguo le query
$result = $mysqli->query("INSERT INTO mia_tabella SET nome='Gigi', cognome='Cremeria'");
echo "L'ID del nuovo utente inserito è ", $mysqli->insert_id;
?>
mysqli::more_results
( mysqli_more_results)
Nel caso di query multiple restituisce true se sono presenti ulteriori set di risultati provenienti da una precedente chiamata alla funzione multi_query(). Utile quando non si conosce a priori il numero delle query eseguite con una multi_query() e pertanto non è noto il numero di set di risultati da elaborare.
Nel prossimo articolo, che concluderà la serie dedicata a ext/mysqli, vedremo come sfruttare i prepared statements per ottenere il binding dei parametri e dei risultati, come effettuare le transazioni e come gestire i BLOB.