2013-04-20 5 views
0

Я пытался понять это на некоторое время, но я никуда не схожу. Я прочитал много других вопросов, размещенных здесь и через Интернет, но не могу найти решение. Специально в случае использования нескольких флажков.Множественный фильтр флажка в PHP

Пожалуйста, несите меня, когда я пытаюсь объяснить проблему, с которой я столкнулся.

На странице У меня есть список людей с их соответствующим местоположением, которые я вытаскиваю из базы данных, используя php/sql. То, что я пытаюсь достичь, - это возможность фильтровать список в соответствии с местоположением, используя флажки.

Это код, который у меня есть сейчас для флажков.

<ul> 
    <li><input type="checkbox" name="check_list[]" value="sydney">Sydney</li> 
    <li><input type="checkbox" name="check_list[]" value="durban">Durban</li> 
    <li><input type="checkbox" name="check_list[]" value="delhi">Delhi</li> 
    <li><input type="checkbox" name="check_list[]" value="cairo">Cairo</li> 
    <li><input type="checkbox" name="check_list[]" value="madrid">Madrid</li> 
    <li><input type="submit"></li> 
</ul> 

Это код, я использую, чтобы проверить, если флажок установлен и, соответственно, изменить запрос SQL

if (empty ($_POST['check_list'])) { 

    $SQLquery = 'SELECT * FROM `people`'; 
    $query = $conn->query($SQLquery); 

} elseif (!empty($_POST['check_list'])) { 

    foreach($_POST['check_list'] as $check) 

    $location = $check; 

    $query = $conn->prepare('SELECT * FROM `people` WHERE `p_location` = :location'); 
    $query->execute(array('location' => $location)); 

} 

Сейчас этот код работает прекрасно, когда только один флажок. Однако при проверке нескольких флажков это не выполняется. Он просто ничего не показывает.

Я знаю, что я могу изменить запрос SQL с помощью оператора OR добавить в других местах, как так:

$query = $conn->prepare('SELECT * FROM `people` WHERE `p_location` = 'Delhi' OR `p_location` = 'Madrid') 

Однако, я не могу понять, как я могу первый проверить, какие все флажки проверяются, а затем создайте инструкцию SQL таким образом, чтобы отфильтровать результаты, когда выбрано более одного города.

Мне также интересно, если это лучший способ добиться чего-то подобного или нет. Я открыт для альтернативных способов достижения этого в рамках php/sql.

ответ

1

проверялось, но должно дать вам представление о том, что вы должны сделать.

ОТВЕТ ИЗОБРАЖЕННЫЙ!

$markers = str_repeat('?, ', count($_POST['check_list']) - 1) . '?'; 

$query = $conn->prepare('SELECT * FROM `people` WHERE `p_location` IN (' . $markers . ')'); 
$query->execute($_POST['check_list']); 
+0

Можете ли вы действительно связывать вложенные значения именно так? Вы добавляете часть синтаксиса SQL внутри значения, которое нужно связать, я не уверен, что он работает, и он выглядит грязным, imo. – Virus721

+0

Даже не думал об этом. Приходится делать кое-что в Гоглине. ;) – Damiqib

+0

@Damiqib Привет, спасибо за ваш быстрый ответ. Я пытался реализовать это, но напрасно. Он работает, когда выбран один флажок, но сбой при наличии нескольких вариантов. – ghosh

0

ли что-то вроде этого

where p_location in (the values for your checkboxes) 
+0

Я на самом деле новичок в PHP, и я не в состоянии понять это самостоятельно. Я могу реализовать решение, предложенное вами, когда выбран только один флажок. Тем не менее, я понятия не имею, как я могу сделать то же самое для множественных выборов. – ghosh

+0

На самом деле он имеет в виду что-то вроде этого: где p_location in ('a', 'b', 'c'). Вы можете использовать функцию php join(), чтобы иметь хороший список, разделенный запятыми. – xsign

0

Попробуйте так:

if (empty ($_POST['check_list'])) { 

    $SQLquery = 'SELECT * FROM `people`'; 
    $query = $conn->query($SQLquery); 

} else if (!empty($_POST['check_list'])) { 
    $params = implode(",", array_fill(0, count($_POST['check_list']), "?")); 

    $sql = 'SELECT * FROM `people` WHERE `p_location` IN ($params)'; 

    $stmt = $conn->prepare($sql); 

    $stmt->execute($_POST['check_list']); 
} 
+0

Привет, спасибо за ваш ответ. Однако, похоже, это не работает.Это ошибка, которую я получаю - 'Warning: call_user_func_array() ожидает, что параметр 1 является допустимым обратным вызовом, класс« PDOStatement »не имеет метода« bindparams » – ghosh

+0

Я исправил его и просмотрел обновленный ответ – GBD

+0

@GDB Спасибо за редактирование код. Я попробовал это, он все еще не работает. Тем не менее, решение, предоставленное Damiqib ниже, работает. В любом случае, спасибо за то, что вы приложили усилия и пытаетесь помочь мне. Очень признателен. – ghosh