Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: i-node en 20 Febrero 2014, 11:15 am



Título: Consulta con numero de parametros variable (PDO)
Publicado por: i-node en 20 Febrero 2014, 11:15 am
Hola a todos,

Mi consulta es la siguiente.. Tengo un formulario con varios campos input que sirve para realizar consultas a una base de datos. Obviamente, no siempre se hara una busqueda utilizando todos los campos, por lo tanto el numero de parametros que se le pasan a la consulta select no siempre va a tener el mismo numero de campos a buscar.

Tal vez en alguna ocasion quiera filtrar por pais con un:

SELECT * FROM principal WHERE pais="España";

Otra vez tal vez quiera filtrar por nombre:

SELECT * FROM principal WHERE nombre="Pedro";

O tal vez quiera buscar un cliente Pedro de España:

SELECT * FROM principal WHERE nombre="Pedro" AND pais="España";

Hay alguna manera de hacer esto que no sea con if's y utilizando empty y alguna variable de control para saber cuantos parametros se le van a añadir? Porque lo veo algo engorroso y poco profesional xD

Gracias por adelantado.
Un saludo.


Título: Re: Consulta con numero de parametros variable (PDO)
Publicado por: i-node en 20 Febrero 2014, 15:40 pm
Bueno, al final lo he hecho asi.. que es mas corto, aunque sigue llevando curro. Os pego el trozo que interesa..

Código
  1. try {
  2.  
  3. foreach($_GET as $key => $value) {
  4. if($value != '') $datos[$key] = $value;
  5. }
  6.  
  7. $parametros = count($datos);
  8.  
  9. $sql="SELECT * FROM principal WHERE ";
  10. $pdo = new PDO("$dbtype:host=$dbhost;dbname=$dbname;charset=$dbcharset", $dbuser, $dbpass);
  11. $pdo->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  12.  
  13. $i = 0;
  14.  
  15. foreach($datos as $key => $value) {
  16. if ($parametros > 1 && $i < ($parametros - 1)) $sql .= "$key LIKE :$key AND ";
  17. if ($parametros < 2 || $i == ($parametros -1))  $sql .= "$key LIKE :$key";
  18.  
  19. $i++;
  20. }
  21.  
  22. $gdb = $pdo->prepare($sql);
  23.  
  24. foreach($datos as $key => $value) {
  25. $gdb->bindParam(":$key", $value, PDO::PARAM_STR);
  26. }
  27.  
  28. $gdb->execute();
  29.  
  30. $i=0;


Título: Re: Consulta con numero de parametros variable (PDO)
Publicado por: segurolas.es en 28 Febrero 2014, 13:54 pm
Código
  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.            $this->filtros[$filtro][] = is_numeric($valor) ? $valor : "'$valor'";
  13.        }
  14.    }
  15.  
  16. }
  17.  
  18. $_SERVER['QUERY_STRING'] = "select_time=2&grade=3&grade=4&grade=terror&genre=amor&genre=9&genre=5&language=0";
  19. $filtros = new Filter($_SERVER['QUERY_STRING']);
  20. $consulta = "SELECT * FROM tblmovies WHERE $filtros->grade AND $filtros->genre AND $filtros->language AND $filtros->select_time;";
  21. var_dump($_SERVER['QUERY_STRING'], $filtros, $consulta);
  22.