Foros del Web » Programando para Internet » PHP »

consulta mysql en arreglo!!!

Estas en el tema de consulta mysql en arreglo!!! en el foro de PHP en Foros del Web. Hola A todos!!! este es mi primer mensaje en foros del web y espero aportar. tengo una pregunta que me inquieta en este momento. como ...
  #1 (permalink)  
Antiguo 06/11/2003, 15:32
 
Fecha de Ingreso: noviembre-2003
Ubicación: santiago
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
consulta mysql en arreglo!!!

Hola A todos!!!

este es mi primer mensaje en foros del web y espero aportar.

tengo una pregunta que me inquieta en este momento.

como podría hacer para guardar en un arreglo una consulta completita de mysql.

por ej:

$re = mysql_query("select uno, dos from tabla where dato='dato'");

while ($r = mysql_fetch_array($re)){

aqui tendría que guardarlo como un arreglo...

}

saludos!!!
  #2 (permalink)  
Antiguo 06/11/2003, 15:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm bueno, tu $r (aplicando mysql_fetch_array() ..) ya es un array .. sólo que es bidimensional .. puedes comprobarlo con:

Código PHP:
print_r($r
Así podrás ver la estructura del array generado ..

La pregunta sería .. ¿para que los quieres en un array? ..

Si es por repetir ese bucle para obtener tus registros (arrojados por esa consulta) en otra párte de tu código .. para eso hay solución (mysql_data_seek() .. para mover el puntero de tu consulta al principio ...)

Si los quieres propagar a otra página (tu array) .. te hace falta serializarlos (con serialize() y unserialize() posteriormente ..).

Explicanos que tienes que hacer .. tal vez existan otras alternativas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 06/11/2003, 16:25
 
Fecha de Ingreso: noviembre-2003
Ubicación: santiago
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
La pregunta sería .. ¿para que los quieres en un array? ..

bueno tengo 350 registros y tengo que compararlos con otra tabla uno por uno para ver a que registro le tengo que hacer un update.


entonces no quiero hacer (y por que no debo) 350 consultas para ir comparando con la otra tabla.

entonces mi idea es hacer solo una consulta que me devuelva todos los registros altiro y despues en vez de hacer consultas los busco en el arreglo.



Si es por repetir ese bucle para obtener tus registros (arrojados por esa consulta) en otra párte de tu código .. para eso hay solución (mysql_data_seek() .. para mover el puntero de tu consulta al principio ...)

esto no me serviria. /* Si los quieres propagar a otra página (tu array) .. te hace falta serializarlos (con serialize() y unserialize() posteriormente ..). */

Gracias por tu ayuda.!!!
  #4 (permalink)  
Antiguo 06/11/2003, 16:30
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
bueno esto ya es de base de datos, pero por que no hacer un join entre ambas tablas y asi obtener los registros a actualizar en un sólo paso.
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #5 (permalink)  
Antiguo 06/11/2003, 16:32
 
Fecha de Ingreso: noviembre-2003
Ubicación: santiago
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
depende de muchas condiciones!!!!

gracias por tu ayuda!!!
  #6 (permalink)  
Antiguo 06/11/2003, 16:47
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
bueno, con mysql_num_rows($re) (n° filas) y mysql_num_fields($re) (n° de campos) ya puedes dimensionar un arreglo, luego podrias usar 2 for anidados y sacar los valores con mysql_result($re,$i,$j) e irlos guardando en un arreglo asi:

$arreglo[$i][$j]=mysql_result($re,$i,$j);

pero, como decia cluster, $r ya es un arreglo.
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #7 (permalink)  
Antiguo 06/11/2003, 17:05
 
Fecha de Ingreso: noviembre-2003
Ubicación: santiago
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
ahhh!!!!!!

solido... hay les cuento como me va!!!!
  #8 (permalink)  
Antiguo 06/11/2003, 17:26
 
Fecha de Ingreso: noviembre-2003
Ubicación: santiago
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
EL PROBLEMA EN SI ES EL SIGUIENTE

$consulta = mysql_query("select + algo xxxxx")
$respuesta = fetch_array($consulta)

ahora necesito hacer buscar un valor en $repuesta
si esto fuera un array podria hacerlo con array_search("hola",$respuesta)
esto me devolveria el puntero de donde esta el registro encontrado

for($i;$i<=20;$i++){
// aqui podria hacer la busque en el arreglo sin necesidad de hacer multiples consultas por cada vuelta que se de el for
}
  #9 (permalink)  
Antiguo 06/11/2003, 18:22
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
La verdad es que no me queda muy claro para qué lo necesitas en un array. Pero si te entendí bien la otra parte sería así:
-Haces una consulta a la BD así:
select uno, dos from tabla where dato='dato'
y obtienes el contenido de los campos "uno" y "dos" de todos los registros que coincidan en el campo "dato" con el dato que ingresas.

-Si lo que quieres es guardar todos estos resultados en un array (eso es lo que no entiendo para qué)... puedes utilizar el array que se genera con mysql_fetch_array()...

Bueno, te pongo un ejemplo de lo que entendí que quieres hacer:
Código PHP:
<?php 
$sql
="SELECT uno,dos FROM tabla WHERE dato='dato'";
$result=mysql_query($sql);
$i=0;
while(
$row=mysql_fetch_array($result)){
    
$miArray[$i]['uno']=$row['uno'];
    
$miArray[$i]['dos']=$row['dos'];
    
$i++
}
?>
Esto guardará el resultado de tu consulta en un array bidimensional (en realidad basta con utilizar el $row), donde 'uno' y 'dos' son los campos que pediste como resultado en la consulta.
Espero que te sirva esta explicación.

Saludos

Última edición por jpinedo; 06/11/2003 a las 20:40
  #10 (permalink)  
Antiguo 06/11/2003, 19:30
 
Fecha de Ingreso: octubre-2003
Mensajes: 139
Antigüedad: 14 años, 2 meses
Puntos: 0
para jpinedo...

Código PHP:
<?php 
$sql
="SELECT uno,dos FROM tabla WHERE dato='dato'";
$result=mysql_query($sql);
i=0;
while(
$row=mysql_fetch_array($result)){
    
$miArray[i]['uno']=$row['uno'];
    
$miArray[i]['dos']=$row['dos'];
    
i++
}
?>
querdaria mejor asi... (pq no le pones el $ al a i?)

Código PHP:
<?php 
$sql
="SELECT uno,dos FROM tabla WHERE dato='dato'";
$result=mysql_query($sql);
for (
$i 0$row=mysql_fetch_array($result); $i++){ //si no son puntos y comas entonces son comas :P
    
$miArray[$i]['uno']=$row['uno'];
    
$miArray[$i]['dos']=$row['dos'];
}
?>
  #11 (permalink)  
Antiguo 06/11/2003, 21:28
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
ja, ja, ja xD...! qué gran descuido... gracias cards... no puedo creer que haya olvidado poner el "$"... de todas maneras ya lo edité en el mensaje original....

Saludos
  #12 (permalink)  
Antiguo 06/11/2003, 21:34
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Y lo del bucle "for" no creo que funcione así... porque necesitas saber "a priori" cuántas iteraciones vas a hacer. Sería más bien utilizando mysql_num_rows($result), pero no hace falta... eso se soluciona con el "while" que puse antes.

El "while" dice: mientras hayan registros, se ejecuta el bucle... o sea que no habrá problema.

Repito que no le veo utilidad al script, pero creo que eso es lo que quería saber jsalas.

Saludos

Última edición por jpinedo; 06/11/2003 a las 21:38
  #13 (permalink)  
Antiguo 07/11/2003, 06:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
jsalas ... Lo ideal es que uses SQL (Join o lo que corresponda) .. Mysql (como toda BD) tiene la virtud de poder hacer consultas "condicionales" a varias tablas simultáneamente usando sintax tipo:

SELECT tabla1.campo1,tabla2.campo2 FROM tabla1,tabla2 WHERE tabla1.campo1='algo' AND tabla1.campo2=tabla1.campo3

Así vas formando tu condicional (y mejor si usas JOIN .. LEFT JOIN etc de SQL de Mysql...)

Ese proceso será MUCHOOO! más optimo que meter procesos "PHP" por médio.

Te recomendaría (ya que aquí en el foro PHP has visto algunas soluciones "PHP") que pusieras la estructuras de esas dos tablas q tienes que comparar ciertos campos y entregar otro resultado. Pero, en el foro de Base de datos .. a ver si por ahí te orientan mejor sobre el "JOIN" más adecuado.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #14 (permalink)  
Antiguo 07/11/2003, 07:24
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
igual creo yo que siempre sera mas rapido darle el trabajo al motor de base de datos, que hacerlo uno mismo en php, no en vano han invertido mucho tiempo en optimizar todo esto, y mysql tiene su fama de rapidez (la mas rapida dicen).
respecto de lo del bucle for, si funciona, lo he usado muchas veces, sin fallas, en aquellos casos en que no conozco la estructura de la tabla "a priori", es decir, cuando no se de antemano como se llaman los campos, ni cuantos registros tiene (lo encontraran raro pero a veces tienes una tabla que lo crea otro programa de forma dinamica y debes tomarla como esta, en tiempo de ejecucion y mostrar el resultado, nada mas), y para eso php proporciona las funciones, para saber cuantos registros hay mysql_num_rows(), para saber cuantos campos tiene la tabla mysql_num_fields(), para saber el nombre de los campos mysql_field_name(), para saber el tipo de dato del campo, etc.
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #15 (permalink)  
Antiguo 07/11/2003, 07:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm .. Pero Mysql también tiene funciones para obtener (vía SQL) los nombres de una tabla .. o de sus campos .. (si no me equivoco).

El caso es .. que en el ejemplo de no conocer esos nombres de tus tablas .. campos .. etc. Usa PHP para generar dinámicamente el "SQL" que necesites (con los nombres de las tablas y campos donde correspondan) .. a modo de generar ese "sting" que en definitiva es tu sentencia SQL o sentencias SQL que necesites .. Y de ahí, las ejecutas pero que ese proceso lo haga tu motor de BD ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #16 (permalink)  
Antiguo 07/11/2003, 08:16
 
Fecha de Ingreso: noviembre-2003
Ubicación: santiago
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
mmmm..... todas las respuestas me parecen atinadas, pero tengo otra consulta sobre el tema.
ej:

$re = mysql_query("SELECT uno,dos FROM tabla WHERE dato='dato'");

$row = mysql_fetch_array($re);

supongamos que me guarde unos 10 registros....

puedo hacer algo asi.

/* no me acuerdo bien de la sintaxis*/

$a = array_search("loquequierobuscar", $row);

y asi tengo los valores de los valores de la consulta.

no se si se puede pero en si la idea es no hacer un while de los datos......

según lo que tengo entendido el mysql_fetch_array(); te devuelve solo 1 fila o no?

bueno yo quiero todas las filas con sus datos en un arreglo sin tener que hacer el while, for o lo que sea.

se puede???

gracias por su ayuda y servicio.
me habia metido a otros foros, pero no eran tan buenos...

atte
jsalas.
  #17 (permalink)  
Antiguo 07/11/2003, 08:18
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
si por supuesto que las tiene, el comando DESCRIBE por ejemplo, pero no me referia a eso, sino al hecho de que desde php se puede saber todo acerca de una tabla y por tanto dimensionar correctamente un arreglo y presentarlo en una tabla html como a uno se le de la gana; es decir, solo queria indicar que es posible y funciona, nada mas.
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #18 (permalink)  
Antiguo 07/11/2003, 08:29
 
Fecha de Ingreso: noviembre-2003
Ubicación: santiago
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
La idea es tener todos los registros sin tener que hacer un while!!!!

Saludos
  #19 (permalink)  
Antiguo 07/11/2003, 10:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. vamos a ver ...

¿Que es lo que quieres hacer exactamente?. Explica que tablas tienes, que campos tienen y que datos tienen .. y bueno, que es lo que necesitas de esa tabla(s) bajo que condiciones ...

Por que ese ejemplo que pusistes con:

Cita:
$re = mysql_query("SELECT uno,dos FROM tabla WHERE dato='dato'");

$row = mysql_fetch_array($re);

supongamos que me guarde unos 10 registros....

puedo hacer algo asi.

/* no me acuerdo bien de la sintaxis*/

$a = array_search("loquequierobuscar", $row);
No tiene sentido .. si lo HACES en la consulta SQL directamente:

Código PHP:
$re mysql_query("SELECT uno,dos FROM tabla WHERE dato='$loquequierobuscar_en_el_campo_dato'");
$a=mysql_result($re,0,"dato"); 
(eso suponiendo que esa consulta sólo sea posible que arroje UN sólo registro y accediendo directamente al campo "dato". Si esa consulta es suceptible de arrojar más registros debes usar un bucle).

Y si tienes X campos en tu tabla (uno, dos, etc) y quieres que uno=$algo y dos=$otra_cosa .. pues usas AND .. OR o los operadores lógicos que quieras en tu sentencia SQL.

Si esa consulta (bajo esos condicionales WHERE) puede arrojar más de un resultado (se encontraron + de un registro) DEBES hacer un bucle (While o como quieras) par -VER- esos X resultados que te pueda haber arrojado tu consulta ..

Creo que tanto liooo que te estás armando pasa por concer algo más de SQL y como trabajan las Base de datos en general y su lenguaje de consultas .. Sino, no tendría ranzón de existir el "SQL" (un lenguaje completo) .. Todos usarimos sólo SELECT * FROM tabla y listo .. ya lo trabajaríamos con PHP o lo que toque .. Pero, Resulta que para eso se usa MAS SQL .. para que hagas la selección de los datos que te interesan de tu tabla(s) bajo los criterios (condicionales) que necesites ..

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; 07/11/2003 a las 10:14
  #20 (permalink)  
Antiguo 07/11/2003, 23:40
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
jsalas... yo creo que Cluster tiene razón... como te dije antes: no le veo sentido a lo que quieres hacer.

Ahora... te recomiendo que pruebes las soluciones que te dimos antes de preguntar... por ejemplo lo de mysql_fetch_array($re) y si recoge uno o todos los registros... para eso, en el ejemplo que te puse puedes ver que está así:
while($row=mysql_fetch_array($re)){
Este bucle se repite "mientras" hayan registros y en cada "pasada" recoge un registro. Pero da varias pasadas hasta que ya no hayan más registros...
}

Pero mejor hazle caso a Cluster y consulta directamente a la BD.

Saludos
  #21 (permalink)  
Antiguo 07/11/2003, 23:45
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Ah, cards... sobre el bucle for... la verdad no lo he probado así... pero creo que deberías utilizar algo como:

$num=mysql_num_rows($re);

for ($i = 0; $i<$num; $i++){
$row=mysql_fetch_array($re);
$miArray[$i]['uno']=$row['uno'];
$miArray[$i]['dos']=$row['dos'];
}

Te repito que no probé directamente como tú lo pusiste porque no tengo php ahora... pero lo pruebo y te aviso...

Saludos
  #22 (permalink)  
Antiguo 08/11/2003, 16:19
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Pues cards... efectivamente el for funciona como tú bien lo indicas.
Estuve revisando el manual. también hice algunas pruebas y lo verifiqué... este es el link al manual (en español):

http://www.php.net/manual/es/control-structures.for.php

Y hasta me ha gustado la idea de utilizar el for en lugar del while que siempre usa casi todo el mundo... muchas gracias por enseñarme algo nuevo.

Saludos
  #23 (permalink)  
Antiguo 08/11/2003, 22:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
jpinedo ..

El problema de usar el "for" es que antes debes de contar el total de registros que pueda arrojar esa consulta ..

En tu caso lo haces con mysql_num_rows() .. Eso implica muchooo tiempo para Mysql+PHP por qué esa función realiza la consulta completa .. y cuenta los registros que puedan resultar.

Si quieres usar el "for" .. te recomendaría que para contar el total de registros en lugar de mysql_num_rows() usases SQL .. concretamente: SELECT COUNT(*) FROM tabla ... etc ... Esto te arrojará un sólo registro/campo con el total de registros que cumplan tu condición (si usas WHERE o no ...). Ese proceso es realizado -integramente- por Mysql . y los resultados son bastante mejores (en rendimiento) que usar mysql_num_row() y más cuando luego igualmente vas hacer un mysql_fetch_array() que lo que hace es realizar la misma consulta .. y a base de ejecutar nuevamente mysql_fetch_array() vas avanzando el puntero interno de la consulta un registro más hasta que finalice ..

Por eso, todo el mundo usa el "while" .. por qué mysql_fetch_xxx() (xxx es .. cualquiera .. array, assoc, object ..) a cada petición que hagas (lo ejecutes) obtiene el "record set" en curso ..y mueve el puntero una posición hacia adelante en la consulta obtenida por tu mysql_query() .. al llegar al último registro, devuelve "FALSE". Con lo cual .. te estás ahorrando el proceso de "contar" (sea por uno (php función mysql_num_rows()) o por otro método (SQL con COUNT() ..) el total de registros que pueda arrojar tu consulta para usarlo en tu "for" ..

Puedes hacer tu mismo algunos "test" .. Usa una estructura tipo "for" (usando para calcular el total de registros mysql_num_rows() y SQL COUNT() ..) y una tipo "while" clásico. Mide el tiempo de ejecución (con microtime() ) .. y saca tus conclusiones.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #24 (permalink)  
Antiguo 08/11/2003, 23:24
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Cluster... yo pensaba igual que tú. Pero cards me hizo ver algo que yo no sabía respecto al bucle for. Luego revisé el manual y lo confirmé.
Te invito a que veas en el manual y veas que no es necesario el mysql_num_rows(). O sea que no es necesario conocer de "antemano" el número de iteraciones que se ejecutarán.. simplemente quedaría así por ejemplo:
Código PHP:
$sql="SELECT * FROM tabla WHERE dato='dato'";
$result=mysql_query($sql);
//Acá normalmente hemos venido utilizando el while.
//Ahora en su lugar utilizamos el for
//Pues en cada iteración se evalúa el segundo parámetro del for.
//Si es TRUE, entonces se ejecuta otra iteración.(Igual que en el while).
// entonces basta con esto:

for ($i 0$row=mysql_fetch_array($result); $i++){
    echo 
$row['id'];
}
//Entonces en una sola consulta obtenemos los registros
// y en $i estará el total de registros sin mysql_num_rows()... 
Bueno... no sé si será óptimo, pero es una alternativa.

Saludos
  #25 (permalink)  
Antiguo 08/11/2003, 23:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ahh .. sip.. así si. .. No me fijé en el código que puso unos mensajes arriba cards y sólo me fijé en el tuyo (jpnedo) que usabas el mysql_num_rows() .. por eso hice el comentario.

Yo de todas formas prefiero el "while" .. como que se vé el código más "limpio" .. De todas formas hay que entender lo que hace una llamada a mysql_fetch_xxx() .. que eso es lo que más cuesta en principio .. Por ejemplo gente que viene de ASP empieza a preguntar "como muevo el puntero" .. siendo que esa función de PHP ya lo hace automáticamente cada vez que se la llama (y si quieres moverlo a otro sitio ya tenemos el mysql_data_seek() ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 11:44.