Во-первых, все ваши поля <input type="checkbox">
имеют одинаковый атрибут name
. Это приводит к отправке нескольких значений с одним и тем же именем (если установлено несколько флажков), из которых PHP использует только последнее для своей коллекции $_POST
.
Чтобы решить эту проблему, дайте им имя "choice[]
" вместо "choice
". Это сигнализирует PHP, что возможны несколько значений, и все они будут доступны в виде массива. Другими словами, вы сможете сделать следующее:
$choices = $_POST['choice'];
foreach ( $choices as $key => $value )
echo "$key => $value";
И это выдаст что-то вроде
0 => 32
1 => 12
2 => 48
Другими словами - вы получаете массив со значениями отмеченных флажков. После этого вы можете делать то, что вам нравится с ними. Например, implode()
их, чтобы получить список через запятую.
Одна вещь, о которой вы должны быть предупреждены, хотя. Он называется «SQL-инъекция» и является распространенной ошибкой неопытных программистов. Идея состоит в том, что злонамеренный пользователь может легко отправлять туда и другие значения, а не только те, которые вы указали в своем HTML. Не требуется много навыков, чтобы подделать HTTP-запрос. Может быть НИЧЕГО от пользователя, поэтому вам следует ВСЕГДА проверить ВСЕ ВХОД , которые вы получаете от пользователя. Не доверяйте никаким проверкам JavaScript, которые вы делаете. Пока это со стороны пользователя - ему нельзя доверять. Когда-либо.
И если вам интересно, как это может быть плохо - подумайте, что произойдет, если вдруг одно из значений в вашем массиве больше не будет 43
, а вместо этого будет "'); DROP DATABASE; --
».
Поскольку вы слепо выполняете запрос типа
INSERT INTO options VALUES('$opt');
Это тогда превратится в
INSERT INTO options VALUES(''); DROP DATABASE; --);
И пока идет ваша база данных. Таким образом, ВСЕГДА убедитесь, что пользовательский ввод соответствует вашим ожиданиям и что для чего-то подобного нет никакой возможности. О, и да - addslashes()
не очень хороший метод, потому что есть способ обойти это. Параметризованные запросы - лучший способ, но если вы не можете использовать это, то, по крайней мере, используйте mysql_real_escape_string()
для MySQL или все, что предлагает ваша СУБД.