¿Cómo ignorar un parámetro en una consulta mysqli preparada en PHP?

Tengo una consulta mysqli preparada como esta:

$query = $database->prepare("SELECT * FROM items WHERE inStock > ? AND size 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 suministran 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 inStock, todo al mismo tiempo.

Necesito alguna forma de ajustar la consulta para poder suministrar solo los parámetros que quiero. La única solución que se me ocurre es crear una gran estructura ifelse donde haya 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 real que puedo pensar sería usar una consulta no preparada, donde pegue las condiciones junto con piezas como $query .= "AND name LIKE '%".escapestuff($_POST['name'])."%'"

Pero eso es muy feo y me gustaría mucho quedarme con el sistema de consulta preparado.

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 usa dos de los campos a los que se refiere …

 $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.