fetch_object
Scopri come usare mysqli_fetch_object() in PHP per leggere righe di un risultato MySQLi come oggetti, anche istanze di classi personalizzate.
mysqli_fetch_object() legge la riga successiva di un result set MySQLi e la restituisce come object PHP le cui proprietà prendono il nome dalle colonne della query. È il corrispettivo orientato agli oggetti di mysqli_fetch_assoc() e mysqli_fetch_array(): invece di scrivere $row['name'] si scrive $row->name.
Questo capitolo tratta la firma della funzione, come accedere alle colonne, come popolare le righe nelle proprie classi, la gestione degli errori e quando preferirla rispetto ai fetcher basati su array.
Sintassi
mysqli_fetch_object(
mysqli_result $result,
string $class = "stdClass",
array $constructor_args = []
): object|null|falseNello stile orientato agli oggetti la stessa chiamata è $result->fetch_object().
| Parametro | Descrizione |
|---|---|
$result | Un result set restituito da mysqli_query(), mysqli_store_result() o mysqli_use_result(). |
$class | Opzionale. Il nome della classe da istanziare per ogni riga. Il valore predefinito è stdClass (un object anonimo generico). |
$constructor_args | Opzionale. Un array di argomenti passati al costruttore della classe. |
Valore restituito:
- Un object popolato con le colonne della riga quando una riga è disponibile.
nullquando non ci sono più righe (questo è ciò che termina il ciclowhile).falsein caso di errore.
Utilizzo di base
Chiama la funzione in un ciclo while. Ogni iterazione avanza il puntatore interno di riga di uno finché non viene restituito null:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
$result = mysqli_query($mysqli, "SELECT name, email FROM users");
if ($result) {
while ($row = mysqli_fetch_object($result)) {
printf("%s (%s)\n", $row->name, $row->email);
}
mysqli_free_result($result);
}
mysqli_close($mysqli);
?>Ogni $row è un object stdClass, quindi le sue proprietà corrispondono ai nomi delle colonne selezionate (o ai loro alias). Se una colonna non esiste nella riga riceverai un avviso e null, quindi seleziona sempre le colonne che intendi leggere.
Importante — nomi delle colonne, non posizioni. Poiché l'object è indicizzato per nome,
SELECT *eSELECT name, emailsi comportano diversamente per l'ordinamento. Preferisci nominare le colonne esplicitamente in modo che una modifica dello schema non possa rompere l'accesso alle proprietà.
Popolare le righe nelle proprie classi
Il vero punto di forza di mysqli_fetch_object() rispetto ai fetcher basati su array è che può costruire istanze di tue classi. Passa il nome della classe come secondo argomento:
<?php
class User
{
public string $name;
public string $email;
public function greet(): string
{
return "Hi, I'm {$this->name}";
}
}
$result = mysqli_query($mysqli, "SELECT name, email FROM users");
while ($user = mysqli_fetch_object($result, User::class)) {
echo $user->greet(), "\n"; // calls a real method on a real User object
}
?>L'assegnazione delle proprietà avviene prima dell'esecuzione del costruttore. PHP imposta i valori delle colonne direttamente sulle proprietà dell'object, quindi chiama __construct(). Se la tua classe ha bisogno che il costruttore veda quei valori, tieni conto di quell'ordine:
<?php
class Product
{
public string $name;
public float $price;
public string $label;
public function __construct(string $currency = "USD")
{
// $this->name and $this->price are already set here
$this->label = "{$this->name}: {$this->price} {$currency}";
}
}
// Constructor args are passed as the third parameter:
$product = mysqli_fetch_object($result, Product::class, ["EUR"]);
?>Gestione dell'assenza di righe e degli errori
Distingui "nessun'altra riga" (null) da un vero errore (false):
<?php
$result = mysqli_query($mysqli, "SELECT name FROM users WHERE id = 999");
if ($result === false) {
echo "Query failed: " . mysqli_error($mysqli);
} else {
$row = mysqli_fetch_object($result);
if ($row === null) {
echo "No user found.";
} else {
echo $row->name;
}
}
?>Per il codice in produzione, abilita la modalità eccezione in modo che le query fallite generino un'eccezione invece di restituire false:
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);fetch_object vs. gli altri fetcher
| Funzione | Restituisce | Accesso alle colonne tramite |
|---|---|---|
mysqli_fetch_object() | object | $row->name |
mysqli_fetch_assoc() | array associativo | $row['name'] |
mysqli_fetch_array() | array (entrambi) | $row['name'] e $row[0] |
mysqli_fetch_row() | array enumerato | $row[0] |
mysqli_fetch_all() | array di tutte le righe | per indice o nome |
Scegli mysqli_fetch_object() quando vuoi un accesso pulito tramite ->property o quando vuoi che ogni riga venga trasformata in un domain object con comportamento (metodi). Scegli i fetcher basati su array quando hai bisogno di dati semplici su cui iterare o da serializzare.
Best practice
- Usa prepared statement per qualsiasi valore proveniente dall'input dell'utente per prevenire SQL injection; puoi comunque chiamare
fetch_object()sul risultato di un prepared statement. - Libera il risultato con
mysqli_free_result()quando hai finito per rilasciare memoria con result set di grandi dimensioni. - Seleziona solo le colonne di cui hai bisogno in modo che le proprietà dell'object siano prevedibili e le query rimangano veloci.
Conclusione
mysqli_fetch_object() scorre un result set MySQLi una riga alla volta, restituendo ogni riga come un object con proprietà corrispondenti ai nomi delle colonne — o, quando viene fornito un nome di classe, come un'istanza completamente costruita della tua classe. Restituisce null quando le righe sono esaurite e false in caso di errore. Usala quando la sintassi ad object o l'idratazione del dominio risulta più leggibile dei fetcher basati su array come mysqli_fetch_assoc().