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.
Bueno, al final lo he hecho asi.. que es mas corto, aunque sigue llevando curro. Os pego el trozo que interesa..
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;
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);