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()
.Mysql resultados en PHP - matrices u objetos?
Respuesta
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] ;
}
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.
propiedades de los objetos pueden repetirse a través de foreach en php5 + – Owen
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
Owen, eso es exactamente lo que dije. –
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.
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).
No he visto mucho código así en la naturaleza. –
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.
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
mysql_fetch_array() devuelve una matriz con índices numéricos y asociativos; Diversión para toda la familia. – hlpiii
ahh ¡tu derecha! Estaba pensando en otra función. Revisé mi respuesta – SeanDowney
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.
Buen punto (soporte de memoria caché). –
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
ouser.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.
+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. –
@ 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
@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. –
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.
- 1. Además de objetos y matrices
- 2. ¿Puedes reutilizar un conjunto de resultados mysql en PHP?
- 3. Agrupación de matrices en PHP
- 4. Matrices MongoDB contra objetos
- 5. matrices de objetos nudosos
- 6. PHP obtener diferencia de dos matrices de objetos
- 7. Accediendo matrices dentro de matrices En PHP
- 8. Las estructuras u objetos en Powershell 2
- 9. Comparación de matrices de objetos
- 10. ¿Cómo convertir una matriz de matrices u objetos a una matriz asociativa?
- 11. Obtener filas de la tabla mysql para matrices php
- 12. Establecer teoría Unión de matrices en PHP
- 13. Comparación de matrices de objetos en JavaScript
- 14. ¿La función count() de PHP es O (1) u O (n) para matrices?
- 15. .NET o PHP, ¿Corporativo u Open-Source?
- 16. PHP: Agregar matrices juntas
- 17. PHP: Combinar matrices multidimensionales
- 18. Validación de objetos PHP
- 19. php fusionar dos matrices
- 20. PHP/MySQL OOP: Cargando objetos complejos desde SQL
- 21. PHP ordenar matrices multidimensionales
- 22. Cómo enviar objetos en PHP
- 23. MySQL LEFT JOIN duplica los resultados
- 24. enviando matrices en _GET en php
- 25. Resultados de MySQL en un archivo
- 26. php mysql timestamp
- 27. cómo construir matrices de objetos en PHP sin especificar un número de índice?
- 28. Comparación de matrices de objetos, forma óptima
- 29. ¿Cómo obtener el mismo valor de dos matrices en PHP?
- 30. matriz de objetos numerados de matrices numéricas
Básicamente, depende de su preferencia. – davethegr8
pequeña diferencia, _row devuelve 0,1 .. y _array devuelve 'userid', 'fullname', '0', '1'. – Shinhan
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) :) –