Foros del Web » Programando para Internet » PHP »

Formulario para filtrar resultados

Estas en el tema de Formulario para filtrar resultados en el foro de PHP en Foros del Web. Estoy montando una web con PHP y MySQL, en la que en cierto documento se extrae información que cumple ciertos criterios de la base de ...
  #1 (permalink)  
Antiguo 12/10/2006, 17:58
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Pregunta Formulario para filtrar resultados

Estoy montando una web con PHP y MySQL, en la que en cierto documento se extrae información que cumple ciertos criterios de la base de datos, y se muestran en el documento. Para simplificar pongamos como ejemplo que se trata de una base de datos de libros, en la que tenemos los siguientes datos en una tabla:

id
autor
título
género
año
editorial
páginas
disponible (1 si está disponible, 0 si no está disponible)

La web se divide en distintas secciones dependiendo del género, así que empezamos por declarar una variable que pasaremos a través de la URL al seleccionar la sección:

Código PHP:
$genero $HTTP_GET_VARS["gen"]; 
Y quiero que el usuario pueda ordenar los libros según el criterio que le parezca oportuno, así que declaro otra variable para la URL:

Código PHP:
$orden $HTTP_GET_VARS["ord"]; 
Extraigo los datos de la siguiente manera, seleccionando únicamente los libros que estén disponibles y que correspondan al género adecuado:

Código PHP:
$consulta "select * from tabla WHERE (disponible='1' AND genero='$genero') order by '$orden' asc" 
Permitiré elegir el orden plantando los siguientes enlaces:

Código PHP:
echo "<td><a href=\"?gen=$genero&ord=autor\"></td>
    <td><a href=\"?gen=$genero&ord=título\"></td>
    <td><a href=\"?gen=$genero&ord=año\"></td>
    <td><a href=\"?gen=$genero&ord=editorial\"></td>
    <td><a href=\"?gen=$genero&ord=páginas\"></td>"

Y ahora muestro los datos extraídos en una tabla:

Código PHP:
echo "<td>$consulta[id]</td>
<td>$consulta[autor]</td>
<td>$consulta[título]</td>
<td>$consulta[género]</td>
<td>$consulta[año]</td>
<td>$consulta[editorial]</td>
<td>$consulta[páginas]</td>"
;
$i++; 
Llegar hasta aquí me ha costado bastante trabajo, ya que no domino el tema. Además podréis comprobar que he omitido parte del código para no tener que explicar lo que hace, ya que no estoy muy seguro de su función (como lo de mysql_query).

Pero ahora quiero no sólo poder ordenar los resultados según el criterio que me apetezca, sino además poder filtrarlos, sacando de la lista los resultados que no me gusten.

Es decir, que en el documento el usuario disponga de unos formularios donde seleccionar el autor, de manera que se muestren sólo los resultados que coincidan con el mismo. O quizás no sabe el autor, pero sí el año en el que se editó el libro. O quiere saber qué libros publicó cierta editorial en un año en concreto.

En resumen, quiero que el usuario pueda elegir qué filtros aplicar a los resultados. Y no se me ocurre cómo hacerlo, ni encuentro información al respecto en Google (seguramente estoy eligiendo mal los términos de búsqueda). Se me ocurre que podría declarar más variables mediante http_get_vars, y luego en la consulta SQL meter más condiciones con variables en "where...", pero eso me plantea un problema, y es que me obliga a especificar todos los filtros, ya que de lo contrario no obtengo ningún resultado. Es decir, si le meto a la consulta una nueva condición con variable de la siguiente manera:

Código PHP:
$consulta "select * from tabla WHERE (disponible='1' AND genero='$genero' AND año='$año') order by '$orden' asc" 
Voy a tener que especificar forzosamente el año, ya que de lo contrario no me mostrará ningún resultado. Al menos es eso lo que me ocurre cuando hago pruebas. Y no es ése el resultado que busco, quiero permitir al usuario que utilice criterios tan amplios como considere oportuno. Incluso me gustaría que en caso de querer seleccionar libros de una época concreta, no tuviera que ajustar el año, y que pudiera seleccionar un rango (de 1995 a 2001, por ejemplo).

Por eso vengo en busca de ayuda, para que alguien me oriente con un enlace donde se explique de manera más o menos sencilla cómo hacerlo, o con una explicación breve y un ejemplo simple.

Por cierto, no sabía si debía plantear esta pregunta en este foro o en el de MySQL. Agradeceré a los moderadores que lo muevan al subforo adecuado si consideran que éste no es el correcto.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #2 (permalink)  
Antiguo 13/10/2006, 12:30
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
¡Hola!

Sigo buscando el modo de conseguir hacer lo que he explicado, pero no encuentro respuesta. Y bueno, como veo que el tema ha pasado a la segunda página y dentro de nada pasará a la tercera, donde seguramente nadie llegará a verlo... escribo esto para volverlo a subir. Espero que no os moleste.

No necesito una explicación detallada, me bastaría con una breve orientación. Algo así como "para eso necesitas utilizar filostros y forlayos turboinyectados a través del condensador de fluzo", y a partir de ahí ya me ocuparé yo de averiguar el significado de esos palabros. Pero es que en este momento estoy dando palos de ciego, no acierto a encontrar lo que busco.

Muchas gracias de antebrazo.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #3 (permalink)  
Antiguo 13/10/2006, 13:34
(Desactivado)
 
Fecha de Ingreso: febrero-2005
Ubicación: Azcapotzalco
Mensajes: 299
Antigüedad: 19 años, 2 meses
Puntos: 2
mysql_fetch_array devuelve los resultados en un array, entonces entonces cada campo de la BD lo almaceno en un array nuevo
Código:
   while($row = mysql_fetch_array($result)) {

		$genero[] = $row["genero];
		$autor[] = $row["autor"];
		$editorial[] = $row["editorial"];
		$fecha[] = $row["fecha"];
		$precio[] = $row["precio"];

   }
si la consulta fuera por ejemplo SELECT * FROM TABLA; o sea mostrar todo el contenido como filtro ahora por ejemplo mostrar solo de un determinado autor o de una determinada editorial

con algun formulario, por ejemplo un select


Código:
mostrar resultados solo del autor:
<select name="autores">
<option>autor 1 </option>
<option>autor 2 </option>
<option>autor 3 </option>
<option>autor 4 </option>
</select>
entonces busco en el array $autor que es el que tiene almacenados los autores que devolvio la consulta SQL

Código:
$buscar = $_POST['autores'];

foreach($autor as $n => $aut){
      if( $buscar == $aut  ){
          echo $genero[$n]."<br/>";
         echo $autor[$n]."<br/>";
         echo $editorial[$n]."<br/>";
         echo $fecha[$n]."<br/>";
         echo $precio[$n]."<br/>";
    }
}
muestro los resultados que cumplan la condicion
  #4 (permalink)  
Antiguo 14/10/2006, 08:02
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Muchas gracias por tu respuesta, pero creía que me iba a costar menos asimilarlo. Lo he probado, y en efecto, funciona, me filtra los resultados según al autor que elija. Pero me encuentro con dos obstáculos que no consigo salvar:

1.- Mi intención es que antes de elegir el autor, se muestre una lista con todos los resultados, sin filtrar, de manera que de entrada se muestre una lista de resultados lo más amplia posible, y si es excesivamente amplia, pueda ir filtrándolos poco a poco.

Es decir, accedo al documento, y me encuentro con 30 obras de siete autores distintos. Un usuario preferirá ver las 30 obras y elegir a mano, pero otro usuario andará buscando un autor en concreto, así que este segundo tendrá la opción de filtrar esas 30 obras eligiendo en el formulario el autor, y reduciendo la lista a los 4 libros que ha escrito el autor que anda buscando.

La cuestión es que utilizando el código que me has puesto, de entrada no aparece ningún resultado, y hasta elegir el autor no se me muestra nada, con lo cual el primer usuario, que aún no sabe qué autor anda buscando, tendrá que ir desplegando el formulario autor por autor para poder ver la lista completa.

Quizás el problema es que lo he utilizado mal, no lo sé. Para que nos hagamos una idea, busco algo parecido a esto, donde si no especificas ningún criterio te muestra todos los elementos a piñón, y desplegando el menú puedes filtrar contenidos.

2.- Además mi intención es dar al usuario la oportunidad de filtrar los resultados según varios criterios, dejando en su mano elegir si utilizar todos los filtros, o sólo algunos.

Es decir, deberían aparecer cinco "SELECT" para poder elegir autor, título, año, editorial, y páginas, de manera que el usuario decida qué criterio quiere utilizar para filtrar los resultados. Quizás es importante para él el autor y el año, pero le resultan indiferentes el título, la editorial y el número de páginas.

La cuestión es que no encuentro el modo de meter varios criterios de filtrado.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #5 (permalink)  
Antiguo 14/10/2006, 14:02
(Desactivado)
 
Fecha de Ingreso: febrero-2005
Ubicación: Azcapotzalco
Mensajes: 299
Antigüedad: 19 años, 2 meses
Puntos: 2
bueno lo que expuse anteriormente obviamente no imprime los resultados de la consulta porque en ningun momento le he dicho que lo imprima, eso se soluciona asi

Código PHP:

$consulta 
SELECT ... ;

while(
$row mysql_fetch_array($result)) {

    echo 
"<tr><td>".$row['autor']."</td><td>".$row['genero']."</td><td>".$row['editorial']."</td>".$row['fecha']."</tr>";

        
$genero[] = $row["genero];
        $autor[] = $row["
autor"];
        $editorial[] = $row["
editorial"];
        $fecha[] = $row["
fecha"];
        $titulo[] = $row["
titulo"];

   } 
respecto a los criterios de filtracion faltantes

Código PHP:
<body>

<form method="post" action="">

<select name="editorial">
<option value="null">Ver solo resultados de : </option>
<option>Editorial 1</option>
<option>Editorial 2</option>
</select>

<select name="autor">
<option value="null">Ver solo resultados de : </option>
<option>Autor 1</option>
<option>Autor 2</option>
</select>
<select name="genero">
<option value="null">Ver solo resultados de : </option>
<option>Genero 1</option>
<option>Genero 2</option>
</select>

<select name="anyo">
<option value="null">Ver solo resultados de : </option>
<option>Año 1990</option>
<option>Añor 2000</option>
</select>

<select name="titulo">
<option value="null">Ver solo resultados de : </option>
<option>Titulo 1</option>
<option>Titulo 2</option>
</select>

<input type="submit">
</form>

<?

$edit 
$_POST['editorial'];
$aut $_POST['autor'];
$gen $_POST['genero'];
$anyo $_POST['anyo'];
$tit $_POST['titulo'];



echo 
'<table border="2px" width="900px">';

if( empty(
$aut) and empty($edit) and empty($gen) and empty($anyo) and empty($tit) ){
    for(
$i=0;$i<count($titulo);$i++){
        echo 
"<tr><td>".$titulo[$i]."</td><td>".$autor[$i]."</td><td>".$editorial[$i]."</td><td>".$genero[$i]."</td><td>".$fecha[$i]."</td></tr>";
    }
}

else    {

    for(
$i=0;$i<count($titulo);$i++){
        if( 
$edit == trim($editorial[$i])  or ($edit == "null") ){
            if( (
$aut == trim($autor[$i])) or ($aut == "null") ){
                if( (
$gen == trim($genero[$i])) or ($gen == "null") ){
                    if( (
$anyo == trim($fecha[$i])) or ($anyo == "null") ){
                        if( (
$tit == trim($titulo[$i])) or ($tit == "null") )
                            echo 
"<tr><td>".$titulo[$i]."</td><td>".$autor[$i]."</td><td>".$editorial[$i]."</td><td>".$genero[$i]."</td><td>".$fecha[$i]."</td></tr>";
                    }
                }
            }
        }    
    }


}

echo 
'</table>';

?>

</body>
</html>
yo ya lo probe con datos mios y funciona, todo el codigo que puse va en el mismo documento.
  #6 (permalink)  
Antiguo 14/10/2006, 15:28
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Muchas gracias, ahora sí que me funciona. Siento haber sido mal alumno, pero es que esto es demasiado nuevo para mí. Creía que iba a ser más fácil.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #7 (permalink)  
Antiguo 22/10/2006, 12:38
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Pregunta

Me ha surgido un nuevo problema con este código. En Debian Etch me funciona genial, con Apache 1.3.34 y PHP 4.4.2.

La cuestión es que al querer hacer una demostración de su funcionamiento en MS Windows con Server2Go, que lleva PHP 5.14 y Apache 1.3.35, si intento filtrar los resultados me sale un error como éste:

Fatal error: [] operator not supported for strings in C:\...\lista.php on line 43

La línea 43 es la siguiente:

Código PHP:
$genero[] = $row["genero"]; 
Por lo visto tiene problemas con los corchetes [] vacíos, pero no tengo ni idea de qué debería poner ahí.

Pensando que podría ser un problema de la versión de PHP, he probado a descargarme WOS Portable, que incluye tanto PHP 4.4.2 como PHP 5.1.2. Sin embargo tras asegurarme de que la versión que se ejecuta es PHP 4 (la misma que en Debian, donde funcionaba correctamente), sigo obteniendo el mismo error. Y por supuesto, no tengo ni idea de cuál puede ser el motivo. ¿Alguien tiene alguna idea?

Por si acaso voy a probar también con XAMMP, a ver si hay suerte y con éste sí funciona.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #8 (permalink)  
Antiguo 22/10/2006, 12:56
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
PD: Acabo de instalar XAMMP, ¡y funciona!

En fin, si alguien conoce la respuesta, ya por curiosidad, me gustaría conocerla. Aunque ya no me hace falta, soy feliz con XAMMP. La pega es que XAMMP requiere instalación, no como WOS o Server2Go, que se pueden ejecutar desde un pendrive USB, pero en fin. Habrá que conformarse. Espero que no me dé problemas con Win98, ya que uno de los equipos en los que quiero probarlo lleva ese sistema operativo.

Post-edición: Funciona correctamente en Win98.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable

Última edición por -Defero-; 23/10/2006 a las 03:53
  #9 (permalink)  
Antiguo 31/10/2006, 18:16
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Vuelvo a la carga. Funcionaba correctamente en XAMPP, funcionaba correctamente en Debian... pero vuelve a darme el mismo error al subir la web al servidor público:

Fatal error: [] operator not supported for strings in ...\lista.php on line 43

PHPinfo me dice que en Debian tengo PHP Version 4.4.4-3, y el servidor (que lleva FreeBSD) usa PHP Version 4.4.4. No creo que sea ése el problema, probablemente se trate de un problema de configuración.

En este documento, en los mensajes del final, parecen hablar de este problema y el modo de resolverlo, pero no entiendo lo que dicen.

En todo caso, no tengo ni idea de cómo solucionarlo. ¿Alguna pista?
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable

Última edición por -Defero-; 31/10/2006 a las 18:23
  #10 (permalink)  
Antiguo 31/10/2006, 18:28
(Desactivado)
 
Fecha de Ingreso: febrero-2005
Ubicación: Azcapotzalco
Mensajes: 299
Antigüedad: 19 años, 2 meses
Puntos: 2
prueba con esta notacion:

$genero = array();

while( ... ){

array_push($genero,$row['genero']);

}
  #11 (permalink)  
Antiguo 31/10/2006, 18:54
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
¡Muchas gracias!

Leyendo el enlace que he puesto, había llegado a escribir un código muy parecido (sin saber muy bien lo que estaba haciendo), pero en vez de esto:

array_push($genero,$row['genero']);

Había puesto esto:

array_push($genero,$row);

Y no me funcionaba. Sin embargo, tu solución funciona a las mil maravillas.

Muchas, muchas, muchísimas gracias.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #12 (permalink)  
Antiguo 22/11/2006, 02:47
Avatar de Hazek  
Fecha de Ingreso: julio-2002
Ubicación: En mi casa :D ó ?
Mensajes: 418
Antigüedad: 21 años, 9 meses
Puntos: 3
Ayuda con WOS portable

Hola, mi duda es como administro mis bases de datos, tablas y datos desde la aplicacion WOS portable desde una ventana de comandos, es que no se ni como checar esos datos.

por ejemplo con el XAMPP me meto a la carpeta mysql --> bin y ejecuto el mysql y como parametros pongo -u USUARIO -h LOCALHOST -p ****** (por citar un ejemplo) y ya puedo checar las tablas que tengo, insertar y borrar datos pero no se como hacerlo en el WOS portable por que solo viene mysqladmin y mysqld-nt dentro del directorio BIN

Alguien puede ayudarme??
__________________
Tecnologias: Flash Platform, Java (Spring, HB, Struts, Grails), iOS, Android, JavaScript, PHP, SQL (MySQL, Oracle), Prolog, Assembler (PIC's) y Arduino - Electronica.
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 11:33.