¿Cómo ignorar un parámetro en una consulta mysqli preparada en PHP?
(1)
Puede crear una lista de los criterios y agregar a una lista los valores y tipos de enlace, aquí hay una maqueta rápida que utiliza dos de los campos a los que hace referencia ...
$data = [];
$params = "";
$where = [];
if ( !empty($name)) {
$data[] = $name;
$params.="s";
$where[] = "name like ?";
}
if ( !empty($size)) {
$data[] = $size;
$params.="i";
$where[] = "size < ?";
}
$sql = "SELECT * FROM items";
if ( count($where) > 0 ){
$sql .= " where ". implode ( " and ", $where);
}
$query = $database->prepare($sql);
$query->bind_param($params, ...$data);
$query->execute();
Observe que
bind_param()
usa
...
para permitirle pasar una matriz en lugar de los campos individuales.
Tengo una consulta mysqli preparada como esta:
$query = $database->prepare("SELECT * FROM items WHERE inStock > ? AND size < ? AND name LIKE ?");
$query->bind_param(''iis'', $inStock, $size, $name);
$query->execute();
Hay muchas condiciones diferentes en la cláusula WHERE que filtran los resultados. El problema es que esos parámetros se proporcionan en un formulario de búsqueda y no son obligatorios. Por ejemplo, alguien puede buscar usando solo el nombre, o solo usando el tamaño y el nombre, o usando el tamaño, el nombre y en Stock, todo al mismo tiempo.
Necesito alguna forma de ajustar la consulta para poder proporcionar solo los parámetros que quiero. La única solución que se me ocurre es crear una estructura enorme si ... donde existan consultas preparadas con todas las combinaciones de opciones de búsqueda, pero eso está fuera de discusión ya que hay miles de combinaciones.
La única solución realista que se me ocurre sería utilizar una consulta no preparada, donde pego las condiciones junto con elementos como
$query .= "AND name LIKE ''%".escapestuff($_POST[''name''])."%''"
Pero eso es muy feo y me gustaría quedarme con el sistema de consulta preparado.