Foros del Web » Programando para Internet » PHP »

arreglos y bases de datos

Estas en el tema de arreglos y bases de datos en el foro de PHP en Foros del Web. por mas que intento no logro hacer con el resultado de una consulta como acostumbraba a hacer en asp, habiendo obtenido el resultado de una ...
  #1 (permalink)  
Antiguo 07/07/2006, 04:28
 
Fecha de Ingreso: abril-2005
Mensajes: 70
Antigüedad: 12 años, 7 meses
Puntos: 0
arreglos y bases de datos

por mas que intento no logro hacer con el resultado de una consulta como acostumbraba a hacer en asp, habiendo obtenido el resultado de una Query lo metia en un arreglo bidimencional, por ejemplo:

MiArreglo=tabla.GetRows

y luego, en otro procedimiento totalmente fuera de la coneccion de la base de daos, hacia un ciclo desde cero hasta el final del arreglo mostrando sus datos, por ejemplo:

for i=0 to Ubound(MiArreglo,2)
' Mostrar los datos
next

el asunto es que en PHP por mas que lo intento no lo logro, he usado la funcion mysql_fetch_array para meter el resultado de la consulta en un arreglo y para decir los limites del ciclo he usado "count" e incluso mysql_affected_rows pero no lo logro. Please me pueden ayudar?
  #2 (permalink)  
Antiguo 07/07/2006, 07:16
 
Fecha de Ingreso: junio-2002
Mensajes: 751
Antigüedad: 15 años, 6 meses
Puntos: 22
Código PHP:
$consulta "SELECT * FROM EMPLEADOS";
$resultado mysql_db_query($consulta); // ejecutar la consulta

// recorrer los reslutados
while( $fila mysql_fetch_array($resultado) ){
  echo 
$fila['nombre'] . '<br/>';
  echo 
$fila['apellido'];

  #3 (permalink)  
Antiguo 07/07/2006, 07:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Te vendría bien leer un tutorial sobre PHP al respecto:

En el mensaje de las FAQ's de este foro tienes una lista completa ...

Y la documentación con ejemplos de esas funciones:
www.php.net/mysql_fetch_array

Lo más importante es que conozcas como funcionan en PHP ese tipo de funciones "fetch" y lo que hacen:

Estas funciones lo que hacen a diferencia de ASP es; te entregan el primer resultado de tu resultado (de tu record-set) y -mueven el puntero una posición hacia adelante- (a diferencia de otros lenguajes donde hay que "mover" expresamente con alguna función el puntero del record-set hacia una posición adelante o donde corresponda). A si mismo .. cuando se "acaban" los resultados .. estas funciones devuelven un "false" .. Por eso se usa como ves en el ejemplo de all-ill en un bucle tipo while() ("mientras no me dé "falso" .. vamos obteniendo los registros del resultado .. a cada pasada del bucle .. se obtiene el siguiente resultado pues como ya te he comentado .. el "puntero" queda una posición adelante por cada llamada a ese tipo de funciones).

Otras funciones que tendrías que estudiar y usar:

mysql_num_rows() (que cuenta el n° de resultados de tu consulta SQL ejecutada y en consecuencia se usa para validar si tienes resultados o no y así no "recorrer" un resultado que no existe con el consiguiente error que eso plantea si no lo validas).

mysql_result() (por si quieres acceder a un resultado concreto directo que sabes su posición .. útil cuando sabes que obtendras un resultado (registro) o cero .. y sólo necesitas un campo en concreto de ese registro ..)

En generar debes revisar la documentación de PHP al respecto:
www.php.net/mysql

No sirve de mucho "buscarle" las vueltas en PHP a "como lo haces en otro lenguaje" .. acabas antes revisando la documentación oficial de PHP, por qué si bien podrías en muchos casos "simular" el funcionamiento de tal o cual rutina en PHP con más funciones, a veces PHP resuelve con -otras- funciones y más directas muchas taréas típicas .. sabiendo tu lo que deseas hacer y teniendo claros como ya los tienes conceptos de programación o de "BBDD" como en este caso.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 12/07/2006, 04:14
 
Fecha de Ingreso: abril-2005
Mensajes: 70
Antigüedad: 12 años, 7 meses
Puntos: 0
muchas gracias por la ayuda. queria hacerlo como lo hago en asp porque asi entro a la base de datos una sola vez y tengo los datos en la mano por todo el tiempo de ejecucion si quiero y la base de datos se mantiene libre, de este otro modo que me explican debo mantener la base de datos abierta mientras opero con los resultados, y los procedimientos que quiera hacer con el resultado debo hacerlos por fuerza en el momento de ejecucion de la consulta; estaba buscando el modo de evitarlo. Reitero una vez mas mi agradecimiento por la explicacion.
  #5 (permalink)  
Antiguo 12/07/2006, 05:42
 
Fecha de Ingreso: abril-2005
Mensajes: 70
Antigüedad: 12 años, 7 meses
Puntos: 0
Bueno amigos encontre una solucion para mi problema, para poder mantener los datos del resultado de la consulta durante todo el tiempo de ejecucion e incluso poder hacer otras consultas manteniendo ahun mis datos en un arreglo, la solucion es un poco infantil pero necesitaba resolver el problema lo mas rapido posible:

function dbase($host,$user,$pass,$database,$consulta)
{
$db=mysql_connect($host, $user, $pass );
mysql_select_db($database, $db);
$consulta=mysql_query($consulta, $db);
$c=0;
while( $records = mysql_fetch_array($consulta) ){
$arreglob[0][$c] = $records['ID'];
$arreglob[1][$c] = $records['NomeAlbergo'];
$c=$c+1;
}
mysql_close($db);
return $arreglob;
}

seguro sera fuertemente criticado jeje cosas de principiante. Salu2
  #6 (permalink)  
Antiguo 12/07/2006, 07:17
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm Ok .. si .. así te "llevas" tu "recor-set" a un array (bidimensional) .. Pero te comento que PHP para eso tiene funciones para moverte por un "record-set" dado (o "resultado").

Por ejemplo .. tu haces tu consulta SQL típica, la ejecutas (mysql_query()) y como ya has visto .. con funciones como mysql_fetch_arrary() o similares accedes al resultado. Ok .. si ahora quieres -re-usar- ese resultado sin volver hacer la consulta SQL en el tiempo de ejecución de ese script puedes volver hacerlo simplemente moviendo el puntero del resultado al principio (o donde necesites) con funciones como:

mysql_data_seek()

Y de ahí .. otro típico mysql_fech_array() o un mysql_result() o lo que necesites.

La consulta SQL no se genera de nuevo y no consumes más recursos. Fijate que a tu manera .. tienes el "resource" ya generado (y que no se elminia hasta que haces un mysql_free_result() al menos o definitivamente cierras la conexión con mysql_close() o termina la ejecución del script donde PHP cierra por defecto toda conexión establecida, se deshace de variables en curso y mata todo socket abierto ... , y por otro lado "duplicas" esos mismos datos en tus arrays.

En resumen .. usando las funciones de "Mysql" nativas puedes moverte por tu resultado como gustes (tal cual lo harías con un array bidimensional clásica).

Dado esta explicación ... recapitulando:
Cita:
de este otro modo que me explican debo mantener la base de datos abierta mientras opero con los resultados,
¿Será tan considerable teniendo en cuenta el tiempo de proceso, consumir por un tiempo más una conexión a tu BB.DD. (que no son ni persistentes) o el sobre-consumo de memoria que haces para la ejecución de tu script?

Podrías hacer pruebas y nos comentas .. a ver si tu comodidad de uso vs a rendimiento y consumo de recursos es considerable o bien despreciable. Puedes usar funciones como microtime() para calcular tiempos de ejecución en uno u otro caso (el tema de la memoria ocupara no podrías verlo con funciones de PHP directamente lamentablemente .. sólo si tienes control total del servidor).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 12/07/2006 a las 07:22
  #7 (permalink)  
Antiguo 12/07/2006, 09:10
 
Fecha de Ingreso: abril-2005
Mensajes: 70
Antigüedad: 12 años, 7 meses
Puntos: 0
Una vez mas te doy las gracias por la ayuda. estoy seguro de que tienes razón con respecto al tiempo de ejecución del script pero es que llamo tantas veces en un mismo script a un procedimiento como esta que hacerlo para cada llamada seria muy engorroso, alfinal conclui el asunto asi:

function DBFunction($host,$user,$pass,$database,$consulta)
{
global $numrecords, $numcampos;
$db=mysql_connect($host, $user, $pass );
mysql_select_db($database, $db);
$consulta=mysql_query($consulta, $db);
$numrecords=mysql_num_rows($consulta);
$numcampos=count(mysql_fetch_row($consulta)) ;
mysql_data_seek($consulta,0);
$c=0;
while( $records = mysql_fetch_array($consulta) ){
for ($nc=0; $nc<=$numcampos; $nc++){
$arreglob[$nc][$c] = $records[$nc];
}
$c=$c+1;
}
mysql_free_result($consulta);
mysql_close($db);
return $arreglob;
}

siendo $numrecords y $numcampos variables de control para controlar las dimenciones de los tablas que hare con este arreglo que me llevo. como te decia de este modo puedo llamar a esta funcion desde dos, tres,,,n procedimientos concecutivos que necesitan hacer consultas diferentes, que de otro modo pienso que seria bastante engorroso. no es que este tan seguro, siempre sera valiosa tu opinion, que dices?
Salu2
  #8 (permalink)  
Antiguo 12/07/2006, 10:22
 
Fecha de Ingreso: abril-2005
Mensajes: 70
Antigüedad: 12 años, 7 meses
Puntos: 0
solo tengo un problema, que cuando no se encuentran en la base de datos los parametros de la consulta me da el siguiente error:

Warning: mysql_data_seek(): Offset 0 is invalid for MySQL result index 3 (or the query data is unbuffered) in D:\Divelopment\syshotels php\hotels.php on line 127

la linea 127 es la mysql_data_seek. En cambio cuando se encuentran los parametros en la base de datos todo funciona bien.
  #9 (permalink)  
Antiguo 12/07/2006, 10:43
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por roilld
solo tengo un problema, que cuando no se encuentran en la base de datos los parametros de la consulta me da el siguiente error:

Warning: mysql_data_seek(): Offset 0 is invalid for MySQL result index 3 (or the query data is unbuffered) in D:\Divelopment\syshotels php\hotels.php on line 127

la linea 127 es la mysql_data_seek. En cambio cuando se encuentran los parametros en la base de datos todo funciona bien.
Como veras .. dicha función "mueve" punteros del resultado .. pero si existe. Por eso antes de aplicar esa función deberías ver si realmente obtuvistes resultados y no sólo esa función .. sino todas las _fetch_ o _result .. acutan sobre el "record-set" generado .. y eso esperan como parámetro. Para eso se usa:

mysql_num_rows() .. y validas con ese dato >0 resultado o lo que esperes. Tu sólo lo obtienes pero no lo validas:

Código PHP:
if (mysql_num_rows($consulta)>0){
// Operas con tu resultado ..
} else {
// no hay resultados .. 
return $arreglob=array();

Tampoco veo claro por qué incluyes la conexión a tu BBDD y seleccion de la BBDD en esa función .. no debería estar junto .. sobre todo cuando se supone que no vas hacer esa consulta SQL a tu BBDD en tu aplicación y/o Script .. es probable que hagas más consultas SQL diferentes en un script (tiempo de ejecución) .. así que deberías separa en funciones si quieres la conexión y selección de la BBDD para llamarla UNA VEZ sólo y cuando la necesites . .sobre todo cuando tienes más de una consulta SQL que ejecutar en un script.

En tu ejemplo ..
mysql_data_seek($consulta,0);

No corresponde .. dicha función moverá el puntero al inicio de un resultado .. pero en tu caso llegas con un resultado siempre diferente .. no recorres el mismo resultado una y otra vez (por lo menos no así como lo haces que ejecutas tu consulta SQL siempre en esa función devolviendo un resultado . .aunque envies a ejecutar la misma sentencia SQL).

mysql_data_seek($consulta,0); es útil cuando tu "separas" o desglosas ese tipo de procesos más; una función para conectarse .. otra para ejecutar la consulta .. otra para procesar tu resultado .. en ese caso si observas que una misma consulta SQL (resultado) lo vas a re-usar .. ahí deberías mover el puntero .. pero eso sería si usases las funciones de mysql_xxx() en tu caso creas un array y así trataras un problema de ese estilo (moviendote por -tu- array).


Es decir .. tu código quedaría en funciones tipo:
Código PHP:
$link1=conectarse_BBDD(...);

$resultado1=DBFunction($link1,$consulta);
$resultado2=DBFunction($link1,$otra_consulta); 
Por si tienes que cambiar de BBDD .. uso el "$link" y se lo paso a la función (sería el $db que de "link de conexión" al aplicar mysql_connect() ..).

En ese caso .. las variables: global $numrecords, $numcampos no podrían ser globales (tendrías confusiones si usas llamadas a conexiones diferentes) .. deberían ir en tu arreglo (array) que devuelves.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 12/07/2006, 12:38
 
Fecha de Ingreso: abril-2005
Mensajes: 70
Antigüedad: 12 años, 7 meses
Puntos: 0
una vez mas te doy las 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 06:22.