Я пытаюсь использовать флажки для фильтрации результатов поиска. в SELECT
запрос, AND
а также OR
оба будут использоваться в зависимости от того, сколько и какие флажки были отмечены. Вот HTML-код:
<table>
<tr>
<th>Filter Results</th>
</tr>
<tr>
<td>By chipset manufacturer:</td>
<td><input name="by_amd" id="amdF" type="checkbox" value="1" />AMD</td>
<td><input name="by_ati" id="atiF" type="checkbox" value="2" />ATI</td>
<td><input name="by_nvid" id="nvidiaF" type="checkbox" value="3" />nVidia</td>
</tr>
<tr>
<td>By year released:</td>
<td><input name="by_2014" id="2014F" type="checkbox" value="2014" />2014</td>
<td><input name="by_2013" id="2013F" type="checkbox" value="2013" />2013</td>
<td><input name="by_2012" id="2012F" type="checkbox" value="2012" />2012</td>
<td><input name="by_2011" id="2011F" type="checkbox" value="2011" />2011</td>
</tr>
</table>
И PHP:
// create base SELECT query
$select = 'SELECT GPUProductName, GPUChip, GPUReleaseDate, GPUBus, GPUMemory, GPUClock, GPUMemClock, GPUAddStats';
$from = ' FROM GPU';
$where = ' WHERE TRUE';
// create search filters
$opts = isset($_POST['filterOpts']) ? $_POST['filterOpts'] : array('');
// By chipset manufacturer
if (in_array("by_amd", $opts)){
$where .= " AND CMid = 1";
}
if (in_array("by_ati", $opts)){
$where .= " AND CMid = 2";
}
if (in_array("by_nvid", $opts)){
$where .= " AND CMid = 3";
}
// by release year
if (in_array("by_2014", $opts)){
$where .= " AND YEAR(GPUReleaseDate)='2014'";
}
// build complete SELECT query
$query = $select . $from . $where;
return $query;
Если вы выбираете «по ATI» и «по AMD», оператор SELECT должен быть WHERE CMid = 2 OR CMid = 1
соответственно. Если затем добавить «к 2014 году», оператор SELECT должен быть WHERE YEAR(GPUReleaseYear) = 2014 AND CMid = 2 OR CMid = 1
, В основном, фильтры, выбранные из одной и той же категории (так сказать), должны быть объединены с помощью ИЛИ, а фильтры, выбранные из разных категорий, должны быть объединены с И. Как мне в PHP создать правильный оператор SELECT, основываясь на том, сколько флажков было отмечено в одной и / или разных категориях?
$query = 'SELECT GPUProductName, GPUChip, GPUReleaseDate, GPUBus, GPUMemory, GPUClock, GPUMemClock, GPUAddStats FROM GPU WHERE ';
$manufacturers=array();
if(isset($_POST['by_amd']) $manufacturers[]="CMid=1";
if(isset($_POST['by_ati']) $manufacturers[]="CMid=2";
if(isset($_POST['by_nvid']) $manufacturers[]="CMid=3";
$query.='('.implode(' OR ',$manufacturers).')';
$query.=' AND ';
$years=array();
if(isset($_POST['by_2014']) $years[]="YEAR(GPUReleaseDate)=2014";
if(isset($_POST['by_2013']) $years[]="YEAR(GPUReleaseDate)=2013";
if(isset($_POST['by_2012']) $years[]="YEAR(GPUReleaseDate)=2012";
if(isset($_POST['by_2011']) $years[]="YEAR(GPUReleaseDate)=2011";
$query.='('.implode(' OR ',$years).')';
return $query;
Других решений пока нет …