Non hai nulla qui che imposta i valori su zero. Le caselle che non sono selezionate saranno semplicemente assenti dall'array $_POST.
Dovrai creare un elenco separato dei nomi di tutte le caselle di controllo e scorrere quelle, confrontandole con l'array $_POST.
Modifica: Non avrei scritto alcun codice, ma:
$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));
}
Nota che non abbiamo davvero bisogno di mysql_real_escape_string qui poiché sappiamo che tutti i valori id sono sicuri, ma è una buona pratica nel caso qualcuno arrivi più tardi e modifichi con noncuranza l'array $ allids.
Modifica di nuovo: Supponiamo di non sapere quali ID cercare.
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));
}