Newsgroup: it.comp.www.php
Titolo: Ciclo per controllare delle checkbox

ho un problema col seguente codice (scusate per la leggibilità).
Funziona bene, solo che devo controllare se l'utente ha selezionato più 
di una checkbox e, in tal caso, dare errore.
quindi ho inizializzato $totale=0, e nel foreach incrementato di uno e 
se totale==1 ok, altrimenti redirecta.
non funziona, cioè se seleziono due immagini me le processa tutte e due 
una dopo l'altra...come posso risolvere?
ve lo metto pure qua, se preferite: 
http://www.phpfi.com/118353
grazie mille
else if (isset($_POST['Avatar'])){
   $totale=0;
     foreach ($_POST as $ok => $value){
       if ($value=='on'){
           $totale++;
           if ($totale==1){
             print_r ($_POST);
             $visibilequery = mysql_query('SELECT visibile FROM images 
WHERE imagid = \''.$ok.'\'');
             $visibile=mysql_fetch_array($visibilequery);
             if ($visibile[0]== '0')
 
redirect('profile.php?section=images&amp;id='.$_GET['id'], "Non puoi 
mettere come avatar una immagine non ancora approvata!");
               $extquery =  mysql_query('SELECT estensione FROM images 
WHERE imagid = \''.$ok.'\'');
               $ext=mysql_fetch_array($extquery);
               $avatarqu = mysql_query("SELECT avatar FROM users WHERE 
id = '$_GET[id]'");
               $avatar=mysql_fetch_array($avatarqu);
               if 
(is_file($avatar_dir.'/'.$pun_config['o_avatars_dir'].'/'.$avatar[0]))
 
unlink($avatar_dir.'/'.$pun_config['o_avatars_dir'].'/'.$avatar[0]);
               else
 
redirect('profile.php?section=images&amp;id='.$_GET['id'], "Errore 
nell'aggiornamento dell'avatar");
               if (!@copy 
($upload_dir.'/'.$_GET['id'].'/'.$ok.".".$ext[0], 
$pun_config['o_avatars_dir'].'/'.$_GET['id'].".".$ext[0]))
                 message($lang_profile['Move failed'].' <a 
href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
 
imageavatar($pun_config['o_avatars_dir'].'/'.$_GET['id'].".".$ext[0]);
                 $db->query('UPDATE '.$db->prefix.'users SET 
use_avatar=1 WHERE id='.$_GET['id']) or error('Unable to update avatar 
state', __FILE__, __LINE__, $db->error());
     		        mysql_query("UPDATE users SET 
avatar='".$_GET['id'].".".$ext[0]."' WHERE id='".$_GET['id']."'" );
 
redirect('profile.php?section=images&amp;id='.$_GET['id'], "Avatar 
aggiornato!");
           }
           else
             redirect('profile.php?section=images&amp;id='.$_GET['id'], 
"Hai selezionato 2 o più immagini! Torna indietro e scegline una sola.");
       }
     }
   }

            if ($totale==1){
[..]
prima di controllare se il totale e' '1' forse sarebbe meglio aspettare che
il foreach abbia finito di contare..
(non testato)
foreach ($_POST as $key => $value) {
  if ($value == 'on') {
    $ok = $key;
    $totale++;
  }
}
if ($totale == 1) {
  ...
}
-- 
www.iuz-lab.info

 }
non l'ho capita, soprattutto la riga $ok = $key;

koichirose wrote:

prima di fare il test = '1' devi finire di contare..
quindi..
foreach ($_POST as $value)
  if ($value == 'on')
    $totale++;
if ($totale == '1') {...}
ho visto che pero' nel resto del codice fai riferimento a $ok.. quindi per
non farti cambiare troppo il codice l'ho preservato..
foreach ($_POST as $key => $value) {
  if ($value == 'on') {
    $ok = $key;
    $totale++;
  }
}
adesso hai capito?
-- 
www.iuz-lab.info

 
ma non capisco il cambio di variabile..perchè lo fai?

koichirose wrote:

con..
foreach ($_POST as $ok => $value) ...
se in $_POST c'e' piu' di una variabile, alla fine del ciclo, in $ok ci
finisce l'ultima variabile di $_POST stesso (e non va bene)..
quindi conto quante variabili hanno il valore 'on' e quando ne trovo 1
memorizzo anche il suo valore per preservarlo all'esterno del ciclo..
in questo modo ho il valore che interessa in $ok che combinato alla..
if ($totale == 1) ...
ti dovrebbero generare il comportamento desiderato..
se ti posso dare un consiglio forse e' meglio se riscrivi il codice da capo
rendendolo piu' chiaro e pulito..
-- 
www.iuz-lab.info

 una checkbox e, in tal caso, dare errore.
A parte le questioni relative al codice PHP, mi par di capire che 
l'interfaccia serve a selezionare UNO e un solo avatar tra una lista di 
immagini disponibili.
Per questioni di usabilità è sicuramente meglio sostituire le checkbox con 
dei radiobutton così non devi gestire nulla lato codice ed eviti di far 
tornare indietro l'utente alla pagina precedente per selezionare solo 
un'immagine.
Nello. 

 un'immagine.
si, in molti mi hanno dato questo consiglio, ma ho 2 pulsanti con le 
stesse checkbox: elimina e imposta avatar.
per elimina l'utente ne può scegliere quante vuole, per impostare 
l'avatar invece una sola, per questo lascio solo le checkbox

 ti dovrebbero generare il comportamento desiderato..
$totale=0;
     foreach ($_POST as $key => $value){
       if ($value=='on'){
           $ok=$key;
           $totale++;
           if ($totale==1){
             $visibilequery = mysql_query('SELECT visibile FROM images 
WHERE imagid = \''.$ok.'\'');
//continua a fare tutte le sue cose per aggiornare..
in questo momento ce l'ho così, ma mi permette sempre di scegliere 2 
immagini.
guardando il tuo codice non capisco se chiudi l'if dopo $totale++, 
insomma tutto il resto del codice dove va?
grazie ancora

 grazie ancora
segue un esempio che dovrebbe funzionare salvo errori..
ho spezzato le righe per comodita' di lettura sul newsgroup..
(non testato e decisamente migliorabile)
<?php
if (isset($_POST['Avatar'])) {
  $totale = 0;
  foreach ($_POST as $key => $value) {
    if ($value == 'on') {
      $ok = $key;
      $totale++;
    }
  }
  $redirect_page = "profile.php?section=images&amp;id={$_GET['id']}";
  if ($totale != 1) {
    redirect($redirect_page, "Hai selezionato 0 o più di una immagine!" .
                             "Torna indietro e una sola.");
  }
 
  $images_info = mysql_query("SELECT visibile, estensione " .
                             "FROM images WHERE imagid = '$ok'");
  $visibile    = mysql_result($image_info, 0, 'visible');
  $ext         = mysql_result($image_info, 0, 'estensione');
 
  $avatarqu    = mysql_query("SELECT avatar FROM users " .
                             "WHERE id = '{$_GET['id']}'");
  $avatar      = mysql_result($avatarqu, 0, 'avatar');
 
  $avatar_file = "{$avatar_dir}/{$pun_config['o_avatars_dir']}/{$avatar}";
  $dest_file   = "{$pun_config['o_avatars_dir']}/{$_GET['id']}.{$ext}";
  $src_file    = "{$upload_dir}/{$_GET['id']}/{$ok}.{$ext}";
  if ($visibile == '0') {
    redirect($redirect_page, "Non puoi mettere come avatar una " .
                             "immagine non ancora approvata!");
  }
  if (!(is_file($avatar_file) && @unlink($avatar_file))) {
    redirect($redirect_page, "Errore nell'aggiornamento dell'avatar");
  }
  if (!@copy ($src_file, $dest_file)) {
    message("{$lang_profile['Move failed']} " .
            "<a ref='mailto:{$pun_config['o_admin_email']}'>" .
            "{$pun_config['o_admin_email']}</a>.");
  }
  imageavatar($dest_file);
 
  $db->query("UPDATE {$db->prefix}users SET use_avatar = 1 " .
             "WHERE id = {$_GET['id']}") 
    or error('Unable to update avatar state', 
             __FILE__, __LINE__, $db->error());
 
  mysql_query("UPDATE users SET avatar = '{$_GET['id']}.{$ext}' " .
              "WHERE id = '{$_GET['id']}'");
 
  redirect($redirect_page, "Avatar aggiornato!");
}
?>
-- 
www.iuz-lab.info

 
ah ok, quindi chiudevi qui il ciclo..
se hai voglia mi puoi spiegare l'errore che facevo all'inizio?
io pensavo funzionasse come un while, quindi primo ciclo setta l'avatar 
e $totale++ (quindi =1), secondo ciclo $totale==1, esci.
il problema sarebbe stato che comunque la prima immagine l'avrebbe messa 
come avatar, alla seconda avrebbe dato errore, quindi l'utente si 
sarebbe ritrovato con l'avatar cambiato ma con un errore quindi, 
presumibilmente, l'avrebbe cambiato di nuovo scegliendone uno solo..però 
non dava neppure l'errore!

 non dava neppure l'errore!
probabilmente lo dava (redirect() permettendo) ma non lo vedevi.. prova a
passare due valori 'on' tramite post da telnet ed esamina il risultato..
-- 
www.iuz-lab.info

 successo) lo ignora..
mi son guardato la funzione redirect e, dopo aver settato il template 
per la pag di redirect e altre cose fa una exit, quindi suppongo che non 
esegua tutto il codice seguente..comunque grazie mille ora funziona :)