Одним из способов решения этой проблемы является использование скрытого поля формы для каждого флажка.
Например
Заменить
<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());
}
Надеюсь, это поможет