php - num_rows - mysqli_result example
Mysql resultados en PHP-matrices u objetos? (9)
He estado usando PHP / MySQL por un tiempo, y me pregunto si hay ventajas específicas (de rendimiento u otras) para usar mysql_fetch_object()
frente a mysql_fetch_assoc()
/ mysql_fetch_array()
.
Además, si finalmente desea aplicar Memcaching a sus resultados de MySQL, es posible que desee optar por matrices. Parece que es más seguro almacenar tipos de matriz, en lugar de los resultados de tipo de objeto.
Algo a tener en cuenta: las matrices se pueden agregar fácilmente a un caché de memoria (eaccelerator, XCache, ...), mientras que los objetos no (deben ser serializados cuando se guardan y se vuelven a serializar en cada recuperación).
Puede cambiar al uso de matrices en lugar de objetos cuando desee agregar compatibilidad con la memoria caché, pero es posible que en ese momento tenga que cambiar una gran cantidad de código, que usa los valores de retorno del tipo de objeto utilizado anteriormente.
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.
En cuanto a 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 array:
while ($row = mysql_fetch_array($result)) {
echo $row[0];
echo $row[1] ;
}
La obtención de una matriz con mysql_fetch_array()
permite recorrer el conjunto de resultados mediante un bucle foreach o un bucle for. mysql_fetch_object()
no puede ser atravesado por un ciclo for.
No estoy seguro si eso incluso importa mucho, solo pensé en mencionarlo.
Speed-wise, 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 de mysql_fetch_array()
Debido a que recupera las columnas indexadas numéricamente y los nombres de columna, 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, 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.
Entonces, en nombre de la cordura, por favor no use esta función, hace que el mantenimiento del código sea más difícil
mysql_fetch_array
hace que tu código sea difícil de leer = una pesadilla de mantenimiento. 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 se basa una capa db en él.
Los nombres de columna pueden no ser identificadores de PHP válidos, por ejemplo,
tax-allowance
ouser.id
si el controlador de su base de datos le da el nombre de la columna como se especifica en la consulta. Luego debes comenzar a usar{}
todos lados.Si desea obtener una columna basada en su nombre, introducida en alguna variable, también debe comenzar a usar las propiedades de la variable
$row->{$column_name}
, mientras que la sintaxis de la matriz$row[$column_name]
Los constructores no se invocan cuando puede esperar si especifica el nombre de clase.
Si no especificas el nombre de clase, obtienes
stdClass
, que de todos modos no es mejor que una matriz.
mysql_fetch_assoc
es el más fácil de los tres con los que trabajar, y me gusta la distinción que esto brinda 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){...}
Mientras que muchos fanáticos de OOP (y soy un fan de OOP) les gusta la idea de convertir todo en un objeto, siento que el conjunto asociativo es un mejor modelo de una fila de una base de datos que un objeto, ya que en mi mente un objeto es un conjunto de propiedades con métodos para actuar sobre ellas, mientras que la fila solo es información y debe tratarse como tal sin más complicaciones.
while ($Row = mysql_fetch_object($rs)) {
// ...do stuff...
}
... 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).