@qu1kgg

Как подготовить несколько запросов(фильтрация товара)?

Добрый день, такая проблема с фильтрами, есть форма фильтрации:
<form method="POST" action="/catalog">
			<p class="filter_name">Город</p>
  			<ul class="filter_box">
 <li class="" style="width: 85%;"><input  name="sity[]" type="checkbox" value="Минск" style="display:none" >Минск</li>
<li class="" style="width: 85%;"><input  name="sity[]" type="checkbox" value="Гродно" style="display:none" >Гродно</li>
<li class="" style="width: 85%;"><input  name="sity[]" type="checkbox" value="Брест" style="display:none" >Брест</li>
<li class="" style="width: 85%;"><input  name="sity[]" type="checkbox" value="Витебск" style="display:none" >Витебск</li>
<li class="" style="width: 85%;"><input  name="sity[]" type="checkbox" value="Гомель" style="display:none" >Гомель</li>
<li class="" style="width: 85%;"><input  name="sity[]" type="checkbox" value="Могилев" style="display:none" >Могилев</li>
  				<div class="clearfix"></div>
  			</ul>
    			<p class="filter_name">Параметр2</p>
    			<ul class="filter_box">
    				<li class="" ><input  name="param2[]" type="checkbox" value="Значение1" style="display:none" >Значение1</li>
					<li class="" ><input  name="param2[]" type="checkbox" value="Значение2" style="display:none" >Значение2</li>
					<li class="" ><input  name="param2[]" type="checkbox" value="Значение3" style="display:none" >Значение3</li>
					<li class="" ><input  name="param2[]" type="checkbox" value="Значение4" style="display:none" >Значение4</li>
    				<div class="clearfix"></div>
    			</ul>
    
    			<p class="filter_name">Параметр3</p>
    			<ul class="filter_box">
    				<li class="" ><input  name="param3[]" type="checkbox" value="Значение1" style="display:none" >Значение1</li>
					<li class="" ><input  name="param3[]" type="checkbox" value="Значение2" style="display:none" >Значение2</li>
					<li class="" ><input  name="param3[]" type="checkbox" value="Значение3" style="display:none" >Значение3</li>
					<li class="" ><input  name="param3[]" type="checkbox" value="Значение4" style="display:none" >Значение4</li>
    				<div class="clearfix"></div>
    			</ul>
				<p class="filter_name">Параметр4</p>
    			<ul class="filter_box">
    				<li class="" ><input  name="status[]" type="checkbox" value="1" style="display:none" >Да</li>
					<li class="" ><input  name="status[]" type="checkbox" value="0" style="display:none" >Нет</li>
    				<div class="clearfix"></div>
    			</ul>
    
    			<div class="more_filter_btn">
    				<input type="submit" class="btn" name="filter" id="moreFilterBtn" value="Фильтровать">
    			</div>
            </form>

Обработчик:
<?php

  function addWhere($where, $add, $and = true) {
    if ($where) {
      if ($and) $where .= " AND $add";
      else $where .= " OR $add";
    }
    else $where = $add;
    return $where;
  }
  if (!empty($_POST["filter"])) {
    $where = "";
	if ($_POST["city"]) {
			$ids=$_POST["city"];
			$incity = str_repeat('?,', count($ids) - 1) . '?';
			$where = addWhere($where, 'city IN ('. $incity .')');
		}
		if ($_POST["param2"]) {
			$ids = $_POST["param2"];
			$inparam2 = str_repeat('?,', count($ids) - 1) . '?';
			$where = addWhere($where, 'param2 IN ('. $inparam2 .')');
		}
	if ($_POST["param3"]) {
			$ids = $_POST["param3"];
			$inparam3 = str_repeat('?,', count($ids) - 1) . '?';
			$where = addWhere($where, 'param3 IN ('. $inparam3 .')');
		}
	if ($_POST["status"]) $where = addWhere($where, "`status` IN (".htmlspecialchars(implode(",", $_POST["status"])).")");
    $sql = "SELECT * FROM `trfilters`";
    if ($where) $sql .= " WHERE $where";
   $stmt = $db->prepare($sql);
$stmt->execute($ids);
$filters = $stmt->fetchAll();
foreach ($filters as $filter) { ?>				

<?php }
  }


?>

При выборе param2 и param3 выдаёт ошибку
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in

Подскажите как в $stmt->execute($ids); передать все параметры $ids.
Возможно, я тут все не правильно написал, первый раз фильтр делаю, заранее спасибо за помощь.
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
@hecby_v
Ваш код читать конечно то еще занятие, стоило бы отформатировать. Мне кажется, дело в том, что при выборе нескольких, например param2 и param3, вы в $stmt->execute передаете $ids только из $_POST['param3']
if ($_POST["param2"]) {
      $ids = $_POST["param2"];
if ($_POST["param3"]) {
      $ids = $_POST["param3"];
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы