Checkbox

minatore

Utente Attivo
25 Set 2007
410
0
0

Ciao a tutti, ho un problemino nel visualizzare delle checkbox, vi spiego
ho un db con la tabella pippo, in questa tabella c'è un campo optional, con all'interno
testo1,testo2,testo3
poi ho un array formato cosi
PHP:
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8', 'testo9', 'testo10');
quello che vorrei a vederlo sembra semplice, ma a farlo ho avuto enormi difficoltà.
Dovrei visualizzare tante check quanto è lungo l'array, ma checcate solo quelle presenti nella tabella pippo, ho provato con explode, ma questa funzione fatta semplice mi riesce, ma quando la riporto nel pezzo di codice che vi mostro non ne vuole sapere
Grazie in anticipo
PHP:
[FONT="Garamond"]
//Nella cella optional della tabella pippo ho testo1,testo2,testo3
$query_estr=mysql_query("SELECT * From pippo")
or die("errore nella query;".mysql_error());
$ultimo=mysql_fetch_object($query_estr);
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8', 'testo9', 'testo10');
$riga=1;
print"
<table cellpadding='0' cellspacing='0' border='0'>";
for($f=0; $f<count($a_optional); $f++)
 {
  if($riga == 1)
   {
    print"<tr>"; 
   }
    print"
     <td width='200' class='testo'>
      <input type='checkbox' name='$f'>$a_optional[$f]
     </td>";
     $riga++;
  if($riga > 2)
   {
    print"</tr>";
    $riga=1; 
   }
 }
print"
</table>";  
[/FONT]
 
ciao
da quello che ho capito vorresti che venissero ceccate solo le cb che hanno la voce uguale tra
array e la tabella? giusto?
se è così prova:
PHP:
<?php
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8', 'testo9', 'testo10'); 
$chek="";
for($f=0; $f<count($a_optional); $f++){
	$pari=mysql_num_rows(mysql_query("SELECT optional FROM pippo WHERE optional='".$a_optional[$f]."'"));
	if($pari==0){//non c'è corrispondenza tra array e tabella
		$chek="";//cb non ceccata
	}else{//c'è corrispondenza
		$chek="checked";//cb ceccata
	}
	echo "<input type='checkbox' name='$f' $chek>".$a_optional[$f];
}
?>
questo se ho capito bene.
cioè le cb vengono ceccate solo se quanto scritto nell'array esiste anche nella tabella
se ho capito male eventualmente spiega meglio

p.s.
a sistemare le righe ci pensi tu
 

Ciao e grazie per la risposta, mi spiego meglio
Nel campo optional ho 3 voci
Codice:
testo1,testo2,testo3
proprio come sono scritti, separati dalla virgola.
Poi invece ho l'array cosi scritto
Codice:
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8', 'testo9', 'testo10');

La cosa da fare è visualizzare check per quanto è lungo l'array, quindi visualizzero come prima cosa 10 check non checcate, poi però devo fare una verifica con quello che ho in tabella, e questo porterà la visualizzazione che su 10 check 3 saranno checcate e 7 non checcate
Penso di aver espresso bene il caso

Grazie:hammer:
 
ciao
sempre se ho capito bene estrai dalla tabella pippo il campo optional, ma la tabella pippo ha diversi record?
e se si in ciascun record i valori del campo possono essere diversi? ho hai un record solo?
perchè se sono diversi nella query ci vorrebbe come minimo una condizione WHERE.
comunque facciamo l'ipotesi di un solo record
PHP:
<?php
//estrai il campo optional
$opz=mysql_fetch_array(mysql_query("SELECT optional FROM pippo"));
//esplodo il campo 
$opzioni=explode(",",$opz['optional']);//$opzioni è un array
//queste sono le opzioni per le cb
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8', 'testo9', 'testo10');  
//setto comunque la variabile di chek
$chek="";
//ciclo $a_optional
$f=0;
foreach($a_optional as $valore){
	if(in_array($valore, $opzioni)){//verifico che ci sia 
		$chek="checked";
	}else{
		$chek="";
	}
	echo "<input type='checkbox' name='$f' $chek>".$a_optional[$f];
	$f++;
}
?>
 
Borgo grazie per il tuo impegno, ma non è così
con il tuo script come risultato ho 10 check non checcate
invece ne dovrei avere su 10 3 checcate e 7 non checcate

Grazie
 
ciao
se è questo quello che vuoi
ceccate.jpg


lo script che ti ho postato prima funzia (vedi quello che ho messo in $opz)
l'ho provato con il seguente perchè non avevo voglia di fare il db+tabella, ma il concetto è lo stesso

PHP:
<?php 
//estrai il campo optional 
//$opz=mysql_fetch_array(mysql_query("SELECT optional FROM pippo")); 
//esplodo il campo 
$opz="testo4,testo7,testo8";

$opzioni=explode(",",$opz);//$opzioni è un array 
//queste sono le opzioni per le cb 
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8', 'testo9', 'testo10');   
//setto comunque la variabile di chek 
$chek=""; 
//ciclo $a_optional 
$f=0; 
foreach($a_optional as $valore){ 
    if(in_array($valore, $opzioni)){//verifico che ci sia  
        $chek="checked"; 
    }else{ 
        $chek=""; 
    } 
    echo "<input type='checkbox' name='$f' $chek>".$a_optional[$f]."<br>"; 
    $f++; 
} 
?>
stai attento che i valori del campo optional siano scritto uguali a quelle in $a_optional maiuscole, minuscole, senza spazi...
 

E' vai
Hai capito ciò che volevo
grazie adesso devo solo adattarlo al mio codice
Grazie borgo
 

Ciao borgo, lo sapevo che non era facile per me
mi daresti una mano ad inserirlo nel mio script?
sono arrivato a questo
PHP:
$query_estr=mysql_query("SELECT * From pippo")
or die("errore nella query;".mysql_error());
$ultimo=mysql_fetch_object($query_estr);
//print $ultimo->optional; qua dentro ho i valori della tabella
$oper=explode(',',$ultimo->optional);
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8');

$riga=1;
$check="";
print"
<table cellpadding='0' cellspacing='0' border='0' bordercolor='#23D527'>";
for($f=0; $f<count($a_optional); $f++)
	{
		if($riga == 1)
			{
				print"<tr>";	
			}
				print"
					<td width='200' class='testo'>
						<input type='checkbox' name='$f'>$a_optional[$f]
					</td>";
					$riga++;
		if($riga > 2)
			{
				print"</tr>";
				$riga=1;	
			}
	}
print"
</table>";
 

Allegati

  • Senza titolo-1.jpg
    Senza titolo-1.jpg
    35,2 KB · Visite: 151
Ultima modifica:
Ciao borgo o provato a fare una cosa del genere ma da errore alla riga dove faccio il confronto
PHP:
$query_estr=mysql_query("SELECT * From pippo")
or die("errore nella query;".mysql_error());
$ultimo=mysql_fetch_object($query_estr);
//print $ultimo->optional;  qua dentro ho testo1,testo2,testo3
$oper=explode(',',$ultimo->optional);
for($i=0; $i<count($oper); $i++)
{
	print $oper[$i]; //qua dentro c'è scritto testo1testo2testo3
}

$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8');
$check="";
$riga=1;
print"
<table cellpadding='0' cellspacing='0' border='0' bordercolor='#23D527'>";
for($f=0; $f<count($a_optional); $f++)
	{
		if($oper[$i]==$a_optional[$f])//qua da errore
			{
				$check="checked";
			}
		else
			{
				$check="";
			}
		if($riga == 1)
			{
				print"<tr>";	
			}
				print"
					<td width='200' class='testo'>
						<input type='checkbox' name='$f' $check>$a_optional[$f]
					</td>";
					$riga++;
		if($riga > 2)
			{
				print"</tr>";
				$riga=1;	
			}
	}
print"
</table>";
 
ciao
ecco (SEO cioè salvo errori e ommissioni)

PHP:
<?php
$query_estr=mysql_query("SELECT * From pippo") 
or die("errore nella query;".mysql_error()); 
$ultimo=mysql_fetch_object($query_estr); 
//print $ultimo->optional; qua dentro ho i valori della tabella 
$oper=explode(',',$ultimo->optional); 
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8'); 

$riga=1;//vedi MA A CHE...
$check=""; 
print "<table cellpadding='0' cellspacing='0' border='0' bordercolor='#23D527'>";
//usa il foreach al posto del for per estrarre meglio i valori
$f=0;//metto a zero il contatore
// poi uso echo al posto di print che mi trovo meglio
//e poi metto i doppi apici sempre perche mi trovo meglio
foreach($a_optional as $valore){
	if($riga == 1){echo "<tr>";}//MA A CHE TI SERVE? stampi un <tr> ad ogni cb
	//qui fai il controllo della corrispondenza
	if(in_array($valore, $oper)){//verifico che ci sia  
        $chek="checked"; 
    }else{ 
        $chek=""; 
    } 
	echo "<td width=\"200\" class=\"testo\"><input type=\"checkbox\" name=\"$f\" $check >$a_optional[$f]</td>";
	if($riga > 2){print"</tr>";$riga=1;}//MA A CHE TI SERVE? stampi un </tr> ad ogni cb
	//incremento il contatore
	$f++;
}
print "</table>";
?>
dato che come fai tu crei una tabella ad una colonna e 10 righe puoi semplificare eliminando
$riga=1;
i due if($riga...
e scrivere la riga con le cb
PHP:
//.....
echo "<tr><td width=\"200\" class=\"testo\"><input type=\"checkbox\" name=\"$f\" $check >$a_optional[$f]</td></tr>";
//....
p.s.
leggi i commenti che ho inserito (poi li togli)
 
Ciao borgo e grazie adesso provo, quella variabile riga che vedi mi serve per ottenere questo ti invio immagine
 

Allegati

  • Senza titolo-1.jpg
    Senza titolo-1.jpg
    35,2 KB · Visite: 94
Ciao borgo diciamo che ci sarei quasi (penso)
daresti una guardatina a questo codice
PHP:
$query_estr=mysql_query("SELECT * From pippo")
or die("errore nella query;".mysql_error());
$ultimo=mysql_fetch_object($query_estr);
//print $ultimo->optional;  qua dentro ho testo1,testo2,testo3
$oper=explode(',',$ultimo->optional);
for($i=0; $i<count($oper); $i++)
{
	//print $oper[$i]; //qua dentro c'è scritto testo1testo2testo3
	$western=$oper[$i];
	//print $western; //qua dentro c'è scritto testo1testo2testo3
}

$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8');
$check="";
$riga=1;
print"
<table cellpadding='0' cellspacing='0' border='0' bordercolor='#23D527'>";
for($f=0; $f<count($a_optional); $f++)
	{
		if($western == $a_optional[$f])
		{$check='checked';}
		else{$check="";}
		if($riga == 1)
			{
				print"<tr>";	
			}
				print"
					<td width='200' class='testo'>
						<input type='checkbox' name='$f' $check>$a_optional[$f]
					</td>";
					$riga++;
		if($riga > 2)
			{
				print"</tr>";
				$riga=1;	
			}
	}
print"
</table>";

Da quello che ho potuto capire mi checca solo l'ultimo dato nel campo optional, quindi penso di dover fare un ciclo per prendere anche gli altri (Giusto?)
ti posto la foto per il risultato che ho avuto
Ciao
 

Allegati

  • 23.jpg
    23.jpg
    31,5 KB · Visite: 107
Ultima modifica:
ciao
prima impressione poi guardo meglio.
se fai così


PHP:
for($i=0; $i<count($oper); $i++) 
{ 
    //print $oper[$i]; //qua dentro c'è scritto testo1testo2testo3 
    $western=$oper[$i]; 
    //print $western; //qua dentro c'è scritto testo1testo2testo3 
}
in $western, all'uscita dal for, avrai solo l'ultimo valore e cioè testo3
 
ciao
prova così
togli quel ciclo
for($i=0; $i<count($oper); $i++).......
relativo a $western
poi al posto di
PHP:
<?php
//....
	if($western == $a_optional[$f]){
        {$check='checked';} 
        else{$check="";} 
//...
?>
inserisci questo
PHP:
<?php
//.....
		foreach($oper as $valore){//$valore cambia ad ogni giro 
			if(in_array($valore, $a_optional)){//se trovato
				$check='checked';//se trovato setta a checked
				break;//se trovato esce dal ciclo quindi $check rimane settato a checked
			}else{//se non trovato
				$check='';//se non trovato rimane vuoto
			}
		}
//.....
?>
prova e sappimi dire
 
Ciao borgo, qualcosa non va, me li checca tutti
ti posto immagine ed il codice
PHP:
$query_estr=mysql_query("SELECT * From pippo")
or die("errore nella query;".mysql_error());
$ultimo=mysql_fetch_object($query_estr);
$oper=explode(',',$ultimo->optional);
$a_optional=array('testo1', 'testo2', 'testo3', 'testo4', 'testo5', 'testo6', 'testo7', 'testo8');
$check="";
$riga=1;
print"
<table cellpadding='0' cellspacing='0' border='0' bordercolor='#23D527'>";
for($f=0; $f<count($a_optional); $f++)
	{
		 foreach($oper as $valore){//$valore cambia ad ogni giro  
            if(in_array($valore, $a_optional)){//se trovato 
                $check='checked';//se trovato setta a checked 
                break;//se trovato esce dal ciclo quindi $check rimane settato a checked 
            }else{//se non trovato 
                $check='';//se non trovato rimane vuoto 
            } 
        } 
		if($riga == 1)
			{
				print"<tr>";	
			}
				print"
					<td width='200' class='testo'>
						<input type='checkbox' name='$f' $check>$a_optional[$f]
					</td>";
					$riga++;
		if($riga > 2)
			{
				print"</tr>";
				$riga=1;	
			}
	}
print"
</table>";

Gazie per l'aiuto
 

Allegati

  • 23.jpg
    23.jpg
    34,3 KB · Visite: 106
Grazie borgo finalmente ci siamo, ho dovuto fare una piccola aggiunta al tuo script
e va benissimo ti posto il pezzo
PHP:
foreach($oper as $valore){//$valore cambia ad ogni giro  
            if($valore == $a_optional[$f]){//se trovato 
                $check='checked';//se trovato setta a checked 
                break;//se trovato esce dal ciclo quindi $check rimane settato a checked 
            }else{//se non trovato 
                $check='';//se non trovato rimane vuoto 
            } 
        }

Grazie per il tuo preziosissimo aiuto
 
ciao
strano che ti dia 8 volte testo1
per prima cosa prova un var dump
PHP:
<?php
//......
$ultimo=mysql_fetch_object($query_estr); 
$oper=explode(',',$ultimo->optional);
var_dump($oper);
//.....
?>
dovrebbe dari qualcosa di simile
array (3){[0]->"testo1", [1]->"testo2", [2]->"testo3"}
se non te lo da l'errore è li,
sei sicuro che il valore di $ultimo sia sempre del tipo testo,testo,testo separato da virgole?
perche se non è così l'esplode non funzia e quindi $oper non diventa un array con conseguenze sul foreach
poi per tutti ceccati hai ragione (sight)
metti subito prima del foreach il vuotamento del $check ed eventualmente una verifica su $oper
PHP:
<?php
//.............
for($f=0; $f<count($a_optional); $f++) 
    { 
         $check='';
		 if(is_array($oper)){
		 	foreach($oper as $valore){//$valore cambia ad ogni giro   
            	if(in_array($valore, $a_optional)){//se trovato  
                	$check='checked';//se trovato setta a checked  
                	break;//se trovato esce dal ciclo quindi $check rimane settato a checked  
            	}else{//se non trovato  
                	$check='';//se non trovato rimane vuoto  
            	}  
        	} 
		}//fine verifica se array 
	//....
}
?>
p.s.
il primo script che ti avevo inviato funziava (a parte $riga) perchè non usi quello aggiungendo la parte di $riga?
 
ciao
strano che ti dia 8 volte testo1
per prima cosa prova un var dump
PHP:
<?php
//......
$ultimo=mysql_fetch_object($query_estr); 
$oper=explode(',',$ultimo->optional);
var_dump($oper);
//.....
?>
dovrebbe dari qualcosa di simile
array (3){[0]->"testo1", [1]->"testo2", [2]->"testo3"}
se non te lo da l'errore è li,
sei sicuro che il valore di $ultimo sia sempre del tipo testo,testo,testo separato da virgole?
perche se non è così l'esplode non funzia e quindi $oper non diventa un array con conseguenze sul foreach
poi per tutti ceccati hai ragione (sight)
metti subito prima del foreach il vuotamento del $check ed eventualmente una verifica su $oper
PHP:
<?php
//.............
for($f=0; $f<count($a_optional); $f++) 
    { 
         $check='';
		 if(is_array($oper)){
		 	foreach($oper as $valore){//$valore cambia ad ogni giro   
            	if(in_array($valore, $a_optional)){//se trovato  
                	$check='checked';//se trovato setta a checked  
                	break;//se trovato esce dal ciclo quindi $check rimane settato a checked  
            	}else{//se non trovato  
                	$check='';//se non trovato rimane vuoto  
            	}  
        	} 
		}//fine verifica se array 
	//....
}
?>
p.s.
il primo script che ti avevo inviato funziava (a parte $riga) perchè non usi quello aggiungendo la parte di $riga?

Ho eliminato il messaggio, avevo sbagliato io
Grazie
 

Discussioni simili