Du har inget här som sätter värdena till noll. Rutor som inte är markerade kommer helt enkelt att saknas från $_POST-matrisen.
Du måste göra en separat lista över namnen på alla kryssrutor och bläddra igenom dem och jämföra dem med $_POST-matrisen.
Redigera: Tänkte inte skriva någon kod, men:
$allids = array('id1','id2','id3');
foreach ($allids as $oneid) {
$val = (int) isset($_POST[$oneid]); // will be 0 or 1
mysql_query("UPDATE istable SET showPP = $val WHERE id = ".mysql_real_escape_string($oneid));
}
Observera att vi egentligen inte behöver mysql_real_escape_string här eftersom vi vet att alla id-värden är säkra, men det är bra praxis ifall någon kommer senare och slarvigt ändrar $allids-arrayen.
Redigera igen: Anta att vi inte vet vilka id vi ska leta efter.
mysql_query("UPDATE istable SET showPP = 0");
foreach ($_POST as $oneid=>$nothing) {
mysql_query("UPDATE istable SET showPP = 1 WHERE id = ".mysql_real_escape_string($oneid));
}