Mysql resultados en PHP - matrices u objetos?


24

He estado usando PHP/MySQL por un tiempo, y me pregunto si hay ventajas específicas (de rendimiento o de otro tipo) para usar mysql_fetch_object() contra mysql_fetch_assoc()/mysql_fetch_array().

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. 23 sep. 082008-09-23 22:53:43

+7

pequeña diferencia, _row devuelve 0,1 .. y _array devuelve 'userid', 'fullname', '0', '1'. 24 sep. 082008-09-24 08:49:24

  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) :) 02 mar. 122012-03-02 23:13:23

+1

basado en este artículo http: //www.spearheadsoftwares.com/tutoriales/php-performance-benchmarking/50-mysql-fetch-assoc-vs-mysql-fetch-array-vs-mysql-fetch-object en consultas GRANDES debe usar _assoc() o _array() 18 jul. 132013-07-18 17:44:41


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 + 23 sep. 082008-09-23 22:17:14

+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']. 23 sep. 082008-09-23 22:19:39

  0

Owen, eso es exactamente lo que dije. 23 sep. 082008-09-23 22:42:02

  0

Personalmente me siento más cómodo con las matrices asociativas y foreach, pero probaré el método de objetos y veré si puedo hacer que funcione. 01 nov. 082008-11-01 21:16:10

  0

Pobre Steve acaba de ser atornillado por personas que no leen lo que escribió correctamente. Odio cuando sucede eso, pero puedo entender por qué lo leyeron de la manera en que lo hicieron. Dejaste la declaración bastante ambigua. 06 abr. 102010-04-06 02:08:33

  0

+1 para llegar a 0. Pero en serio, es fácil malinterpretar tu respuesta 21 may. 102010-05-21 05:45:33


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. 24 jul. 122012-07-24 22:19:23


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. 10 oct. 092009-10-10 23:41:55

  0

ahh ¡tu derecha! Estaba pensando en otra función. Revisé mi respuesta 25 jul. 122012-07-25 17:20:42


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é). 24 jul. 122012-07-24 22:20:01


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. 21 ago. 122012-08-21 18:35:06

  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 ... 22 ago. 122012-08-22 17:53:18

  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. 22 ago. 122012-08-22 18:24:39

  0

@ bažmegakapa Esta respuesta tiene mucho sentido para mí, y en realidad he estado pensando en volver a mysql_fetch_assoc desde mysql_fetch_object. Encuentro que mysql_fetch_object puede ser realmente confuso cuando comienzas a unirte en campos de otras tablas. Una pregunta, si puedo. Normalmente tengo pocas funciones de utilidad en mis clases de objetos. Por ejemplo, full_name() devolverá $ this-> first_name. ''. $ this-> last_name. Pierdo acceso rápido a estos métodos cuando cambio a arreglos. ¿Cómo has lidiado con ese problema? 02 ene. 132013-01-02 22:50:34

  0

@Jonathan No he escrito esta respuesta, solo la he editado. Esta es la respuesta de darkpenguin, que parece ser un usuario eliminado. (Yo diría olvidar las viejas cosas 'mysql_' y cambiar a PDO) 03 ene. 132013-01-03 02:34:55


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.