Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中忽略准备好的mysqli查询中的参数?_Php_Mysql_Mysqli - Fatal编程技术网

如何在PHP中忽略准备好的mysqli查询中的参数?

如何在PHP中忽略准备好的mysqli查询中的参数?,php,mysql,mysqli,Php,Mysql,Mysqli,我有一个准备好的mysqli查询,如下所示: $query = $database->prepare("SELECT * FROM items WHERE inStock > ? AND size < ? AND name LIKE ?"); $query->bind_param('iis', $inStock, $size, $name); $query->execute(); $query=$databa

我有一个准备好的mysqli查询,如下所示:

$query = $database->prepare("SELECT * FROM items WHERE inStock > ? AND size < ? AND name LIKE ?");            
$query->bind_param('iis', $inStock, $size, $name);              
$query->execute();  
$query=$database->prepare(“从inStock>和size<和name LIKE?的项目中选择*);
$query->bind_参数('iis',$inStock,$size,$name);
$query->execute();
WHERE子句中有许多不同的条件用于过滤结果。 问题是,这些参数是以搜索形式提供的,它们不是必需的。例如,某人可以只使用名称,或只使用大小和名称,或同时使用大小、名称和inStock进行搜索

我需要一些方法来调整查询,以便只提供所需的参数。我能想到的唯一解决方案是创建一个巨大的if..else结构,其中存在具有所有搜索选项组合的准备好的查询,但这是不可能的,因为有数千个组合

我能想到的唯一实际的解决方案是使用一个未准备好的查询,在这里我将条件与诸如
$query.=”和诸如“%”的名称粘在一起


但这非常难看,我非常希望继续使用准备好的查询系统。

您可以建立一个条件列表,并将绑定值和类型添加到列表中,下面是一个快速模型,它使用了您提到的两个字段

$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();
$data=[];
$params=“”;
$where=[];
如果(!空($name)){
$data[]=$name;
$params.=“s”;
$where[]=“像什么样的名字?”;
}
如果(!空($size)){
$data[]=$size;
$params.=“i”;
$where[]=“尺寸<?”;
}
$sql=“从项目中选择*”;
如果(计数($where)>0){
$sql.=“where.”内爆(“and”,$where);
}
$query=$database->prepare($sql);
$query->bind_param($params,$data);
$query->execute();

请注意,
bind_param()
使用
..
来允许您传递数组而不是单个字段。

听起来像是。。。。循环!使用查询生成器(例如DBAL)