[DUDA] Distintos selectores, Ajax, MySQL, PHP

ciberares

Como ya va siendo recurrente, voy posteando mis dudas y problemas que voy teniendo en mi web.
Voy al grano, tengo una pagina php con distintos selectores que hacen de "filtro", utilizo Ajax para que al seleccionar una opción en el primer selector, paso el dato por POST a otra pagina control y devuelvo el resultado para que se actualice la tabla con los datos de la opción en la columna que le he dicho. El primer selector me funciona genial.
Lo que no se es como hacer que se apliquen varios selectores a la vez.

Gracias de antemano, si no me explicado bien podéis preguntar. E intento explicarme mejor xD

MTX_Anubis

Pues cada vez que modifiques uno, enviar como datos todos los valores de los select del filtro? Si no te he entendido mal vamos.

eXtreM3

Tendrás que enviar el valor de todos los selects cada vez que modifiques uno (o con un botón rollo "Aplicar filtros")

2 respuestas
Gantorys

por qué POST?

Entiendo que lo que te refieres es a, por ejemplo, que en un select sean países y dependiendo el país, las comunidades autónomas etc.

1 respuesta
willy_chaos

Yo tuve que hacer algo por el estilo

filtrar por año, tipologia de proyecto, proyecto, subproyectos asociados

lo hice como dicen los compañeros

envias por ajax la informacion de todos, si estan vacios en el backend pasas de ellos (no añades en la query el campo), si esta lleno, pues si le haces caso.

En mi caso, para mostrar el select de proyectos, la url de ajax era (ej http://miweb.com/proyectos/?filtrarProyectos=1&year=2016&tipologia=ENG

Pero para mostrar los subproyectos se enviaba a otro ajax
http://miweb.com/proyectos/?filtrarSubProyectos=1&year=2016&tipologia=ENG&proyectoPadre=42

Ahora no lo tengo aquí a mano, pero a ver si puedo buscar un video y pasartelo para que veas el funcionamiento

Puedes hacer como dice #3 o bien hacer que cuando cambie el valor de un campo y cumpla ciertas condiciones (ejemplo el campo año, ha de tener 4 digitos y ser un numero) , si es asi entonces envias el ajax. Así es como lo hice yo, pero claro es para una app que usan 4 personas del area de recursos humanos y la carga no es muy bestia aparte de que seria un poco incomodo el cada vez que quiera ver un subproyecto o etc... tener que ir pulsando el boton.

Pero no se como es tu caso, asi que mira que te sera mas facil y si aportara algo a la app el hacerlo con evento onchange o hacerlo con un boton.

1 respuesta
ciberares

Muchas gracias a todos por responder, es exactamente como dices #5 , ¿pero como hago para enviar el valor de todos los datos a la vez? Por ejemplo, tengo un selector de Ciudades, otro de año de nacimiento y otro de genero.

Ahora mismo cuando selecciono Madrid en ciudad, directamente me muestra los datos de Madrid. Pero y si quiero solo ver Madrid y genero Masculino y no filtrar por edad (?. Entiendo entonces que tendre que crear o varios Ajax de envio en el frontend o comprobar cada vez que se utilice cada selector , el valor de los demas selectores y pasarlo por Ajax.(?

#4 No son selectores encadenados, perdón. Me explique tremendamente mal.

#3 Como dice #5 No quiero que cada vez que usen un selector tengan que pulsar el botón, seria engorroso.

1 respuesta
willy_chaos

Si todos van a parar a la misma url de AJAX pues envia todo, aunque no contenga datos, o si te lo quieres currar mas, mediante JS vas construyendo los parametros de ajax

miweb.com/proyecto/?param1=blabla&param2=&param3=hola

por ejemplo que aunque param2 no tenga datos, lo envias y en el backend haces que la query se vaya construyendo a medida en plan

Pongo en php por pnerlo en algo

$query = 'select * from tabla '

$where = "";

if ( isset($_GET['param1']) && strlen(trim($_GET['param1'])) > 0) {
if (strlen($where) == 0) {
$query.=" WHERE campo_param1=$_GET['param1']";
} else {
$query.=" AND campo_param1=$_GET['param1]";
}

if ( isset($_GET['param2']) && strlen(trim($_GET['param2'])) > 0) {
if (strlen($where) == 0) {
$query.=" WHERE campo_param2=$_GET['param2']";
} else {
$query.=" AND campo_param2$_GET['param2']";
}

Y asi poco a poco vas construyendo la query para filtrar por los campos que te han ido rellenando

Obviamente controla que no te puedan hacer SQL injections y etc...

Si las urls son diferentes, pues tendras que mirar que orden tiene que usar el usuario. En mi caso, lo primero que filtraban los usuarios era el año, de ahi yo les rellenaba el select de proyectos con los proyectos de ese año, y como opcional podian añadir al filtro la tipologia del proyecto.

Una vez se habia cargado el select con los proyectos, seleccionaban un proyecto, y entonces se enviaba un ajax diferente que obtenia los subproyectos del proyecto con id = XYZ, se cargaban esos datos en el select de subproyectos.

Si el usuario seleccionaba un subproyecto, se volvia a enviar el mismo ajax que antes con ademas el id del subproyecto.

Esto obtenia la informacion del subproyecto que se mostraba en la pantalla.

Horas estipuladas de cada fase del proyecto y las personas asociadas, con el grupo, y las horas que le dedicaban

1 respuesta
bultack

#6 Si usas jQuery lo tienes fácil. En el caso de que tengas esos inputs dentro de un <form> puedes almacenar una variable todos los datos del formulario usando serialize() o serializeArray() y en los valores que mandas por AJAX directamente pasarle la variable.

Luego como te ha dicho #7 vas comprobando si cada parámetro tiene un valor verdadero para añadirlo a la query. Si no me equivoco puedes utilizar directamente la función empty() de la forma:

if (!empty($variable)) {
  // código
}

Para evitar la condición del $where puedes hacer dos cosas una es tener puesto where 1 = 1 y luego ir metiendo los and de las variables que sí tienes que usar para filtrar.
La segunda opción sería meter en un array las condiciones where, hacer un implode() y añadirle el where al principio del string.

$where = [];

if (!empty($_GET['ciudad']) {
   $where[] = ' ciudad = ' . $_GET['ciudad']; // ojo al espacio del principio del string
}

$where_str = ' WHERE ' . implode(' and ', $where);

Es algo muy simple pero tendrías que validar que el array de where tuviera una longitud mayor a 0 para hacer la construcción del string y añadirlo a la query.

Esto último ya es una sugerencia para que todos podamos aprender, a lo mejor tampoco es muy correcto así como lo planteo.

Usuarios habituales

  • bultack
  • willy_chaos
  • ciberares
  • Gantorys
  • eXtreM3
  • MTX_Anubis