fetch_field
Scopri la funzione mysqli_fetch_field() in PHP per ottenere i metadati di una singola colonna da un result set, con esempi pratici.
La funzione mysqli_fetch_field() restituisce i metadati di una colonna — non i dati contenuti in essa. Ogni volta che la chiami, ottieni un object che descrive la colonna successiva nel result set: il nome, il tipo di dato, la lunghezza, la tabella di appartenenza e vari flag. Questa pagina spiega quando è utile, come si comporta la funzione, cosa significa ogni proprietà e come leggerla sia in stile orientato agli oggetti che in stile procedurale.
Cosa fa mysqli_fetch_field()
mysqli_fetch_field() scorre le colonne di un result set una alla volta, come un cursore. Il result set mantiene un puntatore interno al campo; ogni chiamata riuscita lo avanza di uno. Quando si raggiunge l'ultima colonna, la chiamata successiva restituisce false, il che la rende conveniente per pilotare un ciclo while.
Restituisce metadati, quindi non hai bisogno di righe effettive per usarla — una query che non corrisponde a nessuna riga descrive comunque le sue colonne. È esattamente per questo che è utile: puoi ispezionare la struttura di un risultato prima di elaborarlo.
Sintassi (entrambi gli stili sono equivalenti):
// Object-oriented style
$fieldInfo = $result->fetch_field();
// Procedural style
$fieldInfo = mysqli_fetch_field($result);Accetta il result set come unico input e restituisce un object in caso di successo o false quando non ci sono altri campi.
Lettura dei metadati delle colonne
L'esempio seguente si connette, esegue una SELECT e scorre le colonne del risultato. Ogni iterazione stampa il nome della colonna, il codice del tipo e la lunghezza massima.
Come usare la funzione mysqli_fetch_field()?
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$query = "SELECT * FROM my_table";
$result = $mysqli->query($query);
if ($result) {
while ($field = $result->fetch_field()) {
printf("Name: %s\n", $field->name);
printf("Type: %s\n", $field->type);
printf("Length: %d\n", $field->length);
}
} else {
echo "Query failed: " . $mysqli->error;
}
$result->free();
$mysqli->close();
?>Il ciclo while ($field = $result->fetch_field()) termina naturalmente quando fetch_field() restituisce false dopo l'ultima colonna. Poiché il puntatore al campo avanza ad ogni chiamata, la prima iterazione descrive la prima colonna, la seconda iterazione la seconda colonna, e così via.
L'object field e le sue proprietà
Ogni chiamata restituisce un object simile a stdClass. Le proprietà più comunemente usate sono:
| Proprietà | Significato |
|---|---|
name | Il nome della colonna così come restituito dalla query (un alias, se usato) |
orgname | Il nome originale della colonna, prima dell'alias |
table | La tabella a cui appartiene la colonna (un alias, se usato) |
orgtable | Il nome originale della tabella |
type | Il tipo di dato, come costante intera (vedi sotto) |
length | La larghezza dichiarata della colonna |
max_length | La larghezza massima dei valori effettivi (spesso 0 a meno che non sia bufferizzato) |
flags | Una maschera di bit dei flag della colonna (NOT_NULL, PRI_KEY, …) |
decimals | Numero di decimali per i campi numerici |
La proprietà type è un intero, non una string leggibile. PHP espone costanti come MYSQLI_TYPE_VARCHAR, MYSQLI_TYPE_LONG (una colonna intera) e MYSQLI_TYPE_DATETIME per poterla confrontare:
if ($field->type === MYSQLI_TYPE_LONG) {
echo "{$field->name} is an integer column\n";
}Selezionare una colonna specifica
fetch_field() è sequenziale, quindi per ispezionare, ad esempio, solo la terza colonna dovresti scorrere fino a raggiungerla oppure posizionarti direttamente su di essa. Il puntatore al campo può essere riposizionato con field_seek(), e una singola colonna può essere recuperata direttamente tramite indice con fetch_field_direct():
// Jump to column index 2 (the third column), then read it
$result->field_seek(2);
$field = $result->fetch_field();
echo $field->name;Quando usarla (e le alternative)
Usa fetch_field() quando vuoi iterare sulle colonne e reagire a ciascuna — ad esempio, per generare automaticamente l'intestazione di una tabella, costruire un form o decidere come formattare ogni valore in base al tipo.
- Se hai bisogno dei metadati di tutte le colonne in una sola chiamata,
fetch_fields()li restituisce tutti come array in un'unica chiamata, che di solito è più pulita di un ciclo. - Se hai bisogno solo di sapere quante colonne ci sono, usa
field_count. - Per leggere i dati effettivi delle righe invece dei metadati delle colonne, usa
fetch_assoc()ofetch_array().
Conclusione
mysqli_fetch_field() offre una visione colonna per colonna della struttura di un result set: nomi, tipi, lunghezze e flag, avanzando tra le colonne una chiamata alla volta. Usala in un ciclo per ispezionare una query prima di elaborarne le righe, combinala con field_seek() per puntare a una colonna specifica, oppure passa a fetch_fields() quando vuoi tutti i metadati in una volta sola.