[PHP - RISOLTO] Tabella dinamica: colonne selezionate da checkbox

username90

Nuovo Utente
27 Ott 2016
29
0
1
34
Buonasera, ho creato un form in cui una volta selazionato un redattore e filtrato ciò che vorrei vedere di una tabella, dovrei ottenere appunto una tabella i cui campi sono quelli che ho selezionato usando i checkbox. Dalla foto capirete subito. non so come ottenere la tabella, cioè una volta cliccato su Visualizza si dovrebbe aprire una pagina che contiene i risultati filtrati. Mi potreste dare qualche idea su come procedere. vi posto la porzione del codice del mio form.
HTML:
<form name="form1" enctype="multipart/form-data" method="post" action="stampa.php">
   <table align="center" width="80%">
      <tr><td colspan='4' align="center"><b>Elenco ricette per redattore</b></td></tr>
      <tr><td colspan='4'><b>Elenco ricette in archivio validate da un redattore e possibilita' di selezionare i campi da mostrare tra quelli disponibili.</b></td></tr>
      <tr><td colspan='4'>&nbsp;</td></tr>
     <tr valign="middle">
         <td align="right"><label for="redattore">Redattore:</label></td>
         <td>
            <select name="redattore" id="redattore">

           <option value="">seleziona</option>
           <?php
           
           $sql = "select * from redattore where caporedattore=0 order by cognome asc";

           $result = mysql_query($sql);

           while ($row = mysql_fetch_assoc($result)){  ?>

           <option value="<?php echo $row['matricola'] ?>"><?php echo $row['cognome']." ".$row['nome'];  ?></option>

           <?php }  ?>

           </select>
         </td>
         <td align="right">Campi da Visualizzare</td>
         <td>   <input type="checkbox" name=fields[] value="Tipologia" checked>Tipologia<br>
               <input type="checkbox" name=fields[] value="Nome" checked>Nome ricetta<br>
               <input type="checkbox" name=fields[] value="Porzioni" checked>Porzioni<br>
               <input type="checkbox" name=fields[] value="Calorie" checked>Calorie<br>
               <input type="checkbox" name=fields[] value="Tempo" checked>Tempo cottura/preparazione<br>
               <input type="checkbox" name=fields[] value="Difficolta" checked>Difficolta<br>
               <input type="checkbox" name=fields[] value="Note" checked>Note<br>
               <input type="checkbox" name=fields[] value="Preparazione" checked>Preparazione<br>
           </td>
     </tr>
      <tr><td colspan='4'>&nbsp;</td></tr>     
     <tr><td colspan='4'align='center'>
             <input type="submit" name="cerca" value="Visualizza">
     </td></tr>
      <tr><td colspan='4'>&nbsp;</td></tr>
   </table></p>
</form>
 

Allegati

  • Immagine.jpg
    Immagine.jpg
    46,4 KB · Visite: 631
Ciao,
faccio qualche prova e ti faccio sapere. Se non ho capito male tu vorresti visualizzare solo le ricette di un particolare relatore e solo i campi selezionati. Giusto ?? Come detto faccio qualche prova. Ciao

Zorro
 
  • Like
Reactions: username90
ciao
mi intrometto, ma secondo me (può essere che mi sbagli) ma non si capisce bene la relazione che c'è tra il value delle
checkbox e quanto può essere contenuto nella tabella del db, esempio: esiste un campo chiamato pinco che contenga il valore 'nome'? o 'nome' è il nome del campo? c'è una bella differenza tra le due cose.
prendiamo ad es. che sia selezionata la chek
<input type="checkbox" name=fields[] value="Nome" checked>Nome ricetta<br>
nella parte php ne leggerò il valore
PHP:
//.....
$nome=$_POST['fields[1]'];//ho messo 1, ma dipenderà da quante chek vengono selezionate
//...
e sin qui non ci piove
nel primo caso (campo chiamato pinco la query sarà del tipo
PHP:
$query="SELECT * FROM tabella WHERE pinco='$nome'";
cioè cerco i record con pinco=nome
nel secondo caso estraggo tutti i campi nome
PHP:
$query="SELECT $nome FROM tabella";
quindi il tutto mi sembra un pochettino confuso
 
Si quello che ha scritto Zorro è proprio quello che devo fare. Seleziono il relatore e poi seleziono ciò che voglio vedere,es se voglio vedere solo il nome e la tipologia seleziono solo i relativi checkbox...
 
Il valore che ho assegnato a ciascun value, quello dopo = e scritto tra doppi apici (Nome, Tipologia, ecc) sono proprio i nomi che ho dato alle varie colonne che formano la tabella ricetta nel mio database.
 
ciao
scusa avevo capito male
PHP:
$matricola=$_POST['redattore'];
$wh="";
if(!empty($matricola)){
    $wh=" WHERE matricola='".$matricola."'";//se $matricola è un numero intero gli apici non ci vogliono
}
if(is_array($_POST['fields'])){
    $campi=implode(",",$_POST['fields']);
}else{
    $campi="*";
}
$query= "SELECT $campi FROM tabella $wh";
//...
 
  • Like
Reactions: username90
Ciao username90,
una cosa non ho capito: nel form i campi sono già tutti selezionati (ho visto che hai messo 'checked' a tutti) e l'utente eventualmente deseleziona quelli che non gli interessano oppure sono deselezionati e l'utente seleziona solo quelli che gli interessano?
 
  • Like
Reactions: username90
Si li ho messi già tutti selezionati ed eventualmente l'utente deseleziona quelli che non gli interessano
 
Allora ragazzi, ho lavorato un pò sul codice che mi ha postato Borgo Italia, ora vi mostro qui di seguito cosa ho fatto; il codice è commentato così capite le istruzioni che ho fatto. Mi da un errore di warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given. Mi potete aiutare a risolvere dove sbaglio? grazie

PHP:
 <?php
 $matricola=$_POST['redattore'];
$wh="";
if(!empty($matricola)){
    $wh=" WHERE matricola='".$matricola."'";//se $matricola è un numero intero gli apici non ci vogliono
}
if(is_array($_POST['fields'])){
   $campi=implode(", ",$_POST['fields']);
   echo "i campi selezionati sono: " .$campi."<br/>"; //istruzione poi da cancellare, è stata scritta solo per vedere se visualizzo correttamente i nomi dei campi selezionati
   $temp=explode(",", $campi); //questa istruzione è stata fatta per contare il numero dei campi altrimenti non sapevo come fare
   $ncampi=count($temp);//ottengo il numero dei campi selezionato
   echo "numero campi selezionati ".$ncampi; //istruzione poi da cancellare
}else{
    $campi="*";
}
$query= "SELECT $campi FROM viewselettiva $wh"; //viewselettiva è il nome della tabella dove trovo tutte le info.
$res=mysql_query($query);
$output=""; //serve per stampare la tabella finale con i risultati
echo "<p><table align=\"center\" width=\"80%\" border=\"1\">";
   echo "<tr>";
   for ($i=0; $i<$ncampi; $i++){
       echo "<th align=\"center\"><strong>".$temp[$i]."</strong></th>"; //visualizzo i nomi dei campi selezionati e li formatto ognuno in una colonna
   }
   echo"</tr>";
   $j=0; // da qui non so cosa sbaglio, vorrei "scorrere" campo per campo ogni record trovato e visualizzarlo nelle apposite righe e colonne.
   while ($row=mysql_fetch_assoc($res) && $j<$ncampi){
       $output .="<tr>";
       $output.="<td>".$row[$j]."</td>";
       if ($j==($ncampi-1)) $output.="</tr>";
       else $j++;
   }
   echo $output;
   echo "</table>";
 ?>
 
ciao
mysql_fetch_assoc pretende che rows abbia una chiave associativa (es, $rows['Porzioni']) e non vettoriale (es. $rows[3])
prova a correggere così, non posso dirti se funziona perche non posso provarlo
PHP:
//.....
$j=0;
while ($row=mysql_fetch_assoc($res)){
    if($j==0){
        $output="<tr>";
    }
    $output.="<td>".$row[$campi[$j]]."</td>";
    if ($j==($ncampi-1)){
        $output.="</tr>";
        $j=0;
    }else{
        $j++;
    }
}
//...
prova e sappimi dire
 
ciao
scusa una cosa riguardando, a parte il $rows, perchè fai tutto quell'ambaradan con $output?
PHP:
//.....
$j=0;
while ($row=mysql_fetch_assoc($res)){
    if($j==0){
        echo "<tr>";
    }
    echo="<td>".$row[$campi[$j]]."</td>";
    if ($j==($ncampi-1)){
        echo ="</tr>";
        $j=0;
    }else{
        $j++;
    }
}
//...
 
pensavo di usare $output come variabile stringa che alla fine mostra tutto il contenuto della tabella. cioè è come se fosse echo "stringa con tutto il contenuto". Però non sono molto convinta che possa essermi utile questa variabile $output, non mi vengono in mente altre idee.
 
ciao
verifica la query e il collagamento
PHP:
//....
$query= "SELECT $campi FROM viewselettiva $wh"; //viewselettiva è il nome della tabella dove trovo tutte le info.
var_dump($query);//verifica che la quary sia scritta come deve essere
$res=mysql_query($query);
var_dump($res);//verifichi che funzioni, se sì deve darti RESOURCE.. , se no bool(FALSE)
//....
 
ecco il risultato del var_dump: string(160) "SELECT Tipologia, Nome, Porzioni, Calorie, Tempo, Difficolta, Note, Preparazione FROM ricetta, valida WHERE valida.redattore='3' AND valida.ricetta=ricetta.id_ricetta" bool(false)

ho corretto il from perchè le tabelle esatte che interessano la query sono appunto valida e ricetta: valida è una tabella con il seguente schema (redattore, ricetta, idonea, pubblicata) redattore è una foreign key, così come ricetta. Lo schema di ricetta è (id_ricetta, tipologia, utente, nome, porzioni, calorie, cottura, difficolta, preparazione, note).
 
aspetta.
o_O Sono andata a rivedere per l'ennesima volta le tabelle nel database. Era giusto il from con viewselettiva perchè io infatti avevo creato la vista con quel nome apposta perchè forniva una visione più completa delle ricette e dei redattori e per eseguire le query per questa operazione. La vista viewselettiva è formata dalle seguenti colonne (ID, Tipologia, Nome, Preparazioni, Porzioni, Calorie, Tempo, Diffocoltà, Ingredienti, Note, Redattore).

Detto ciò ho eseguito la query "SELECT $campi FROM viewselettiva WHERE redattore='".$matricola."' e ho provato a fare anche il var_dump della query per testarla, il risultato è questo string(120) "SELECT Tipologia, Nome, Porzioni, Calorie, Tempo, Difficolta, Note, Preparazione FROM viewselettiva WHERE redattore='3'" resource(7) of type (mysql result).
 
ciao
da quello che vedo la query sembrerebbe scritta giusta e trova la tabella (resource(7) of type (mysql result)), quindi il $row=mysql_fetch_assoc($res) dovrebbe funzionare, c'è qualcosa che non hai postato tra il $res e il fetch?
poi nei tuoi ultimi due post scrivi ...FROM ricetta, valida... e nell'altro ...FROM viewselettiva... sei sicura di interrogare la tabella giusta?
poi per "possa essermi utile questa variabile $output, non mi vengono in mente altre idee" guarda quello che ti ho postato.
ho notato ora che l'array con i nomi dei campi l'hai chiamato $temp quindi nell $row[$campi[$j]] devi mettere $row[$temp[$j]]
per sicurezza posta il dump della tabella viewselettiva
 
ciao, tra il res e il fetch non c'è nulla che non ho postato, rimetto il codice qui:
PHP:
<?php
 $matricola=$_POST['redattore'];
$wh="";
if(!empty($matricola)){
    $wh=" WHERE redattore='".$matricola."'";//se $matricola è un numero intero gli apici non ci vogliono
}
if(is_array($_POST['fields'])){
   $campi=implode(", ",$_POST['fields']);
   echo "i campi selezionati sono: " .$campi."<br/>"; //istruzione poi da cancellare, è stata scritta solo per vedere se visualizzo correttamente i nomi dei campi selezionati
   $temp=explode(",", $campi); //questa istruzione è stata fatta per contare il numero dei campi altrimenti non sapevo come fare
   $ncampi=count($temp);//ottengo il numero dei campi selezionato
   echo "numero campi selezionati ".$ncampi."<br/>"; //istruzione poi da cancellare
}else{
    $campi="*";
}
$query= "SELECT $campi FROM viewselettiva $wh";
var_dump($query);
$res=mysql_query($query);
var_dump($res);
$output=""; //serve per stampare la tabella finale con i risultati
echo "<p><table align=\"center\" width=\"80%\" border=\"1\">";
   echo "<tr>";
   for ($i=0; $i<$ncampi; $i++){
       echo "<th align=\"center\"><strong>".$temp[$i]."</strong></th>"; //visualizzo i nomi dei campi selezionati e li formatto ognuno in una colonna
   }
   echo"</tr>";
   $j=0; // da qui non so cosa sbaglio, vorrei "scorrere" campo per campo ogni record trovato e visualizzarlo nelle apposite righe e colonne.
   while ($row=mysql_fetch_assoc($res)){
       if ($j==0) {
           $output .="<tr>";
       }
       $output.="<td>".$row[$temp[$j]]."</td>";
       if ($j==($ncampi-1)) {
           $output.="</tr>";
           $j=0;
       }
       else {
            $j++;
        }
   }
   echo $output;
   echo "</table>";
 ?>

il risultato del var_dump è questo: string(120) "SELECT Tipologia, Nome, Porzioni, Calorie, Tempo, Difficolta, Note, Preparazione FROM viewselettiva WHERE redattore='3'" resource(7) of type (mysql result)
infatti la tabella che mi viene mostrata come risultato illustra il nome della tipologia (contorno) e poi mostra due celle vuote in corrispondenza di Nome e Porzioni, ossia mi da due errori entrambi sull'istruzione $output.="<td>".$row[$temp[$j]]."</td>"; gli errori sono questi:
Notice: Undefined index: Nome
Notice: Undefined index: Porzioni

in compenso ho notato che se per esempio seleziono solo la tipologia non mi segnala nessun errore e mi mostra la tabella con la sola colonna tipologia e i record con i nomi della tipologia. Quindi funge se seleziono solo una singola colonna. Se ne seleziono già più di un checkbox non funziona più.
 
ciao
Notice: Undefined index: Nome
Notice: Undefined index: Porzioni
verifica l'esatta corrispondenza tra il nome nell'array e il nome del campo in tabella
prova questo stupidissimo script
PHP:
<?php
//qui dati di connessione
$query="SELECT Tipologia, Nome, Porzioni, Calorie, Tempo, Difficolta, Note, Preparazione FROM viewselettiva WHERE redattore='3";
$ris=mysql_query($query);
while($riga=mysql_fetch_assoc($ris)){
   
    echo $riga['Tipologia']."<br>";
    echo $riga['Nome']."<br>";
    echo $riga['Porzioni']."<br>";
    echo $riga['Calorie']."<br>";
    echo $riga['Tempo']."<br>";
    echo $riga['Difficolta']."<br>";
    echo $riga['Note']."<br>";
    echo $riga['Preparazione']."<br>";
}
?>
lo lanci e vedi se a qualcuno dei campi ti da e dove
Notice: Undefined index:.....
i casi sono due o è sbagliato il nome nell'array o il nome del campo, comunque non corrispondono esattamente
 
Buongiorno, ho verificato l'esatta corrispondenza tra il nome (che sarebbe quello dopo il value = "xxx", o quello dopo name="xxx" ?) nell'array e il nome del campo nella tabella a me sembrano coincidere, ora metto pure la foto così controlli pure tu (chissà mi sfugge qualcosa). Ho fatto la prova dello script ma mi dà il seguente errore: mysql_fetch_assoc() expects parameter 1 to be resource.
 

Allegati

  • img.jpg
    img.jpg
    209,7 KB · Visite: 482

Discussioni simili