Domanda

Ho usato PHP / MySQL per un po 'di tempo, e mi chiedo se ci siano vantaggi specifici (prestazioni o altro) nell'uso di mysql_fetch_object () vs mysql_fetch_assoc () / mysql_fetch_array () .

È stato utile?

Soluzione

Dal punto di vista delle prestazioni, non importa cosa usi. La differenza è che mysql_fetch_object restituisce oggetto:

while ($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}

mysql_fetch_assoc () restituisce un array associativo:

while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
}

e mysql_fetch_array () restituisce array:

while ($row = mysql_fetch_array($result)) {
    echo $row[0];
    echo $row[1] ;
}

Altri suggerimenti

mysql_fetch_array rende il tuo codice difficile da leggere = un incubo di manutenzione. Non puoi vedere a colpo d'occhio con quali dati tratta il tuo oggetto. È leggermente più veloce, ma se è importante per te stai elaborando così tanti dati che PHP probabilmente non è la strada giusta da percorrere.

mysql_fetch_object presenta alcuni inconvenienti, specialmente se si basa un livello db su di esso.

  • I nomi delle colonne potrebbero non essere identificatori PHP validi, ad es. agevolazioni fiscali o user.id se il driver del database fornisce il nome della colonna come specificato nella query. Quindi devi iniziare a utilizzare {} dappertutto.

  • Se vuoi ottenere una colonna in base al suo nome, tratteggiata in una variabile devi anche iniziare a usare le proprietà della variabile $ row- > {$ column_name} , mentre la sintassi dell'array $ row [$ nome_colonna]

  • I costruttori non vengono invocati quando ci si potrebbe aspettare se si specifica il nome della classe.

  • Se non si specifica il nome della classe, si ottiene un stdClass , che comunque non è affatto migliore di un array.

mysql_fetch_assoc è il più semplice dei tre su cui lavorare, e mi piace la distinzione che questo dà nel codice tra oggetti e righe dei risultati del database ...

$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}

Mentre molti fan di OOP (e io sono un fan di OOP) amano l'idea di trasformare tutto in un oggetto, penso che l'array associativo sia un modello migliore di una riga da un database rispetto a un oggetto, come nella mia mente un oggetto è un insieme di proprietà con metodi per agire su di essi, mentre la riga è solo un dato e dovrebbe essere trattata come tale senza ulteriori complicazioni.

Qualcosa da tenere a mente: le matrici possono essere facilmente aggiunte a una cache di memoria (eaccelerator, XCache, ..), mentre gli oggetti non possono (devono essere serializzati durante l'archiviazione e non serializzati ad ogni recupero!).

È possibile passare all'utilizzo di array anziché di oggetti quando si desidera aggiungere il supporto della cache di memoria, ma a quel punto potrebbe essere necessario modificare già molto codice, che utilizza i valori restituiti del tipo di oggetto precedentemente utilizzato.

Il recupero di un array con mysql_fetch_array () consente di scorrere il set di risultati tramite un ciclo foreach o un ciclo for. mysql_fetch_object () non può essere attraversato da un ciclo for.

Non sono sicuro che sia importante, ho pensato di menzionarlo.

Inoltre, se alla fine si desidera applicare Memcaching ai risultati MySQL, è possibile optare per gli array. Sembra che sia più sicuro archiviare i tipi di array, piuttosto che i risultati del tipo di oggetto.

while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

... è come l'ho sempre fatto. Preferisco usare oggetti per raccolte di dati anziché array, poiché organizza i dati un po 'meglio e so che sono molto meno propenso a provare ad aggiungere proprietà arbitrarie a un oggetto di quanto non lo sia io per provare ad aggiungere un indice a un array (per i primi anni ho usato PHP, ho pensato che non potevi semplicemente assegnare proprietà arbitrarie a un oggetto, quindi è radicato per non farlo).

Penso che la differenza tra tutte queste funzioni sia insignificante, specialmente se paragonata alla leggibilità del codice.

Se sei preoccupato per questo tipo di ottimizzazione, usa mysql_fetch_row () . È il più veloce perché non utilizza array associativi (ad esempio $ row [2]), ma è più facile violare il codice con esso.

Per quanto riguarda la velocità, mysql_fetch_object () è identico a mysql_fetch_array () e quasi altrettanto veloce di mysql_fetch_row () .

Inoltre, con mysql_fetch_object () sarai in grado di accedere ai dati dei campi solo con i nomi dei campi corrispondenti.

Voto contro mysql_fetch_array()

Poiché si ottengono sia le colonne indicizzate numericamente sia i nomi delle colonne, viene creato un array di dimensioni doppie. Va bene se non è necessario eseguire il debug del codice e visualizzarne il contenuto. Ma per il resto di noi, diventa più difficile eseguire il debug poiché è necessario guadare il doppio dei dati in un formato dall'aspetto strano.

A volte mi imbatto in un progetto che utilizza questa funzione, quindi quando eseguo il debug, penso che qualcosa sia andato storto dal momento che ho colonne numeriche mescolate con i miei dati.

Quindi, in nome della sanità mentale, per favore non usare questa funzione, rende più difficile la manutenzione del codice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top