Foros del Web » Programando para Internet » PHP »

Pregunta sobre Mysql y Php

Estas en el tema de Pregunta sobre Mysql y Php en el foro de PHP en Foros del Web. Hola En principio gracias por este foro, y felicitaciones a los administradores. Mi pregunta creo que puede ayudar a otros. En asp tenemos una manera ...
  #1 (permalink)  
Antiguo 15/02/2004, 23:41
 
Fecha de Ingreso: febrero-2004
Mensajes: 3
Antigüedad: 20 años, 9 meses
Puntos: 0
Pregunta sobre Mysql y Php

Hola

En principio gracias por este foro, y felicitaciones a los administradores. Mi pregunta creo que puede ayudar a otros. En asp tenemos una manera de optimizar los tiempos de apertura de base de datos en el código interno de la página cerrando la conexión luego de ingresar los resultados de la consulta en un array, al que luego recorremos con un bucle for.

Mi pregunta es si se puede transcribir eso a php. Voy a los ejemplos en código a ver si es más claro.

Esto es lo que enseñan en los sitios y en php.net:

$sql="SELECT campo1, campo2, campo3 FROM tabla1;"
$selec= mysql_query($sql) or die ("error");
mysql_close($Conexion);
$filas= mysql_num_rows($selec);
If ($filas0 !=0) {
while ($row= mysql_fetch_array($selec)) {
$campo1=$row["campo1"];
$campo2=$row["campo2"];
$campo3=$row["campo3"];
echo "$campo1 $campo2 $campo3<br>";
}
}
mysql_free_result($selec);

Mi observación es que recién luego de terminar el while podemos liberar la memoria del mysql con el mysql_free_result.

Mi propósito era liberar esta memoria antes de realizar el while, y quería saber de que manera se puede iterar el resultado de la consulta, tanto metiendo esta en un array o pasándola por un bucle for o un foreach, lo que sea...

Veamos, aquí lo intento con un for, pero no se bien como asignar los valores a los ítems campo1, campo2 y campo3:

$sql="SELECT campo1, campo2, campo3 FROM tabla1;"
$selec= mysql_query($sql) or die ("error");
mysql_close($Conexion);
$filas= mysql_num_rows($selec);
If ($filas0 !=0) {
$row= mysql_fetch_array($selec)
mysql_free_result($selec);
for ($i=0; $i < $filas0; $i++) {


}
}


Bueno, gracias a todos los lectores y saludos.
  #2 (permalink)  
Antiguo 17/02/2004, 17:41
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 22 años, 10 meses
Puntos: 17
$filas= mysql_num_rows($selec);
If (count($filas) > 0) {

...

$filas[$num_reg]
__________________
M a l d i t o F r i k i
  #3 (permalink)  
Antiguo 17/02/2004, 21:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
La trancripción sería más o menos lo que puso cain ..

No hay que confundir un manejador de Base de datos que puede usar PHP .. con el própio lenguaje PHP como se suele mezclar a Access o SQL Server en ASP. PHP tiene la virtud de poder trabajar "nativamente" con váriados manejadores de base de datos entre ellos el familiar Mysql pero no es el único.

Tal vez no conozcas como funciona exactamente las funciones mysql_fetch_xxx() (array, assoc, object, row .. etc ..)

Lo que hace esa función es: por cada llamada a la función .. obtiene un "record-set" y mueve el puntero interno de la consulta una posición hacia adelante de ese record-set (consulta resultados obtenidos bajo la ejecución del SQL empleado). Al llegar al final del record-set . la función entrega un "false" por eso se usa mucho el bucle tipo while() en la forma:

Código PHP:
$consulta=mysql_query="SELECT * FROM tabla";
while(
$row=mysql_fetch_array($consulta)){
echo 
$row['nombre_campo'];

Así no es necesario andar contando el total de registros de la consulta con mysql_num_rows() ni usando mysql_data_seek() para mover el puntero interno como se haría algo así equivalente en ASP ..La función mysql_num_rows() realiza la consulta INTEGRA obteniendo internamente todo ese "record-set" y luego cuenta los registros obtenidos ... Es mucho más optimo hacerlo vía SQL con COUNT(*) (para Mysql o el SQL que corresponda para otros manejadores de BD que puedas emplear). .. El "COUNT(*)" te arroja UN sólo "recod-set" con ese total de registros. El consumo de recursos y tiempo empleado para la consulta es considerablemente menor a un mysql_num_rows() si (ojo) el objetivo final es sólo obtener ese total de registros (numero).

Si .. inmediatamente despues de ejecutar esa consulta y obtener sus datos (recor-set) no necesitas más esos datos .. puedes liberar memoria usando myslq_free_result($consulta) .. aunque PHP ya libera memoria al terminar la ejecución del script y cierra conexiones abiertas (no persistentes) a tus BD automáticamente. Pero, siempre es aconsejable liberar memoria en cuanto se pueda.

Un saludo,

PD: .. en tu código .. donde usas mysql_close($Conexion); estás cerrando la conexión .. si lo haces ahí mismo no podrás usar el resto de funciones para obtener tu record-set (mysql_fetch_xxx() ni nada más con tu BD por qué cerrastes la conexión .. debes mantenera abierta hasta que ya no la uses.
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 17/02/2004, 23:45
 
Fecha de Ingreso: febrero-2004
Mensajes: 3
Antigüedad: 20 años, 9 meses
Puntos: 0
Hola

Muchas gracias a Cluster y a Caín por estas respuestas. Veo por donde está la tónica del problema, pero pregunto en mi ignorancia:

Si liberamos la memoria con el mysql_free_result antes de realizar el bucle while, no se optimizan recursos del server?

Para realizar esto, es posible guardar el recordset en un array y luego recorrerlo con un bucle for?

Leí por ahí que el array de php no es asociativo como el de asp... será por eso que no se puede

Con respecto a cerrar la conexión, en el código de mi página php puedo cerrar la conexión a la base de datos con el mysql_close luego de consultar a la base, y los comandos mysql_num_rows y mysql_fetch_array siguen teniendo vigencia, ya que no vuelven a consultar la base sino que manejan el recordset obtenido.

Esta vigencia se pierde ciertamente si liberamos la memoria con el mysql_free_result, luego de esa sentencia, ya no podremos utilizar ni mysql_fetch_array como tampoco mysql_num_rows...

Una última pregunta, para Caín: que variable es $num_reg?

Saludos y muchas gracias nuevamente
  #5 (permalink)  
Antiguo 18/02/2004, 06:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
Si liberamos la memoria con el mysql_free_result antes de realizar el bucle while, no se optimizan recursos del server?
Si liberas memoria ... lo que haces es deshacerte del "record-set" obtenido por tu mysql_query() .. así que no podras usar ninguna función tipo mysql_fetch_array() .. mysql_result() o similar para recorrerlo (por qué lo habras borrado).

Cita:
Para realizar esto, es posible guardar el recordset en un array y luego recorrerlo con un bucle for?
Por poder hacerlo .. puedes, pero a nivel de optimización de recursos te quedarías en las mismas .. el "record-set" que ya te ocupó memoria lo pasarás a un array (más memoria) .. es más durante el tiempo de creación de ese array vas a duplicar los recursos empleados (memoria) y generar un tiempo de proceso que no creo que sea necesario.

Cita:
Leí por ahí que el array de php no es asociativo como el de asp... será por eso que no se puede
No sé donde leistes ... pero donde debes leer las peculiaridades técnicas de PHP es en el manual oficial: www.php.net

Los arrays que puedes generar de un "record-set" de PHP son asociativos.. incluso tienes la función msyql_fetch_assoc() y la función mysql_fetch_array() puedes acceder a sus indices por el nombre del campo de tu Tabla .. o bien por el indice numerico (como parece que se estila más en ASP).


Por cierto .. revisa el SQL de Msyql y mira la función COUNT() vs mysql_num_rows() .. En algunos casos te combiene usar una opción u otra.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 19/02/2004, 20:26
 
Fecha de Ingreso: febrero-2004
Mensajes: 3
Antigüedad: 20 años, 9 meses
Puntos: 0
Hola

Ahora sí está más claro, con tu última respuesta Cluster, me aclaraste el panorama con respecto al tema.

Saludos a todos y muchas gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:30.