Я создаю веб-сайт подержанных машин (записанный в PHP), и я застреваю при отправке опций расширенного поиска из формы. У меня есть больше чем 30 из них, и интересно, возможно ли это, и как, для отправки их в одной переменной (например, &options=1,2,3,5,6,10
или некоторый другой путь..).
Также я услышал, что это возможно с "поразрядным", но у меня нет подсказки, как сделать это. Или если у кого-то есть лучшая идея, сообщите мне.
Спасибо.
Вы можете отправить их в виде массива.
<form method="post">
<input type="checkbox" name="param[]" value="blue" />
<input type="checkbox" name="param[]" value="red" />
<input type="checkbox" name="param[]" value="orange" />
<input type="checkbox" name="param[]" value="green" />
<input type="checkbox" name="param[]" value="black" />
<input type="submit" value="Submit" />
</form>
>> $_POST['param']
array('blue', 'orange')
Вы даже можете использовать многомерные массивы:
<form method="post">
<input type="checkbox" name="param[color][]" value="blue" />
<input type="checkbox" name="param[color][]" value="red" />
<input type="checkbox" name="param[color][]" value="orange" />
<input type="checkbox" name="param[color][]" value="green" />
<input type="checkbox" name="param[color][]" value="black" />
<input type="checkbox" name="param[year][]" value="1999" />
<input type="checkbox" name="param[year][]" value="2000" />
<input type="checkbox" name="param[year][]" value="2001" />
<input type="checkbox" name="param[year][]" value="2002" />
<input type="checkbox" name="param[year][]" value="2003" />
<input type="submit" value="Submit" />
</form>
>> $_POST['param']['color']
array('blue', 'green')
>> $_POST['param']['year']
array('2001', '2004')
Вы можете написать сценарий, который перебирает все ваши поля (т.е. флажки), собирает информацию в скрытое поле в точной форме, которую вы представили (1,3 , 5 будет означать, что 1, 3 и 5 отмечены, 2 и 4 не отмечены).
Превращение его в битовое представление сделало бы его более сложным для построения и деконструирования. Например, в предыдущем примере вы можете отправить число 10101 == 17 для обозначения местоположения (т. Е. Местоположения 1 3 5 включены, 2 и 4 выключены). Опять же, не все так просто и не рекомендуется. [Вы также можете отправить двоичное представление, в этом случае вы должны отправить 1000 == 8 == 1 + 3 + 5 ---- еще более сложный]
Поместите их в массив и пропустите их в сценарии, обрабатывающем форму.
<form action="yourscript.php" method="POST">
<label for="option1">Option 1</label>
<input id="option1" type="checkbox" name="option[]" value="option1" />
<label for="option2">Option 2</label>
<input id="option2" type="checkbox" name="option[]" value="option2" />
<label for="option3">Option 3</label>
<input id="option3" type="checkbox" name="option[]" value="option3" />
<input type="submit" name="submit" value=Submit />
</form>
Ключ состоит в том, чтобы поместить значения флажков в массив. option []
Затем в вашем скрипте вы можете получить доступ к массиву и пройти через представленные опции.
if(!empty($_POST['submit']) //process the form
if(!empty($_POST['option']) //check to see if any checkboxes were selected
{
$options = $_POST['option'];
foreach($options as $option) //loop through the checkboxes
{
//do what you need to do with an option
}
}
}
Хорошо, ребята, спасибо всем за ответы. Я придумал решение, использующее jQuery. Я собрал все значения из этих флажков в массиве и назначил этот массив одному скрытому полю. Все эти варианты находятся вне формы и не отправляются.
javascript:
$('.options').click(function() {
var selectedItems = new Array();
$("input:checkbox[name='opt[]']:checked").each(function() {selectedItems.push($(this).val());});
var data = selectedItems.join('|');
$("#opts").val(data);
});
и форма:
<form name="search" method="get" action="blabla.php">
.....
<input type="hidden" name="options" id="opts" value=""/>
....
</form>
и за пределами формы идут все доступные параметры
...
<input type="checkbox" name="opt[]" class="options" value="1"/>
<input type="checkbox" name="opt[]" class="options" value="2"/>
<input type="checkbox" name="opt[]" class="options" value="3"/>
...
Запросы GET генерируют длинные сложные URL-адреса с таким количеством параметров с поведение по умолчанию.
Запросы POST могут оставлять вам короткие URL-адреса, но могут плохо работать с кнопкой «назад» и не подходят для закладок.
Чтобы сгенерировать короткие URL-адреса с помощью GET, вам понадобится либо промежуточный скрипт, который переводит выбранные параметры в более компактный формат, либо вам нужно будет наблюдать за выбранными параметрами с помощью JavaScript и создавать компактный URL-адрес на стороне клиента.
Побитовая математика будет означать присвоение каждого бита или группы битов в одной переменной заданной опции и предопределенному набору значений. Например, 32-битное целое число может представлять 8 атрибутов по 4 бита в каждом:
01010010010001001010101010101001
Или:
0101 0010 0100 0100 1010 1010 1010 1001
#8 #7 #6 #5 #4 #3 #2 #1
Таким образом, одно целое число может представлять восемь атрибутов с 16 возможными значениями на 4-битную группу. Очевидно, это требует доработки, но я уверен, что кто-то из SO уже задавал этот вопрос, и я не собираюсь больше печатать прямо сейчас. :)