Foros del Web » Programando para Internet » PHP »

Separar cadena en multiples secciones para crear filtro

Estas en el tema de Separar cadena en multiples secciones para crear filtro en el foro de PHP en Foros del Web. Bueno que tal espero puedan ayudarme les agradeceria bastante, bien estoy creando un filtro, recibo por GET una variable la cual contine multiples selcciones de ...
  #1 (permalink)  
Antiguo 14/02/2014, 18:32
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Separar cadena en multiples secciones para crear filtro

Bueno que tal espero puedan ayudarme les agradeceria bastante, bien estoy creando un filtro, recibo por GET una variable la cual contine multiples selcciones de 4 menus recibo una variable con siguientes datos:
Código PHP:
var $filter select_time=1&grade1=1&grade2=2&grade3=3&genre5=5&genre19=19&language0=
bien la seleccion puede variar dependiendo de que opciones marque el usuario son 4 menus a uno lo identifica select_time el otro grade, genre, y language bien como se ve puede ver puede haber multiples selecciones como grade que en este caso son 3 (grade1, grade2, grade3) en este caso cuando el valor sea 0 se entiende que quiere todos los regitros sobre la categoria si alguien pudiera hecharme una manita.

Código SQL:
Ver original
  1. $query_movies = "SELECT * FROM tblpeliculas";

la idea esque se busque en la tabla las categorias seleccionadas y quede algo como esto:

Código SQL:
Ver original
  1. $query_movies = "SELECT * FROM tblmovies WHERE tblmovies.time = 1 & tblmovies.idgrade = 1, 2, 3 & tblmovies.idgenre = 5, 19"; //LANGUAGE no porque como su valor es cero y se entiende que quiere todos los lenguajes

Lo publique en php porque aunque la finalidad es sql la respuesta basicamente se encuentra en php
  #2 (permalink)  
Antiguo 14/02/2014, 18:46
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

No es necesario que coloques la palabra reservada var para declarar una variable en PHP, basta con que tenga el signo de dólar adelante. Con respecto a lo de separar la cadena, podrías hacerlo así:

Código PHP:
Ver original
  1. //Este es el valor que tienes (que puede variar)
  2. $filter = "select_time=1&grade1=1&grade2=2&grade3=3&genre5=5&genre19=19&language0=0";
  3.  
  4. $array1 = explode("&", $filter);
  5. $array2 = array();
  6.  
  7. foreach ($array1 as $cadena){
  8.     $clave = substr($cadena, 0, strpos($cadena, "=") - 1);
  9.     $valor = substr($cadena, strpos($cadena, "=") + 1);
  10.     $array2[$clave] = $valor;
  11. }

Si haces un print_r($array2), verás su contenido:

Código HTML:
Ver original
  1. Array
  2. (
  3.     [select_tim] => 1
  4.     [grade] => 3
  5.     [genre] => 5
  6.     [genre1] => 19
  7.     [language] => 0
  8. )

Y si quieres tomar sus valores de manera independiente, hazlo así:

Código PHP:
Ver original
  1. $select_tim = $array2["select_tim"];
  2. $grade = $array2["grade"];
  3. $genre = $array2["genre"];
  4. $genre1 = $array2["genre1"];
  5. $language =$ array2["language"];

Básicamente, convierto la cadena original en un array utilizando la función explode, con la cual separo cada par de valores a partir de la aparición de los &, luego, recorro ese array y asigno cada clave y valor a un segundo array, identificando cada parte con las funciones substr y strpos, por ejemplo, en tu string query tienes lo siguiente:

Código HTML:
Ver original
  1. select_time=1&grade1=1&grade2=2&grade3=3&genre5=5&genre19=19&language0=0

Los valores numéricos serían los valores y lo que antecede al signo de igualdad sería la clave. Ahora ya puedes manipular cada elemento y su valor de forma independiente.

Un ejemplo en ejecución: http://ideone.com/9popi8

Te sugiero leer la información que hay en el manual oficial acerca de las funciones que utilicé para que entiendas mejor su funcionamiento.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 14/02/2014, 20:42
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Respuesta: Separar cadena en multiples secciones para crear filtro

bueno haber primero gracias por ayudarme nuevamente como e estado modificando el jquery de hace rato por eso puse var xD y no me fije que la habia puesto gracias por el dato pero ya sabia que no se necesita var para definir una variable en php bueno limpie el codigo y ahora recibo algo como esto:

Código PHP:
Ver original
  1. $filter = select_time=1&grade=1&grade=2&grade=3&genre=5&genre=19&language=0

entonces
Código PHP:
Ver original
  1. $filter = "select_time=1&grade=1&grade=2&grade=3&genre=5&genre=19&language=0";
  2.      
  3.     $array1 = explode("&", $filter);
  4.     $array2 = array();
  5.      
  6.     foreach ($array1 as $cadena){
  7.         $clave = substr($cadena, 0, strpos($cadena, "="));
  8.         $valor = substr($cadena, strpos($cadena, "=") + 1);
  9.         $array2[$clave] = $valor;
  10.     }
  11.     $select_tim = $array2["select_time"];
  12.     $grade = $array2["grade"];
  13.     $genre = $array2["genre"];
  14.     $language =$array2["language"];
  15.    
  16.     echo $genre;

Pero cuando la imprimo me sale solo el ultimo valor, lo sobrescribe necesito que se concatene para que me imprima algo como esto $grade = 1|2|3, $genre = 5|19 etc.. que luego pondre en la consulta.
  #4 (permalink)  
Antiguo 14/02/2014, 21:28
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

¿Cómo quieres que se muestren los valores al final?, porque creo que te será más complicado manipular una variable con esta forma: $grade = 1|2|3.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 14/02/2014, 22:13
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Respuesta: Separar cadena en multiples secciones para crear filtro

Pues esque como dije quiero un filtro quiero hacer una consulta en base a esos datos que obtengo

Código SQL:
Ver original
  1. $query_movies = "SELECT * FROM tblmovies WHERE tblmovies.grade = //sea igual a las calidades obtenidas  AND tblmovies.genre = //sea igual a los generos obtenidos AND tblmovies.language = //sea igual a los languajes obtenidos AND tblmovies.select_time = //sea igual a los años obtenidos

basicamente que la consulta sea en vase a los generos, años, lenguajes y calidades que los usuarios selecionaron cuyos datos son los que se obtienen via ajax con el codigo que me ayudaste en jquery
  #6 (permalink)  
Antiguo 14/02/2014, 22:23
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

A ver, de la forma en que te expliqué en la respuesta anterior, separas esa query string y obtienes cada dato para poder aplicarlo en la sentencia SQL, de modo que solamente te queda insertar los valores.

Código PHP:
Ver original
  1. $filter = "select_time=1&grade1=1&grade2=2&grade3=3&genre5=5&genre19=19&language0=0";
  2.  
  3. $array1 = explode("&", $filter);
  4. $array2 = array();
  5.  
  6. foreach ($array1 as $cadena){
  7.     $clave = substr($cadena, 0, strpos($cadena, "=") - 1);
  8.     $valor = substr($cadena, strpos($cadena, "=") + 1);
  9.     $array2[$clave] = $valor;
  10. }
  11.  
  12. $select_time = $array2["select_time"];
  13. $grade1 = $array2["grade1"];
  14. $grade2 = $array2["grade2"];
  15. $grade3 = $array2["grade3"];
  16. $genre = $array2["genre5"];
  17. $genre1 = $array2["genre19"];
  18. $language = $array2["language0"];
  19.  
  20. $query_movies = "SELECT * FROM tblmovies
  21.                 WHERE
  22.                     (tblmovies.grade = $grade1 OR tblmovies.grade = $grade2 OR tblmovies.grade = $grade3)
  23.                 AND (tblmovies.genre = $genre OR tblmovies.genre = $genre1)
  24.                 AND tblmovies.language = $language
  25.                 AND tblmovies.select_time = $select_time";

Inténtalo así y nos dices cómo te fue, saludos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 14/02/2014 a las 22:32
  #7 (permalink)  
Antiguo 14/02/2014, 22:37
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Respuesta: Separar cadena en multiples secciones para crear filtro

El inconveniente esque la catidad puede variar fue por eso que limpie la cadena que obtenia ahora ya no recibo:

Código SQL:
Ver original
  1. $filter = "select_time=1&grade1=1&grade2=2&grade3=3&genre5=5&genre19=19&language0=0";

si no:
Código SQL:
Ver original
  1. $filter = "select_time=1&grade=1&grade=2&grade=3&genre=5&genre=19&language=0";

porque la cantidad puede variar puedo recibir desde 3 generos asta 20 dependiendo de los que el usuario marque con checkbox y puedo recibir asta 6 calidades diferentes etc...
  #8 (permalink)  
Antiguo 14/02/2014, 22:44
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

Código PHP:
Ver original
  1. class Filter {
  2.  
  3.     private $filtros = [];
  4.  
  5.     function __construct($cadena) {
  6.         foreach (explode('&', $cadena) as $par) {
  7.             list($filtro, $valor) = explode('=', $par);
  8.             $this->filtros[$filtro] = is_numeric($valor) ? $valor : "'$valor'";
  9.         }
  10.     }
  11.  
  12.     function __get($filtro) {
  13.         return $this->filtros[$filtro];
  14.     }
  15.  
  16. }
  17.  
  18. $filtros = new Filter("select_time=tiempo&grade=3&genre=5&language=spanish");
  19.  
  20. echo "SELECT * FROM tblmovies WHERE "
  21.  . "grade = $filtros->grade AND "
  22.  . "genre = $filtros->genre AND "
  23.  . "language = $filtros->language AND "
  24.  . "select_time = $filtros->select_time;";
  #9 (permalink)  
Antiguo 14/02/2014, 23:07
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Respuesta: Separar cadena en multiples secciones para crear filtro

lolainas esta muy bien tu codigo pero me da el mismo problema solo me imprime un genero una calidad un año cuando son varios.
  #10 (permalink)  
Antiguo 14/02/2014, 23:13
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

Analizando bien lo que quieres hacer con los datos, creo que la forma en como los guardaste antes de enviarlos, es incorrecta. Lo ideal sería que guardes los datos en variables que tengan los mismos nombres que los campos en la tabla de la BD y ya con eso, puedes hacer una jugada para hacer la búsqueda únicamente con los datos recibidos.

Veo que tienes estos campos grade, genre, select_time y language, entonces, sería perfecto si mandaras los valores de este modo (los valores son de ejemplo):

Código Javascript:
Ver original
  1. var datos = {
  2.         grade: [2, 5, 9],
  3.         genre: [10, 8, 4],
  4.         select_time: 3,
  5.         language: 1
  6.     };
  7.  
  8. $.ajax({
  9.     url: "ejemplo.php",
  10.     type: "GET",
  11.     data: datos,
  12.     success: function(response){
  13.         //Acá haces algo con la respuesta del servidor
  14.     }
  15. });

Y en el archivo "ejemplo.php", los recibes así:

Código PHP:
Ver original
  1. $grade = "(" . implode(",", $_GET["grade"]) . ")";
  2. $genre = "(" . implode(",", $_GET["genre"]) . ")";
  3. $select_time = $_GET["select_time"];
  4. $language = $_GET["language"];
  5.  
  6. //Acá comprobamos qué datos han llegado para armar la condición en la consulta
  7. $condicion = (isset($grade) ? "grade IN $grade" : "") .
  8.               (isset($genre) ? (isset($grade) ? " AND " : "") . "genre IN $genre" : "") .
  9.               (isset($select_time) ? (isset($grade) || isset($genre) ? " AND " : "") . "select_time = $select_time" : "") .
  10.               (isset($language) ? (isset($grade) || isset($genre) || isset($select_time) ? " AND " : "") . "language = $language" : "");
  11.  
  12. $query = "SELECT * FROM tblmovies WHERE $condicion";

Como veo que "genre" y "grade" pueden tener más de un valor, los envío como arrays con todos los datos que contengan y los convierto en un grupo para buscar con la sub-consulta IN, luego, compruebo que cada dato exista, si es así, voy creando cada una de las condiciones según corresponda y al final, concateno todo a la consulta.

Pruébalo y nos dices cómo te fue, saludos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 14/02/2014, 23:14
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

Código PHP:
Ver original
  1. class Filter {
  2.  
  3.     private $filtros = [];
  4.  
  5.     function __get($filtro) {
  6.         return $this->filtros[$filtro];
  7.     }
  8.  
  9.     function __construct($cadena) {
  10.         foreach (explode('&', $cadena) as $par) {
  11.             list($filtro, $valor) = explode('=', $par);
  12.             $valor = is_numeric($valor) ? $valor : "'$valor'";
  13.             if (isset($this->filtros[$filtro]))
  14.                 if (is_array($f = &$this->filtros[$filtro]))
  15.                     array_push($f, $valor);
  16.                 else
  17.                     $f = [$f, $valor];
  18.             else
  19.                 $this->filtros[$filtro] = $valor;
  20.         }
  21.     }
  22.  
  23. }
  24.  
  25. $filtros = new Filter("select_time=tiempo&grade=3&grade=4&grade=5&genre=5&genre=9&genre=5&language=spanish");
  26.  
  27. $consulta = 'SELECT * FROM tblmovies WHERE '
  28.     . '(grade = ' . implode(' OR grade = ', $filtros->grade) . ') AND '
  29.     . '(genre = ' . implode(' OR genre = ', $filtros->genre) . ') AND '
  30.     . "language = $filtros->language AND "
  31.     . "select_time = $filtros->select_time;";
  32.  
  33. echo $consulta;
  #12 (permalink)  
Antiguo 14/02/2014, 23:24
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

Corrijo: Para que no tengas problemas en la recepción de datos, hazlo así:

Código Javascript:
Ver original
  1. $.ajax({
  2.     url: "ejemplo.php",
  3.     type: "GET",
  4.     data: {
  5.             grade: [2, 5, 9],
  6.             genre: [10, 8, 4],
  7.             select_time: 3,
  8.             language: 1
  9.           },
  10.     success: function(response){
  11.         //Acá haces algo con la respuesta del servidor
  12.     }
  13. });

Y añado un par de cositas más para hacer más robusta la parte en PHP:

Código PHP:
Ver original
  1. $grade = !is_null($_GET["grade"]) ? "(" . implode(",", $_GET["grade"]) . ")" : "";
  2. $genre = !is_null($_GET["genre"]) ? "(" . implode(",", $_GET["genre"]) . ")" : "";
  3. $select_time = !is_null($_GET["select_time"]) ? $_GET["select_time"] : "";
  4. $language = !is_null($_GET["language"]) ? $_GET["language"] : "";
  5.  
  6. //Acá comprobamos qué datos han llegado para armar la condición en la consulta
  7. $condicion = (isset($grade) ? "grade IN $grade" : "") .
  8.              (isset($genre) ? (isset($grade) ? " AND " : "") . "genre IN $genre" : "") .
  9.              (isset($select_time) ? (isset($grade) || isset($genre) ? " AND " : "") . "select_time = $select_time" : "") .
  10.              (isset($language) ? (isset($grade) || isset($genre) || isset($select_time) ? " AND " : "") . "language = $language" : "");
  11.  
  12. $query = "SELECT * FROM tblmovies" . strlen($condicion) ? " WHERE $condicion" : "";

Como es posible que algunas variables no contengan datos, es mejor hacer la comprobación respectiva, de modo que si no hay datos, la consulta no lanzará errores por falta de una condición.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 14/02/2014 a las 23:50
  #13 (permalink)  
Antiguo 14/02/2014, 23:52
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

Para todos los casos
Código PHP:
Ver original
  1. class Filter {
  2.  
  3.     private $filtros = [];
  4.  
  5.     // un filtro es un grupo de condiciones
  6.     function __get($filtro) {
  7.         return "($filtro = " . implode(" OR $filtro = ", $this->filtros[$filtro]) . ")";
  8.     }
  9.  
  10.     function __construct($cadena) {
  11.         foreach (explode('&', $cadena) as $par) {
  12.             list($filtro, $valor) = explode('=', $par);
  13.             $v = is_numeric($valor) ? $valor : "'$valor'";
  14.             if (is_array($f = &$this->filtros[$filtro]))
  15.                 array_push($f, $v);
  16.             else
  17.                 $f = [$v];
  18.         }
  19.     }
  20.  
  21. }
  22.  
  23. $cadena = "select_time=2&grade=3&grade=4&grade=5&genre=5&genre=9&language=0";
  24. $filtros = new Filter($cadena);
  25. $consulta = "SELECT * FROM tblmovies WHERE $filtros->grade AND $filtros->genre AND $filtros->language AND $filtros->select_time;";
  26. var_dump($cadena, $filtros, $consulta);

EDITO
Prueba con esto y goza amigo:
Código PHP:
Ver original
  1. $cadena = "select_time=2&grade=3&grade=4&grade=terror&genre=amor&genre=9&genre=5&language=0";

Última edición por lolainas; 15/02/2014 a las 00:02
  #14 (permalink)  
Antiguo 15/02/2014, 00:03
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

lolainas, un par de observaciones:

- Hacer una búsqueda en un conjunto de datos, resulta más eficiente si la haces con la sub-consulta IN que con repetidos OR, que sumado a la cantidad de recursos que consume el uso de un bucle en PHP, solamente incrementa la ineficiencia del algoritmo, incluso en otro foro ya se trató el tema.
- La función array_push, resulta conveniente usarla solamente cuando vas a insertar más de un dato a la vez, porque si lo haces uno por uno, harás más ineficiente al algoritmo que haciéndolo del modo $array[] = $valor. En el manual oficial se hace mención a esto en la primera nota.

Por lo demás, todo bien, saludos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #15 (permalink)  
Antiguo 15/02/2014, 00:05
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

La verdad que sí, me quedo con tu solución, sólo le planteaba otra alternativa al chico que preguntaba ;)
  #16 (permalink)  
Antiguo 15/02/2014, 00:09
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

Mejoro la performance con IN
Código PHP:
Ver original
  1. class Filter {
  2.  
  3.     private $filtros = [];
  4.  
  5.     function __get($filtro) {
  6.         return "$filtro IN(" . implode(",", $this->filtros[$filtro]) . ")";
  7.     }
  8.  
  9.     function __construct($cadena) {
  10.         foreach (explode('&', $cadena) as $par) {
  11.             list($filtro, $valor) = explode('=', $par);
  12.             $v = is_numeric($valor) ? $valor : "'$valor'";
  13.             if (is_array($f = &$this->filtros[$filtro]))
  14.                 array_push($f, $v);
  15.             else
  16.                 $f = [$v];
  17.         }
  18.     }
  19.  
  20. }
  21.  
  22. $cadena = "select_time=2&grade=3&grade=4&grade=terror&genre=amor&genre=9&genre=5&language=0";
  23. $filtros = new Filter($cadena);
  24. $consulta = "SELECT * FROM tblmovies WHERE $filtros->grade AND $filtros->genre AND $filtros->language AND $filtros->select_time;";
  25. var_dump($cadena, $filtros, $consulta);
  #17 (permalink)  
Antiguo 15/02/2014, 00:09
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

Descuida, hace un tiempo di una solución utilizando una función recursiva y me dieron con palo porque era menos eficiente que otra solución propuesta , ahora trato de enseñar lo mismo pero sin ser tan duro.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #18 (permalink)  
Antiguo 15/02/2014, 00:12
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

Ya que estamos lo dejamos todo hecho :P
Código PHP:
Ver original
  1. class Filter {
  2.  
  3.     private $filtros = [];
  4.  
  5.     function __get($filtro) {
  6.         return "$filtro IN(" . implode(",", $this->filtros[$filtro]) . ")"; /** @author alexis */
  7.     }
  8.  
  9.     function __construct($cadena) {
  10.         foreach (explode('&', $cadena) as $par) {
  11.             list($filtro, $valor) = explode('=', $par);
  12.             $v = is_numeric($valor) ? $valor : "'$valor'";
  13.             if (is_array($f = &$this->filtros[$filtro]))
  14.                 $f[] = $v; /** @author alexis */
  15.             else
  16.                 $f = [$v];
  17.         }
  18.     }
  19.  
  20. }
  21.  
  22. $cadena = "select_time=2&grade=3&grade=4&grade=terror&genre=amor&genre=9&genre=5&language=0";
  23. $filtros = new Filter($cadena);
  24. $consulta = "SELECT * FROM tblmovies WHERE $filtros->grade AND $filtros->genre AND $filtros->language AND $filtros->select_time;";
  25. var_dump($cadena, $filtros, $consulta);
  #19 (permalink)  
Antiguo 15/02/2014, 00:14
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

Jeje, gracias por los créditos, pero no eran necesarios.

Solo una observación más; considera siempre que quien tome el algoritmo que presentas, pueda estar usando una versión inferior a la 5.4 de PHP, por lo tanto, la definición de un array de la forma $variable = [], producirá un error. Ya me pasó eso dando una explicación hace un tiempo, mejor déjalo con array().
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #20 (permalink)  
Antiguo 15/02/2014, 00:23
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

Escribo software siempre en la última versión estable, quien lo tome puede adaptarlo a su antojo libremente. Si mi hosting usara una versión inferior a la estable me cambiaría inmediatamente a quien me abra puertas a nuevas tecnologías con las que escribir mejor software.
  #21 (permalink)  
Antiguo 15/02/2014, 00:27
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

Está bien eso, yo voy por el lado de la inclusividad, porque hay usuarios nóveles que no saben acerca de eso y aunque eso no los exime de informarse al respecto, pues es mejor e inclusivo el mostrar un código que sea entendible tanto por un experto como por un novato, será un pequeño detalle, pero cuenta, créeme, la experiencia en este foro me lo enseñó así.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #22 (permalink)  
Antiguo 15/02/2014, 00:28
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Respuesta: Separar cadena en multiples secciones para crear filtro

Alexis88 si me dio error pero igual lo cambie por array() pero no e probado el codigo actualizado de lolainas probe el tuyo Alexis88 y se que doy mucha lata pero mejor hacerlo bien ahora y no volver a preguntar despues bueno fue magnifico el script pero me surge un inconveniente si un elemento esta vacio por ejemplo grade me lo imprime asi:
Código SQL:
Ver original
  1. WHERE grade IN  AND genre IN (10,8,4,5) AND select_time = 3 AND LANGUAGE = 1
lo cual supongo dara error al hacer la consulta.

El codigo que probe fue:
Código PHP:
Ver original
  1. $grade = !is_null($_GET["grade"]) ? "(" . implode(",", $_GET["grade"]) . ")" : "";
  2.     $genre = !is_null($_GET["genre"]) ? "(" . implode(",", $_GET["genre"]) . ")" : "";
  3.     $select_time = !is_null($_GET["select_time"]) ? $_GET["select_time"] : "";
  4.     $language = !is_null($_GET["language"]) ? $_GET["language"] : "";
  5.      
  6.     //Acá comprobamos qué datos han llegado para armar la condición en la consulta
  7.     $condicion = (isset($grade) ? "grade IN $grade" : "") .
  8.                  (isset($genre) ? (isset($grade) ? " AND " : "") . "genre IN $genre" : "") .
  9.                  (isset($select_time) ? (isset($grade) || isset($genre) ? " AND " : "") . "select_time = $select_time" : "") .
  10.                  (isset($language) ? (isset($grade) || isset($genre) || isset($select_time) ? " AND " : "") . "language = $language" : "");
  11.      
  12.     $query = "SELECT * FROM tblmovies" . strlen($condicion) ? " WHERE $condicion" : "";
  #23 (permalink)  
Antiguo 15/02/2014, 00:31
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

La verdad que tu código es mucho más expresivo que el mío, sí, es verdad, es más entendible tanto para expertos como para novatos.
  #24 (permalink)  
Antiguo 15/02/2014, 00:35
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Separar cadena en multiples secciones para crear filtro

No vi ese detalle, ya son casi las 2 am acá y estoy entrando en estado zombie.

Pruébalo así:

Código PHP:
Ver original
  1. $condicion = (strlen($grade) ? "grade IN $grade" : "") .
  2.              (strlen($genre) ? (strlen($grade) ? " AND " : "") . "genre IN $genre" : "") .
  3.              (strlen($select_time) ? (strlen($grade) || strlen($genre) ? " AND " : "") . "select_time = $select_time" : "") .
  4.              (strlen($language) ? (strlen($grade) || strlen($genre) || strlen($select_time) ? " AND " : "") . "language = $language" : "");
  5.  
  6. $query = "SELECT * FROM tblmovies" . strlen($condicion) ? " WHERE $condicion" : "";

Como previamente se hace la comprobación de la existencia de valores, solamente queda verificar si las variables contienen datos o no.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #25 (permalink)  
Antiguo 15/02/2014, 00:39
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Separar cadena en multiples secciones para crear filtro

Ah, se me olvidaba

Usala asi:
Código PHP:
Ver original
  1. include 'filter.php';
  2.  
  3. // recibes $_SERVER['QUERY_STRING']
  4. $query = filter_input(INPUT_SERVER, 'QUERY_STRING');
  5.  
  6. $filtros = new Filter($query);
  7.  
  8. $consulta = "SELECT * FROM tblmovies WHERE $filtros->grade AND $filtros->genre AND $filtros->language AND $filtros->select_time;";
  9.  
  10. var_dump($query, $filtros, $consulta);
  #26 (permalink)  
Antiguo 15/02/2014, 00:42
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Respuesta: Separar cadena en multiples secciones para crear filtro

Enserio en mi pais son las 12:45
  #27 (permalink)  
Antiguo 15/02/2014, 00:53
 
Fecha de Ingreso: julio-2013
Mensajes: 158
Antigüedad: 10 años, 9 meses
Puntos: 6
Respuesta: Separar cadena en multiples secciones para crear filtro

Bueno lo probe ahora y todo parece bien quiero agradecer el tiempo que se tomaron los dos en ayudarme son ustedes muy amables probare el tuyo tambien lolainas vere con cual me adapto mejor ya solo me hace falta hacer la consulta pero para eso todabia me falta modificar el jquery haora lo hago y si todo esta bien mañana sierro el tema.

Etiquetas: cadena, multiples, secciones, select, sql, tabla, variable
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 03:53.