Você não tem nada aqui que defina os valores para zero. As caixas que não são marcadas simplesmente estarão ausentes do array $_POST.
Você precisará fazer uma lista separada dos nomes de todas as caixas de seleção e percorrê-las, comparando-as com o array $_POST.
Editar: Não ia escrever nenhum código, mas:
$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));
}
Observe que não precisamos realmente do mysql_real_escape_string aqui, pois sabemos que todos os valores de id são seguros, mas é uma boa prática caso alguém apareça mais tarde e altere descuidadamente o array $ allids.
Editar novamente: Suponha que não sabemos quais IDs procurar.
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));
}