Pregunta

estado usando PHP/MySQL desde hace un tiempo, y me pregunto si hay alguna ventaja específica (de rendimiento o de otro tipo) al usar mysql_fetch_object() vs mysql_fetch_assoc() / mysql_fetch_array().

¿Fue útil?

Solución

En cuanto al rendimiento, no importa lo que uses.La diferencia es que mysql_fetch_object devuelve el objeto:

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

mysql_fetch_assoc() devuelve una matriz asociativa:

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

y mysql_fetch_array() devuelve una matriz:

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

Otros consejos

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

mysql_fetch_object tiene algunos inconvenientes, especialmente si basas una capa de base de datos en él.

  • Los nombres de las columnas pueden no ser identificadores PHP válidos, por ejemplo tax-allowance o user.id si el controlador de su base de datos le proporciona el nombre de la columna como se especifica en la consulta.Entonces tienes que empezar a usar {} por todo el lugar.

  • Si desea obtener una columna según su nombre, incluida alguna variable, también debe comenzar a usar propiedades de variable. $row->{$column_name}, mientras que la sintaxis de matriz $row[$column_name]

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

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

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

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

Si bien a muchos fanáticos de la programación orientada a objetos (y yo soy un fanático de la programación orientada a objetos) les gusta la idea de convertir todo en un objeto, creo que la matriz asociativa es un mejor modelo de una fila de una base de datos que un objeto, ya que en mi opinión un objeto es un conjunto de propiedades con métodos para actuar sobre ellas, mientras que la fila son solo datos y deberían ser tratado como tal sin mayores complicaciones.

Algo para tener en cuenta:las matrices se pueden agregar fácilmente a una memoria caché (eaccelerator, XCache, ...), mientras que los objetos no (¡deben serializarse cuando se almacenan y deserializarse en cada recuperación!).

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

Obteniendo 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 puede ser atravesado por un bucle for.

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

Además, si eventualmente desea aplicar Memcaching a sus resultados de MySQL, puede optar por matrices.Parece que es más seguro almacenar tipos de matrices, en lugar de resultados de tipos de objetos.

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 usé PHP, pensé que no se podían simplemente asignar propiedades arbitrarias a un objeto, por lo que está arraigado no hacer eso).

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

Si le preocupa este tipo de optimización, utilice mysql_fetch_row().Es el más rápido porque no utiliza matrices asociativas (p. ej.$row[2]), pero es más fácil descifrar el código con él.

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

También con mysql_fetch_object() solo podrá acceder a los datos de los campos mediante los nombres de campo correspondientes.

yo voto en contra mysql_fetch_array()

Debido a que obtienes columnas indexadas numéricamente y nombres de columnas, esto crea una matriz que es dos veces más grande.Está bien si no necesita depurar su código y ver su contenido.Pero para el resto de nosotros, resulta más difícil depurar, ya que hay que revisar el doble de datos en un formato de aspecto extraño.

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

Entonces, en nombre de la cordura, no utilice esta función, ya que dificulta el mantenimiento del código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top