fetch_fields
Guida alla funzione mysqli_fetch_fields() in PHP per ottenere metadati sulle colonne di un risultato MySQLi.
La funzione mysqli_fetch_fields() restituisce un array di oggetti che descrivono le colonne (campi) di un result set MySQLi — i loro nomi, tipi, lunghezze, tabelle di origine e flag. Legge i metadati sulle colonne, non i dati delle righe stesse. Questa pagina spiega la sintassi, cosa contiene ciascun oggetto campo, quando utilizzarla e le insidie comuni.
Sintassi
mysqli_fetch_fields(mysqli_result $result): arrayNello stile orientato agli oggetti la stessa chiamata è $result->fetch_fields().
$result— un result set restituito damysqli_query(),mysqli_store_result(), omysqli_use_result().- Valore restituito — un array di oggetti
stdClass, uno per colonna, nell'ordine in cui le colonne appaiono nel risultato. Ogni oggetto espone proprietà comename,orgname,table,orgtable,type,length,max_length,decimalseflags.
Cosa contiene ogni oggetto campo
| Proprietà | Descrizione |
|---|---|
name | Il nome della colonna (o il suo alias, se è stato usato AS). |
orgname | Il nome originale della colonna, ignorando eventuali alias. |
table | Il nome della tabella (o il suo alias). |
orgtable | Il nome originale della tabella. |
max_length | La larghezza del valore più lungo nel risultato (impostata solo dopo mysqli_store_result()). |
length | La larghezza definita della colonna così come dichiarata nello schema. |
type | Un codice di tipo intero (vedere le costanti MYSQLI_TYPE_*). |
decimals | Numero di decimali per i campi numerici. |
flags | Una bitmask di flag MYSQLI_*_FLAG come NOT_NULL, PRI_KEY, AUTO_INCREMENT. |
Quando usarla?
Ricorri a mysqli_fetch_fields() quando hai bisogno di lavorare con un risultato di query in modo generico — senza conoscere le colonne in anticipo. Casi tipici:
- Costruire una griglia di amministrazione/dati che visualizza qualsiasi query
SELECT *, usando i nomi delle colonne come intestazioni di tabella. - Esportare i risultati in CSV con una riga di intestazione.
- Verificare se una colonna è una chiave primaria o auto-increment prima di generare un modulo di modifica.
Se hai bisogno solo dei nomi delle colonne, questo è il modo più diretto per ottenerli. Per recuperare la descrizione di un campo alla volta, usa invece mysqli_fetch_field(), e per contare le colonne usa mysqli_field_count().
Esempio: elencare ogni colonna in un result set
<?php
$mysqli = mysqli_connect("localhost", "user", "password", "shop");
$result = mysqli_query($mysqli, "SELECT id, name, price FROM products");
$fields = mysqli_fetch_fields($result);
foreach ($fields as $field) {
printf("Name: %s, Type: %d, Length: %d\n",
$field->name, $field->type, $field->length);
}
mysqli_free_result($result);
mysqli_close($mysqli);
?>Il ciclo foreach scorre l'array di oggetti campo e stampa il nome, il codice di tipo e la lunghezza definita di ciascuna colonna. Per le tre colonne selezionate l'output è simile a:
Name: id, Type: 3, Length: 11
Name: name, Type: 253, Length: 255
Name: price, Type: 246, Length: 10I valori numerici di type provengono dalle costanti MYSQLI_TYPE_* — ad esempio 3 è MYSQLI_TYPE_LONG (un INT) e 253 è MYSQLI_TYPE_VAR_STRING (un VARCHAR).
Costruire un'intestazione CSV dai nomi dei campi
Poiché l'array di campi è generico, puoi costruire una riga di intestazione per qualsiasi query senza codificare i nomi delle colonne in modo fisso:
<?php
$result = mysqli_query($mysqli, "SELECT * FROM products");
$header = array_map(
fn($field) => $field->name,
mysqli_fetch_fields($result)
);
echo implode(",", $header), "\n"; // id,name,pricearray_map() trasforma l'array di oggetti campo in un semplice array di nomi, e implode() li unisce con le virgole.
Insidie comuni
mysqli_fetch_fields()restituisce solo metadati. Non sposta il cursore delle righe e non restituisce dati di riga — combinala conmysqli_fetch_assoc()omysqli_fetch_array()per leggere le righe effettive.max_lengthè0con risultati non bufferizzati. Viene popolata solo quando l'intero result set è bufferizzato sul client tramitemysqli_store_result()(usato di default damysqli_query()). Conmysqli_use_result()il valore rimane0.typeeflagssono interi, non stringhe. Confrontali con le costantiMYSQLI_TYPE_*eMYSQLI_*_FLAGanziché con numeri magici, così l'intento è chiaro.- Verifica sempre che
$resultsia truthy prima di chiamare la funzione — una query fallita restituiscefalse, e passarefalsegenera un errore.
Funzioni correlate
mysqli_fetch_field()— recupera i metadati di una colonna alla volta.mysqli_field_count()— conta le colonne nel risultato.mysqli_field_seek()— sposta il cursore del campo a una colonna specifica.mysqli_fetch_assoc()— legge le righe del risultato come array associativi.