Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Crear filtro en la misma página

Estas en el tema de Crear filtro en la misma página en el foro de PHP en Foros del Web. Hola a todos, tengo una página donde se muestran un conjunto de titulares en función del filtro que aplique el usuario. He creado un formulario ...
  #1 (permalink)  
Antiguo 15/11/2014, 06:10
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Pregunta Crear filtro en la misma página

Hola a todos,

tengo una página donde se muestran un conjunto de titulares en función del filtro que aplique el usuario.

He creado un formulario en el body de la página:

<form action="mas_noticias.php" enctype="multipart/form-data">

<b>Sección</b>: <select name="secc">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select><br>

<input id="botonInput" type="text" value="Aplicar filtro"></input>
</form>

No se si esta bien, creo que no, pero nose el type del input si lo quiero aplicar a la misma página...
Por otra parte esta es la consulta que compararia e imprimiría en función del filtro aplicado

<table style="background: #C5C5C5; width:664px; height:669px; margin-left:38px; margin-top:30px; border:black 1px solid; float:left;">
<tr style="height:10px;">
</tr>
<tr>
<tr style= "margin-top:20px;">
<?php
$consulta = "SELECT *
FROM Articles
WHERE seccion='$_GET['secc']';
AND estado_noticia = 'Publicado'
ORDER BY fecha desc
LIMIT 6";
$result = mysql_query($consulta,$con);
while($row = mysql_fetch_array($result)){
$variable = explode ('/',$row['fecha']);
echo "<tr style='margin-top:-30px;'> ";
$foto = $row['timestamp']."_".$row['imagen1'];
echo "<td><font color='black'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><img style='width:50px; height:32px; margin-left:10px;border:black 1px solid;margin-top:-55px;' src='ImagenesNoticias/".$foto."'/></a> </font></td>";
echo "<td><font color='black'><p style='margin-letf:-90px;margin-top:-50px;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[2]/</i></p></a> </font></td>";
echo "<td><font color='black'><p style='margin-letf:-100px;margin-top:-50px; float:left;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[1]/</i></p></a> </font></td>";
echo "<td><font color='black'><p style='margin-letf:-150px;margin-top:-50px;float:left;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[0]</i></p></a> </font></td>";
echo "<td><font color='black'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><p style= 'width:280px; margin-top:0px;margin-top:-50px;'><b>".$row['titulo']."</p></b>";
echo "</a> </font></td></tr>";
}
?>
</tr>
</tr>
</table>

Aquí el fallo está en el GET seguramente, pero nose como hacer para que me guarde el filtro que ha marcado el usuario y me lo compare en el where.

Mi duda es como puedo guardar el valor del filtro en una variable para luego compararla con lo que tengo en la BD y así imprimir solo aquello que cumpla el filtro?

Seguramente sea una tonteria... pero estoy aprendiendo programación web, vengo del mundo del c/c++

Muchas gracias :)

Última edición por maiksix; 15/11/2014 a las 06:15
  #2 (permalink)  
Antiguo 15/11/2014, 07:40
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Crear filtro en la misma página

hola maiksix fijate asi

Código:
<form action="mas_noticias.php" type="get">

<b>Sección</b>: <select name="secc">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select><br>

<input id="botonInput" type="submit" value="Aplicar filtro"></input>
</form>
Código:
$consulta = "SELECT * FROM Articles
WHERE seccion=".$_GET['secc']." AND estado_noticia = 'Publicado' ORDER BY fecha desc
LIMIT 6";
$result = mysql_query($consulta,$con);

espero que sirva, saludos
  #3 (permalink)  
Antiguo 15/11/2014, 11:04
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Crear filtro en la misma página

Hola robertopejenaute,

muchas gracias por tu ayuda, ahora ya coge bien el parámetro, pero no parece que lo compare bien:

Código:
      $consulta = "SELECT *
	FROM Articles
	WHERE seccion=".$_GET['secc']."
	AND estado_noticia = 'Publicado'
	ORDER BY fecha desc";
	$result = mysql_query($consulta,$con);
He probado cambiando esto: ".$_GET['secc']." por esto '3' (el cual es uno de los valores que guardo en el form) y lo imprime perfectamente.

Alguna sugerencia de lo que puede ser?

Muchas gracias.
__________________
Going hard for too long... Can't get enough
  #4 (permalink)  
Antiguo 15/11/2014, 11:33
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Crear filtro en la misma página

Hola maiksix,

Haz un echo de tu consulta para ver como construyes tu consulta :

y prueba de insertar el texto tal cual en algún gestor de sql phpmyadmin por ejemplo y veras el error con mas detalle :

Código PHP:
Ver original
  1. $consulta = "SELECT * FROM Articles
  2. WHERE seccion=".$_GET['secc']." AND estado_noticia = 'Publicado' ORDER BY fecha desc
  3. LIMIT 6";
  4. echo $consulta."<br>";
  5. $result = mysql_query($consulta,$con);

Pueden ser varias cosas puede que tengas que hacer un trim (quitar los espacios en blanco) o hasta puede que sea el tipo de dato , alhomejor estas pasando el dato a mysql como string y en tu bd esta como integer...

Por cierto ya que empiezas no deberías usar la ext mysql pues se considera obsoleta , en su lugar deberías usar mysqli :
http://php.net/manual/es/mysqli.quic...-interface.php
Un saludo!
  #5 (permalink)  
Antiguo 15/11/2014, 11:59
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Crear filtro en la misma página

Hola Djoaq,

realmente el código entero es este:
Código:
 
<table style="background: #C5C5C5; width:664px; height:669px; margin-left:38px; margin-top:30px; border:black 1px solid; float:left;">
						<tr style="height:10px;">
                                                </tr>
                                                <tr>
                                                <tr style= "margin-top:20px;">
						<?php
						$consulta = "SELECT *
						FROM Articles
						WHERE seccion=".$_GET['secc']."
						AND estado_noticia = 'Publicado'
						ORDER BY fecha desc";
                                                echo $consulta."<br>";
						$result = mysql_query($consulta,$con);
						while($row = mysql_fetch_array($result)){
                                                $variable = explode ('/',$row['fecha']);
                                                echo "<tr style='margin-top:-30px;'> ";
						$foto = $row['timestamp']."_".$row['imagen1'];
						echo "<td><font color='black'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><img style='width:50px; height:32px; margin-left:10px;border:black 1px solid;margin-top:-55px;' src='ImagenesNoticias/".$foto."'/></a> </font></td>";
						echo "<td><font color='black'><p style='margin-letf:-90px;margin-top:-50px;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[2]/</i></p></a> </font></td>";
						echo "<td><font color='black'><p style='margin-letf:-100px;margin-top:-50px; float:left;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[1]/</i></p></a> </font></td>";
						echo "<td><font color='black'><p style='margin-letf:-150px;margin-top:-50px;float:left;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[0]</i></p></a> </font></td>";
                                                echo "<td><font color='black'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><p style= 'width:280px; margin-top:0px;margin-top:-50px;'><b>".$row['titulo']."</p></b>";
						echo "</a> </font></td></tr>";
						}
						?>
						</tr>
                                                </tr>
					</table>
Tengo un par de dudas de tu comentario:

¿Que gano al hacer un echo $consulta."<br>";? Simplemente veo que en la pagina me sale el codigo que esta despues de $consulta=

El tipo de dato que se guarda en "seccion" en la BD es varchar, no debería ser eso no? Ya que se pasa correctamente en el formulario, cierto?

A que te refieres con: prueba de insertar el texto tal cual en algún gestor de sql phpmyadmin por ejemplo y veras el error con mas detalle.
Quieres decir que haga un insert en vez de un select, para ver si se guarda adecuadamente?

Tomo nota de la ext, me lo miro y lo aplicare.

Muchas gracias
__________________
Going hard for too long... Can't get enough
  #6 (permalink)  
Antiguo 15/11/2014, 12:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear filtro en la misma página

Cita:
¿Que gano al hacer un echo $consulta."<br>";? Simplemente veo que en la pagina me sale el codigo que esta despues de $consulta=
Lo que "ganas" es asegurarte que una vez incorporado el parámetro, la sintaxis de la consulta en SQL esté correcta, y no vaya a darte problemas...
Es una etapa básica (MUY básica) del trabajo de desarrollo. Se denomina "debuggear".
Cita:
El tipo de dato que se guarda en "seccion" en la BD es varchar, no debería ser eso no? Ya que se pasa correctamente en el formulario, cierto?
No te olvides que PHP y MySQL son cosas completamente independientes. Que una variable en PHP la variable sea un string, no implica que MySQl entienda que es un VARCHAR, porque MySQL no lee, interpreta ni recibe variables de PHP. Sólo recibe sentencias SQL en forma de cadena de texto, y las ejecuta en función de eso.

Para tu caso específico, supongamos que "$_GET['secc']" contiene la palabra "1". Cuando pones esto:
Código PHP:
Ver original
  1. $consulta = "SELECT *
  2. FROM Articles
  3. WHERE seccion=".$_GET['secc']."
  4. AND estado_noticia = 'Publicado'
  5. ORDER BY fecha desc";
lo que recibe MySQL es esto:
Código SQL:
Ver original
  1. SELECT *
  2. FROM Articles
  3. WHERE seccion=1
  4. AND estado_noticia = 'Publicado'
  5. ORDER BY fecha DESC
Si eso es lo que muestra el echo, todo OK, en tanto recuerdes que sólo devolverá datos si seccion=1 y estado_noticia = 'Publicado', al mismo tiempo.
Pero lo que suele pasar muchas veces es que la variable en algun momento está vacía, y en ese caso lo que recibirá MySQL es esto:
Código SQL:
Ver original
  1. SELECT *
  2. FROM Articles
  3. WHERE seccion=
  4. AND estado_noticia = 'Publicado'
  5. ORDER BY fecha DESC
Nota, por favor, que según tu sintaxis aportada la variable debe contener un valor numérico si o si, ya que la estás tratando en el SQL como tal. Si fuese una cadena de texto... te disparará un error de columna desconocida.

Si pasa eso, lo que tendrás es un error de sintaxis... en MySQL.

El problema mas evidente es que al hacer un código de tres lenguajes diferentes indiferenciados en el mismo script, siendo que no estás controlando posibles errores de entrada o salida, el script resulta de muy difícil depuración.
Yo te sugeriría que separes mejor la vista, del PHP, y del manejo de los datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 15/11/2014 a las 17:47
  #7 (permalink)  
Antiguo 15/11/2014, 12:55
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Crear filtro en la misma página

Cita:
Iniciado por maiksix Ver Mensaje
El tipo de dato que se guarda en "seccion" en la BD es varchar, no debería ser eso no?
Muchas gracias
Hola por lo que estoy viendo ese es justo el problema ...

Cuando me refiero a que insertes el texto , me refiero a que copies y peges la consulta en algun gestor de sql , ( a mi me ayuda a depurar..) ..

Mira si imprimes tu query :

Código MySQL:
Ver original
  1. SELECT * FROM Articles WHERE seccion=3 AND estado_noticia = 'Publicado' ORDER BY fecha desc

Este es el resultado , si te fijas el 3 va a pelo sin comillas entonces mysql lo interpreta como numero en vez de string y por eso no te devuelve resultado correcto.

tienes que añadir una comilla encerrando la variable get es decir así :

Código PHP:
Ver original
  1. $consulta = "SELECT *
  2.                         FROM Articles
  3.                         WHERE seccion='".$_GET['secc']."'
  4.                         AND estado_noticia = 'Publicado'
  5.                         ORDER BY fecha desc";
para que la consulta sea :

Código MySQL:
Ver original
  1. SELECT * FROM Articles WHERE seccion='3' AND estado_noticia = 'Publicado' ORDER BY fecha desc
Fijate que ahora el 3 esta encerrado por comillas y mysql lo detecta como string en vez de int.

Por otro lado te dejo un mínimo ejemplo de mysqli .. (muy básico)

Código HTML:
Ver original
  1. <form action="mas_noticias.php" type="get">
  2.  
  3. <b>Sección</b>: <select name="secc">
  4. <option value="1">1</option>
  5. <option value="2">2</option>
  6. <option value="3">3</option>
  7. <option value="4">4</option>
  8.  
  9. <input id="botonInput" type="submit" value="Aplicar filtro"></input>
  10. </form>
  11. <table style="background: #C5C5C5; width:664px; height:669px; margin-left:38px; margin-top:30px; border:black 1px solid; float:left;">
  12.                         <tr style="height:10px;">
  13.                                                 </tr>
  14.                                                 <tr>
  15.                                                 <tr style= "margin-top:20px;">
Código PHP:
Ver original
  1. <?php
  2.                         ##primero comprobamos que exista la peticion
  3.                         if (isset($_GET['secc'])) {
  4.                             ##minimamente limpiamos peticion para evitar inyec. sql
  5.                             $valor = htmlentities($_GET['secc']);
  6.                             $con = mysqli_connect("host","user","contra","bd") or die("Error " . mysqli_error($con));
  7.                             $consulta = "SELECT *
  8.                             FROM Articles
  9.                             WHERE seccion='".$valor."'
  10.                             AND estado_noticia = 'Publicado'
  11.                             ORDER BY fecha desc";
  12.                             $result = mysqli_query($con,$consulta);
  13.                             while($row = mysqli_fetch_array($result)){
  14.                                                     $variable = explode ('/',$row['fecha']);
  15.                                                     echo "<tr style='margin-top:-30px;'> ";
  16.                             $foto = $row['timestamp']."_".$row['imagen1'];
  17.                             echo "<td><font color='black'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><img style='width:50px; height:32px; margin-left:10px;border:black 1px solid;margin-top:-55px;' src='ImagenesNoticias/".$foto."'/></a> </font></td>";
  18.                             echo "<td><font color='black'><p style='margin-letf:-90px;margin-top:-50px;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[2]/</i></p></a> </font></td>";
  19.                             echo "<td><font color='black'><p style='margin-letf:-100px;margin-top:-50px; float:left;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[1]/</i></p></a> </font></td>";
  20.                             echo "<td><font color='black'><p style='margin-letf:-150px;margin-top:-50px;float:left;'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><i>$variable[0]</i></p></a> </font></td>";
  21.                                                     echo "<td><font color='black'><a style='text-decoration:none;' href='noticias?idNoticia=".$row['id']."'><p style= 'width:280px; margin-top:0px;margin-top:-50px;'><b>".$row['titulo']."</p></b>";
  22.                             echo "</a> </font></td></tr>";
  23.                             }
  24.                         }
  25.  
  26.                        
  27.                         ?>
Código HTML:
Ver original
  1. </tr>
  2.                                                 </tr>
  3.                     </table>

Saludos Vecino! :D
  #8 (permalink)  
Antiguo 15/11/2014, 18:08
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Crear filtro en la misma página

Muchísimas gracias a ambos por vuestras perfectas explicaciones.

Me ha quedado todo clarísimo, además ya está solucionado :D

He podido avanzar muchos gracias a vuestra ayuda.

¡Un saludo compañeros!
__________________
Going hard for too long... Can't get enough

Etiquetas: filtros, form, sql
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 19:34.