2008-09-23 14 views

Respuesta

35

En cuanto a rendimiento, no importa lo que uses. La diferencia es que mysql_fetch_object Object:

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

mysql_fetch_assoc() devuelve matriz asociativa:

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

y mysql_fetch_array() devuelve array:

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

Básicamente, depende de su preferencia. – davethegr8

+7

pequeña diferencia, _row devuelve 0,1 .. y _array devuelve 'userid', 'fullname', '0', '1'. – Shinhan

+0

en el segundo argumento de mysql_fetch_array puede especificar el tiempo que desee resultado asociativo, resultado numérico o ambos (resultado significa un valor de índice de matriz) :) –

4

La obtención de una matriz con mysql_fetch_array() le permite recorrer el conjunto de resultados mediante un bucle foreach o un bucle for. mysql_fetch_object() no se puede atravesar con un bucle for.

No estoy seguro si eso incluso importa mucho, solo pensé en mencionarlo.

+7

propiedades de los objetos pueden repetirse a través de foreach en php5 + – Owen

+3

tiempo ($ fila = mysql_fetch_object ($ resultado)) funciona. Su uso es exactamente el mismo que mysql_fetch_array() excepto que tiene acceso con $ row-> field en lugar de $ row ['field']. – cubex

+0

Owen, eso es exactamente lo que dije. –

0

Creo que la diferencia entre todas estas funciones es insignificante, especialmente cuando se compara con la legibilidad del código.

Si le preocupa este tipo de optimización, use mysql_fetch_row(). Es el más rápido porque no usa matrices asociativas (por ejemplo, $ row [2]), pero es más fácil romper el código con él.

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

... así es como siempre lo he hecho. Prefiero usar objetos para colecciones de datos en lugar de matrices, ya que organiza los datos un poco mejor, y sé que es mucho menos probable que intente agregar propiedades arbitrarias a un objeto que intentar agregar un índice a una matriz (durante los primeros años que utilicé PHP, pensé que no podía asignar propiedades arbitrarias a un objeto, por lo que está arraigado para no hacer eso).

+0

No he visto mucho código así en la naturaleza. –

0

velocidad-sabia, mysql_fetch_object() es idéntico a mysql_fetch_array(), y casi tan rápido como mysql_fetch_row().

Además, con mysql_fetch_object(), solo podrá acceder a los datos de campo por los nombres de campo correspondientes.

-2

Yo voto en contra mysql_fetch_array()

Debido a recuperar ambas columnas indexado numéricamente y nombres de columna, esto crea una matriz que es el doble de grande. Está bien si no necesita depurar su código y ver su contenido. Pero para el resto de nosotros, se vuelve más difícil de depurar, ya que tiene que recorrer el doble de datos en un formato de aspecto extraño.

A veces me encuentro con un proyecto que usa esta función y luego cuando depuro, creo que algo ha ido terriblemente mal ya que tengo columnas numéricas mezcladas con mis datos.

Así que en nombre de la cordura, por favor no utilice esta función, se hace el mantenimiento del código más difícil

+4

mysql_fetch_array() devuelve una matriz con índices numéricos y asociativos; Diversión para toda la familia. – hlpiii

+0

ahh ¡tu derecha! Estaba pensando en otra función. Revisé mi respuesta – SeanDowney

5

Algo a tener en cuenta: las matrices pueden ser fácilmente añadidos a una memoria caché (eaccelerator, XCache,. .), mientras que los objetos no pueden (deben ser serializados cuando se almacenan y se deserializan en cada recuperación).

Puede cambiar al uso de matrices en lugar de objetos cuando desee agregar soporte de caché de memoria, pero para ese momento es posible que tenga que cambiar una gran cantidad de código, que usa los valores de retorno del tipo de objeto utilizado anteriormente.

+1

Buen punto (soporte de memoria caché). –

30

mysql_fetch_array hace que su código sea difícil de leer una pesadilla = maintenace. No puede ver a simple vista qué datos está tratando su objeto. Es ligeramente más rápido, pero si eso es importante para usted, está procesando tantos datos que es probable que PHP no sea el camino correcto.

mysql_fetch_object tiene algunos inconvenientes, especialmente si basa una capa db en él.

  • Los nombres de columna no pueden ser identificadores válidos PHP, por ejemplo tax-allowance o user.id si el controlador de base de datos que da el nombre de columna como se especifica en la consulta. Luego debe comenzar a usar {} en todas partes.

  • Si desea obtener una columna en función de su nombre, stroed de alguna variable que también tiene que empezar a utilizar las propiedades de variables $row->{$column_name}, mientras que la sintaxis de matrices $row[$column_name]

  • constructores no se deje invoca cuando se podría esperar si especifica el nombre de clase.

  • Si no especifica el nombre de clase, obtiene un stdClass, que de todos modos no es mejor que una matriz.

mysql_fetch_assoc es el más fácil de los tres trabajar con él, y me gusta la distinción esto da en el código entre los objetos y las filas de resultados de base de datos ...

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

Mientras que muchos aficionados programación orientada a objetos (y soy un ventilador de programación orientada a objetos) al igual que la idea de convertir todo en un objeto, siento que la matriz asociativa es un mejor modelo de una fila de una base de datos de un objeto, como en mi mente un objeto es un conjunto de propiedades con métodos para actuar sobre ellos, mientras que la fila es solo información y debe tratarse como tal sin complicaciones adicionales ción.

+3

+1 para la mejor respuesta sobre el tema. Solía ​​usar Assoc, luego cambié a objetos (en un intento de hacer que todos los objetos), pero volví a Assoc por las razones que dijiste; Se parece más a los datos como una matriz que como un objeto. –

+0

@ J.Money Pero, ¿qué pasa cuando realmente cambias a los resultados de la base de datos representados por objetos? Como en los patrones de registro activo, prefiero que el front-end ya esté usando una interfaz de objeto. $ user = User :: find (1), luego en el frente si ya está implementado como $ user-> email, no hay cambios que hacer. Le da más flexibilidad para permitir que los métodos sean llamados desde la interfaz en los resultados. Aunque sigue siendo bastante trivial hacer que los objetos implementen la interfaz ArrayAccess para hacer que $ user ['email'] haga exactamente lo mismo con el objeto que $ user-> email ... – Anther

+0

@Anther Magic hace que sea sencillo implementar un activo grabar utilizando matrices para contener los datos de la fila. Sin embargo, tienes razón, ya que PHP se mueve más hacia OOP, la implementación de mysql_fetch_ * está sucediendo detrás de escena y, por lo tanto, es trivial si se usa uno u otro. De hecho, la única razón por la que comencé a pensar en esto fue porque estoy reescribiendo el código de procedimiento de alguien para estar más orientado a objetos y no usa una capa de abstracción de base de datos. Usan todas las funciones mysql_fetch_ * sin ningún patrón discernible en todo. –

2

Además, si finalmente desea aplicar Memcaching a los resultados de MySQL, es posible que desee optar por las matrices. Parece que es más seguro almacenar tipos de matriz, en lugar de los resultados de tipo de objeto.