Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Como utilizar dos consultas en While

Estas en el tema de Como utilizar dos consultas en While en el foro de PHP en Foros del Web. Hola, necesito generar unas graficas en jpgraph mediante un formulario, para eso estoy generando dos consultas, ya que son dos tablas y con una sola ...
  #1 (permalink)  
Antiguo 18/07/2013, 14:08
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Pregunta Como utilizar dos consultas en While

Hola, necesito generar unas graficas en jpgraph mediante un formulario, para eso estoy generando dos consultas, ya que son dos tablas y con una sola consulta, los resultados de la grafica se triplican. Como puedo hacer para que con una consulta sume los valores de la grafica, pero condicionados a la otra consulta.

Este es mi codigo

Código:
$mes1=$_POST["mes1"]; 
$mes2=$_POST["mes2"]; 
$year1=$_POST["year1"];
$year2=$_POST["year2"]; 
$sexo=$_POST["A2"];
$edad1=$_POST["A3a"];
$edad2=$_POST["A3b"];
$comunidad=$_POST["A8"];
$ocupacion=$_POST["A7"];
$estadocivil=$_POST["A4"];
$ayuda=$_POST["A14"];

$result = mysql_query("SELECT * FROM cierre", $bd) or die('ERROR: '.mysql_error());  

$result2 = mysql_query("SELECT * FROM identificacion  WHERE  (A2='$sexo' or '$sexo' = '') AND ((A3 >= '$edad1' and A3 <='$edad2') or '$edad1' = '') AND (A8='$comunidad' or '$comunidad' = '') AND (A7='$ocupacion' or '$ocupacion' = '') AND (A4='$estadocivil' or '$estadocivil' = '') AND (A14='$ayuda' or '$ayuda' = '')", $bd) or die('ERROR: '.mysql_error());

while($row2= mysql_fetch_assoc($result2))
{
while($row= mysql_fetch_assoc($result))
{
if($row['D1']=="1")
{
$B++;
}
if($row['D1']=="2")
{
$C++;
}
if($row['D1']=="3")
{
$D++;
}
if($row['D1']=="4")
{
$E++;
}
if($row['D1']=="5")
{
$F++;
}
if($row['D1']=="6")
{
$G++;
}
if($row['D1']==0)
{
$A++;
}
}
}


$total2=$A+$B+$C+$D+$E+$F+$G;
$a=array('Mucho mejor','Mejor','Ni mejor ni peor','Peor','Mucho peor','No se sugirio','No se especifico');
$ydata = array($B,$C,$D,$E,$F,$G,$A);
$maximo=max(array_values($ydata));
$total3=$maximo;
$graph = new Graph(1024,600, "auto");   
$graph->SetScale("textlin",0,$total3);
 
$graph->img->SetMargin(70, 50, 60, 130);
$graph->SetBackgroundGradient($aFrom='white',$aTo='dodgerblue3',$aGradType=2,$aStyle=BGRAD_MARGIN);
$graph->title->Set("A la pregunta ¿te sientes mejor? Respondió\n");
$graph->title->SetFont(FF_ARIAL,FS_NORMAL,20, "center", "center");
$graph->subtitle->Set("$titulo\n");
$graph->subtitle->SetFont(FF_ARIAL,FS_NORMAL,12, "top", "center");
$graph->xaxis->title->Set("Total $total2 registros\n$fechaA $fechaB hrs.");
$graph->title->SetMargin(10);
$graph->xaxis->SetTitlemargin(80);
$graph->yaxis->title->Set("Total" );
$graph->yaxis->SetTitlemargin(50);
// Setup font for axis
$graph->xaxis->SetFont(FF_ARIAL,FS_NORMAL,10);
$graph->yaxis->SetFont(FF_ARIAL,FS_NORMAL,10);
 
// Show 0 label on Y-axis (default is not to show)
$graph->yscale->ticks->SupressZeroLabel(false);
$graph->xaxis->SetTickLabels($a); 
$graph->xaxis->SetLabelAngle(50);
$barplot =new BarPlot($ydata);
$barplot->SetColor("orange");
$barplot->SetFillColor('dodgerblue4');
$barplot->value->Show();

$graph->Add($barplot);
$graph->Stroke();
Con el codigo asi, me genera la grafica, pero no me condiciona los resultados a la segunda consulta(que son los datos que provienen de un formulario) .

Aca dejo la captura de como tengo mi grafica ahora:



En total en mi base de datos tengo 4 registros, pero solo 3 de sexo femenino, el problema esta en que me muestra todos y no solo los de sexo femenino, que es lo que se pide desde el formulario.

Espero que me haya dado a entender y que me puedan ayudar.

Muchas gracias
  #2 (permalink)  
Antiguo 18/07/2013, 15:52
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Como utilizar dos consultas en While

Holas, janyazul.

En tu consulta, no sé si esto te servirá: si vas a agregar un filtro opcional, que depende de lo que se ingrese en un formulario, la consulta debiera estar así:

Código PHP:
$result2 mysql_query("SELECT * FROM identificacion  WHERE  ".(!empty($sexo) ? "A2='$sexo' AND """)." ((A3 >= '$edad1' and A3 <='$edad2') or '$edad1' = '') AND ........."$bd) or die('ERROR: '.mysql_error()); 
Debiendo repetir la lógica que te puse para el campo A2, en los otros que estás haciendo igual: analiza con mayor profundidad si el OR que usas (y que yo quité) es en verdad tu opción correcta en este caso.

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #3 (permalink)  
Antiguo 12/08/2013, 13:13
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Pregunta Respuesta: Como utilizar dos consultas en While

Cita:
Iniciado por quinqui Ver Mensaje
Holas, janyazul.

En tu consulta, no sé si esto te servirá: si vas a agregar un filtro opcional, que depende de lo que se ingrese en un formulario, la consulta debiera estar así:

Código PHP:
$result2 mysql_query("SELECT * FROM identificacion  WHERE  ".(!empty($sexo) ? "A2='$sexo' AND """)." ((A3 >= '$edad1' and A3 <='$edad2') or '$edad1' = '') AND ........."$bd) or die('ERROR: '.mysql_error()); 
Debiendo repetir la lógica que te puse para el campo A2, en los otros que estás haciendo igual: analiza con mayor profundidad si el OR que usas (y que yo quité) es en verdad tu opción correcta en este caso.

Saludos!
Hola quinqui, muchas gracias por responder, lo hice como dijiste, solamente que cambie las comillas por comillas simples, porque si no me causaba conflicto y quedo asi:

Código PHP:
$result2 mysql_query("SELECT * FROM identificacion  WHERE  '.(!empty($sexo) ? 'A2='$sexo' AND ': '').'((A3 >= '$edad1' and A3 <='$edad2') or '$edad1' = '')' AND (!empty($comunidad) ? 'A8='$comunidad' AND ': '').' AND '.(!empty($ocupacion) ? 'A7='$ocupacion' AND ': '').' AND'.(!empty($estadocivil) ? 'A4='$estadocivil' AND ': '').' AND '.(!empty($ayuda) ? 'A14='$ayuda' AND ': '')"$bd) or die('ERROR: '.mysql_error()); 
Pero me da este error y no se como resolverlo

ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'A2='' AND ': '').'((A3 >= '' and A3 <='') or '' = '')' AND (!empty() ? 'A8='' AN' at line 1

Muchas gracias de nuevo.
  #4 (permalink)  
Antiguo 12/08/2013, 14:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Como utilizar dos consultas en While

Dentro de comillas dobles puedes poner las variables directamente....... todo eso de '. solo genera errores : eso aparece en tu SQL !!

Imprime $sql y veras lo que te digo:

Código PHP:
Ver original
  1. $sql = "SELECT * FROM identificacion  WHERE  '.(!empty($sexo) ? 'A2='$sexo' AND ': '').'((A3 >= '$edad1' and A3 <='$edad2') or '$edad1' = '')' AND (!empty($comunidad) ? 'A8='$comunidad' AND ': '').' AND '.(!empty($ocupacion) ? 'A7='$ocupacion' AND ': '').' AND'.(!empty($estadocivil) ? 'A4='$estadocivil' AND ': '').' AND '.(!empty($ayuda) ? 'A14='$ayuda' AND ': '')";
  2.  
  3. echo $sql;

La idea que te sugieren para incluir opcionalmente campos en el WHERE..... la veo MUY BUENA... pero es mejor implementarla asi:

Código PHP:
Ver original
  1. // verifico si tiene sentido incluir campo....
  2. $sexo = !is_null($sexo) ? "A2='$sexo' AND " : null;
  3.  
  4. //etc


Código PHP:
Ver original
  1. $sql = "SELECT * FROM identificacion  WHERE  $sexo $edad $comunidad $ocupacion ..... etc";
Luego... lo que haces es incluyes $sexo $edad ...etc:
__________________
Salu2!
  #5 (permalink)  
Antiguo 15/08/2013, 09:37
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Como utilizar dos consultas en While

Muchas gracias por la ayuda Italico76, lo hice como me dijiste, pero me da un error.

Código PHP:
$sexo = !is_null($sexo) ? "A2='$sexo' AND " null;
$comunidad = !is_null($comunidad) ? "A8='$comunidad' AND " null;
$ocupacion = !is_null($ocupacion) ? "A7='$ocupacion' AND " null;

$sql ="SELECT * FROM identificacion WHERE $sexo $comunidad $ocupacion";
echo 
$sql
Error:

SELECT * FROM identificacion WHERE A7='' AND ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Perdon tanta molestia, pero esto supera mis pocos conocimientos en PHP. Y de nuevo muchas gracias por la ayuda.
  #6 (permalink)  
Antiguo 15/08/2013, 09:47
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Pregunta Respuesta: Como utilizar dos consultas en While

Ya resolví el problema anterior, solamente tenia que quitarle el AND a la ultima variable.

Ahora el problema que tengo, es que al llenar los campos del formulario, no me hace el filtro, me salen todos los registros de la tabla ¿Como puedo resolver eso?

Código PHP:
while($row3mysql_fetch_assoc($result3))
{
while(
$rowmysql_fetch_assoc($result))
{
if(
$row['D1']=="1")
{
$B++;
}
if(
$row['D1']=="2")
{
$C++;
}
if(
$row['D1']=="3")
{
$D++;
}
if(
$row['D1']=="4")
{
$E++;
}
if(
$row['D1']=="5")
{
$F++;
}
if(
$row['D1']=="6")
{
$G++;
}
if(
$row['D1']==0)
{
$A++;
}
}


Última edición por janyazul; 15/08/2013 a las 10:00
  #7 (permalink)  
Antiguo 15/08/2013, 10:38
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Como utilizar dos consultas en While

HOLA DEBES RESOLVERLO DE LA SIGUIENTE FORMA, PARA TENER MAYOR CERTEZA DE QUE SE ENCONTRARA CORRECTA TU CONSULTA.

Código PHP:
Ver original
  1. $filtros=array();
  2. if(!empty($sexo)){$filtros[]="A2='$sexo' ";}//ingresas tu filtro a un array solo si tiene valor
  3. if(!empty($comunidad)){$filtros[]="A8='$comunidad' ";}//ingresas tu filtro a un array solo si tiene valor
  4. if(!empty($ocupacion)){$filtros[]="A7='$ocupacion' ";}//ingresas tu filtro a un array solo si tiene valor
  5.  
  6. $i=0;
  7. $num=count($filtros);//cuentas cuantos filtros tienes
  8. $and=" AND ";
  9. foreach($filtros as $filtro){//recorres tu array
  10.     $i++;
  11.     $opciones.=$filtro;//cada elemento del array lo colocas como string
  12.     if($i<$num){$opciones.=$and;}//agregas AND cuando tienes + de una condicional pero no en la ultima<--MUY IMPORTANTE
  13. }
  14. $where="";
  15. if(!empty($opciones)){$where=" WHERE ";}//asignas WHERE solo si te han enviado filtros, en caso contrario seleccionaras toda la base
  16.  
  17. $result = mysql_query("SELECT * FROM cierre", $bd) or die('ERROR: '.mysql_error());  
  18. $result2 = mysql_query("SELECT * FROM identificacion  $where  $opciones )", $bd) or die('ERROR: '.mysql_error());
DEBES REVISAR QUE LOS FILTROS TE LLEGUEN CORRECTAMENTE
var_dump($comunidad);//esto te mostrara que tiene la variable.
Si no contiene nada debes revisar el name="xxx" y el value="yyyy" de los campos del formulario.

Saludos

Última edición por Erick_MD9; 15/08/2013 a las 11:03
  #8 (permalink)  
Antiguo 15/08/2013, 11:18
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Como utilizar dos consultas en While

Hola Erick_MD9, ya lo hice como me dices, pero me sigue sin hacer el filtro. Revise como me dijiste que las variables estuvieran llegando correctamente y si lo hacen. Yo creo que mi problema esta en los while que tengo despues, pero no se si esta bien asi como lo tengo o debo ponerlos de otra manera, para que pase por las dos consultas y haga el filtro de la segunda consulta.

Muchas gracias por tu ayuda
  #9 (permalink)  
Antiguo 15/08/2013, 11:34
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Como utilizar dos consultas en While

Hola, no se entiende que intentas hacer con los resultados de las consultas.
Coloca cual es el funcionamiento que pretendes con esos while y la estructura de tus tablas.
Código PHP:
Ver original
  1. while($row2= mysql_fetch_assoc($result2))
  2. {
  3.     while($row= mysql_fetch_assoc($result))
  4.     {
  5.     if($row['D1']=="1"){$B++;}
  6.     if($row['D1']=="2"){$C++;}
  7.     if($row['D1']=="3"){$D++;}
  8.     if($row['D1']=="4"){$E++;}
  9.     if($row['D1']=="5"){$F++;}
  10.     if($row['D1']=="6"){$G++;}
  11.     if($row['D1']==0){$A++;}
  12.     }
  13. }

Saludos
  #10 (permalink)  
Antiguo 15/08/2013, 12:06
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Pregunta Respuesta: Como utilizar dos consultas en While

El resultado de la consultas, se grafica con jpgrapg, en mi formulario seleccionan una "categoria" principal a graficar que en este caso seria el campo D1 de la tabla cierre. Y con el while voy sumando cuantas filas tienen 1, 2, 3, 4, 5, 6 y 0 en el campo D1. Lo que necesito con el otro while es que por ejemplo si en el formulario seleccionan como sexo 'Femenino' y ocupacion 'estudiante', que serian el campo A2 y campo A7 de la tabla identificacion, me grafique solamente a las mujeres estudiantes que respodieron 1, 2, 3, 4, 5, 6 y 0 en el campo D1.

Aca la estructura de mis tablas

Tabla cierre {
id
D1
D2
D3
}

Tabla identificacion
{
id
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
}

Muchas gracias y espero me haya explicado bien
  #11 (permalink)  
Antiguo 15/08/2013, 12:24
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Como utilizar dos consultas en While

Ok, te doy una solucion, de hecho es una mala solucion.

Código PHP:
Ver original
  1. $result2 = mysql_query("SELECT * FROM identificacion  $where  $opciones )", $bd) or die('ERROR: '.mysql_error());
  2. while($row2= mysql_fetch_assoc($result2))
  3. {
  4.     $ID=$row2[id];
  5.     $result = mysql_query("SELECT * FROM cierre where id='$ID'", $bd) or die('ERROR: '.mysql_error());
  6.     while($row= mysql_fetch_assoc($result))
  7.     {
  8.     if($row['D1']=="1"){$B++;}
  9.     if($row['D1']=="2"){$C++;}
  10.     if($row['D1']=="3"){$D++;}
  11.     if($row['D1']=="4"){$E++;}
  12.     if($row['D1']=="5"){$F++;}
  13.     if($row['D1']=="6"){$G++;}
  14.     if($row['D1']==0){$A++;}
  15.     }
  16. }
Lo correcto es hacer la consulta algun JOIN de mysql.
Investiga un poco al respecto.

Saludos.
  #12 (permalink)  
Antiguo 15/08/2013, 12:35
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Como utilizar dos consultas en While

Funciono!!! Muchisimas gracias Erick_MD9, voy a investigar sobre el JOIN.

Muchisimas gracias a todos por la ayuda.

Etiquetas: formulario, mysql, registro, select, tabla
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 20:21.