php массив флажков - PullRequest
       3

php массив флажков

1 голос
/ 05 июля 2011

В списке продуктов и рядом с каждым у меня есть флажок «[] для каждого», чтобы указать наличие.

$listvals=$_POST['avail'];
$n=count($listvals);

for($i=0; $i<count($_POST['avail']); $i++) {
        $avail= ($listvals[$i]<>'' ? 1 : 0);
    $query_update = "update products set avail=$avail where id ='".$listvals[$i]."'";
    $update = mysql_query($query_update, $connection) or die(mysql_error());
}

Пока все в порядке, когда дело доходит до проверки выбранных продуктов как доступных с помощью следующего запроса на обновление, но когда я хочу отменить выбор продукта (чтобы пометить его как недоступный), он игнорирует продукты, потому что, очевидно, $_POST значение равно нулю / нулю. Как мне обрабатывать массив флажков в этом случае?

Ответы [ 4 ]

2 голосов
/ 05 июля 2011

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

Например

Заменить

<input name="avail[<?php echo $product_id?>]" type="checkbox" value="1" />

С

<input name="avail[<?php echo $product_id?>]" type="hidden" value="0" />
<input name="avail[<?php echo $product_id?>]" type="checkbox" value="1" />

Таким образом, вы обязательно получите 0 или 1, возвращенные в вашем массиве. Если этот флажок установлен, вы получите 1. В противном случае по умолчанию будет установлено значение скрытого поля - 0. Обратите внимание, что это будет работать, только если вы используете фиксированные индексы для массива. Другими словами

<input name="avail[]" type="hidden" value="0" />
<input name="avail[]" type="checkbox" value="1" />

Не будет работать, потому что он добавит обе опции в массив.

Обновление: добавлено для уточнения

Затем вы можете немного изменить свой php, например:

$listvals=$_POST['avail'];

foreach($listvals as $product_id => $available) {
    $query_update = "update products set avail=$available where id ='".$product_id."'";
    $update = mysql_query($query_update, $connection) or die(mysql_error());
}

Возможно, более простой метод, если вы ищете только продукты, отмеченные галочкой, чтобы быть доступными, - это запустить другой сценарий sql заранее, чтобы установить доступность 0 / false / null для всех - по сути, сделать все ваши продукты недоступными, а затем повторно добавьте правильные.

Быстрый грубый и готовый вариант:

$listvals=$_POST['avail'];
$n=count($listvals);

/*
 * add this
 */
mysql_query('update products set avail = 0');

for($i=0; $i<count($_POST['avail']); $i++) {
        $avail= ($listvals[$i]<>'' ? 1 : 0);
    $query_update = "update products set avail=$avail where id ='".$listvals[$i]."'";
    $update = mysql_query($query_update, $connection) or die(mysql_error());
}

Надеюсь, это поможет

0 голосов
/ 15 января 2017

Хорошо, этот выбранный ответ не удовлетворял моим потребностям по причинам, по которым я не буду вдаваться, но то, что сработало для моих целей, таково:

 <input type="checkbox" value="'.$x.'" name="sent[]" /> 

Затем в цикле, который проверяет кучу вещей, которые япросто спросите:

if (in_array ($x, $thesentarray)) { /* Now I know x is one of the checked */ }

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

Надеюсь, этот ответ кому-нибудь поможет

0 голосов
/ 05 июля 2011
  1. Вы можете создать ассоциативный массив JavaScript с идентификатором и статусом, который можно изменять при каждом изменении и публиковать обратно.

  2. В противном случае используйте скрытые поля для установки значений (скрытые поля ввода со всеми значениями, установленными в 1, если все выбраны по умолчанию, когда пользователь снял отметку с любой строки, установите скрытое значение ввода в 0)

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

0 голосов
/ 05 июля 2011

На мой взгляд, самым простым способом было бы установить доступность null для всех продуктов с соответствующим id, а затем обновить доступность до true/1 для продуктов, которые у вас есть в $_POST. Альтернатива этому должна была бы сравнить ранее выбранные продукты с недавно выбранными продуктами. Исходя из опыта, это требует больше тестирования и больше кода и, следовательно, больше, чем может пойти не так.

Edit:

Итак, я предполагаю, что пользователь может установить один или несколько флажков в HTML <form>, который передается на страницу PHP, которая обрабатывает форму и обновляет несколько строк в таблице products (по одному для каждого флажка). Таким образом, пользователь проверяет 4 из 6 полей, чтобы вы обновили 4 строки из 6 до true или 1. Если на следующей странице загрузки пользователь отменяет выбор продукта, страница PHP теперь получает 3 проверенных продуктов. Проблема в том, как узнать, какой из них был отменен, поскольку его нет в $_POST. Поэтому самое простое решение - обновить таблицу products и установить avail на null для всех продуктов в виде отдельного запроса, а затем выполнить существующий код, который у вас есть в вопросе, чтобы обновить только проверенные продукты до true снова.

Edit2: Правильно, если предположить, что вы потенциально обновляете до 40 продуктов за раз, как насчет того, чтобы просто null использовать любые 40 на странице, которая отправляется?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...