No tiene nada aquí que establezca los valores en cero. Las casillas que no están marcadas simplemente estarán ausentes de la matriz $_POST.
Deberá hacer una lista separada de los nombres de todas las casillas de verificación y recorrerlas, comparándolas con la matriz $_POST.
Editar: No iba a escribir ningún código, pero:
$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));
}
Tenga en cuenta que realmente no necesitamos mysql_real_escape_string aquí, ya que sabemos que todos los valores de id son seguros, pero es una buena práctica en caso de que alguien llegue más tarde y despreocupadamente cambie la matriz $allids.
Editar de nuevo: Supongamos que no sabemos qué ID buscar.
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));
}