Consulta con numero de parametros variable (PDO)

Iniciado por i-node, 20 Febrero 2014, 11:15 AM

0 Miembros y 1 Visitante están viendo este tema.

i-node

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.

i-node

#1
Bueno, al final lo he hecho asi.. que es mas corto, aunque sigue llevando curro. Os pego el trozo que interesa..

Código (php) [Seleccionar]
try {

foreach($_GET as $key => $value) {
if($value != '') $datos[$key] = $value;
}

$parametros = count($datos);

$sql="SELECT * FROM principal WHERE ";
$pdo = new PDO("$dbtype:host=$dbhost;dbname=$dbname;charset=$dbcharset", $dbuser, $dbpass);
$pdo->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$i = 0;

foreach($datos as $key => $value) {
if ($parametros > 1 && $i < ($parametros - 1)) $sql .= "$key LIKE :$key AND ";
if ($parametros < 2 || $i == ($parametros -1))  $sql .= "$key LIKE :$key";

$i++;
}

$gdb = $pdo->prepare($sql);

foreach($datos as $key => $value) {
$gdb->bindParam(":$key", $value, PDO::PARAM_STR);
}

$gdb->execute();

$i=0;

segurolas.es

Código (php-brief) [Seleccionar]
class Filter {

    private $filtros = [];

    function __get($filtro) {
        return "$filtro IN(" . implode(",", $this->filtros[$filtro]) . ")";
    }

    function __construct($cadena) {
        foreach (explode('&', $cadena) as $par) {
            list($filtro, $valor) = explode('=', $par);
            $this->filtros[$filtro][] = is_numeric($valor) ? $valor : "'$valor'";
        }
    }

}

$_SERVER['QUERY_STRING'] = "select_time=2&grade=3&grade=4&grade=terror&genre=amor&genre=9&genre=5&language=0";
$filtros = new Filter($_SERVER['QUERY_STRING']);
$consulta = "SELECT * FROM tblmovies WHERE $filtros->grade AND $filtros->genre AND $filtros->language AND $filtros->select_time;";
var_dump($_SERVER['QUERY_STRING'], $filtros, $consulta);